2011-11-04 3 views
0

Comment puis-je convertir valeurs ASCII en valeurs hexadécimales et binaires (pas leur représentation en ASCII)? Par exemple, comment puis-je convertir la valeur décimale 26 en 0x1A?Comment faire pour convertir ASCII en Hex

Jusqu'à présent, je l'ai essayé de convertir en procédant comme suit (voir ci-dessous pour le code réel):

  1. valeur Conversion en octets
  2. Conversion chaque octet int
  3. Conversion chaque int en hexadécimal , via String.toString(intValue, radix)

note: J'ai posé une question connexe sur writing hex values to a file.

Code Clojure:

(apply str 
    (for [byte (.getBytes value)] 
    (.replace (format "%2s" (Integer/toString (.intValue byte) 16)) " " "0"))))) 

code Java:

Byte[] bytes = "26".getBytes(); 
for (Byte data : bytes) { 
    System.out.print(String.format("%2s", Integer.toString(data.intValue(), 16)).replace(" ", "0")); 
} 
System.out.print("\n"); 

Répondre

8

Hexadécimal, décimal, et des entiers binaires ne sont pas des choses différentes - il n'y a qu'une seule représentation sous-jacente d'un nombre entier. La seule chose que vous avez essayé d'éviter - "la représentation en chaîne ASCII" - est la seule chose qui soit différente. La variable est toujours la même, c'est juste comme ça que vous l'imprimez. Maintenant, ce que vous essayez de faire n'est pas clair à 100 p. 100 pour moi. Mais compte tenu de ce qui précède, le chemin est clair: si vous avez un String, convertissez-le en int en analysant (c'est-à-dire en utilisant Integer.parseInt()). Ensuite, si vous voulez l'imprimer sous un certain format, il est facile d'imprimer ce int comme vous voulez en utilisant, par exemple, les prescripteurs de format printf.

+0

"printf" Il est intéressant de noter que Java n'a pas printf – luiscubal

+5

@luiscubal: depuis 5 jdk il le fait, il est une méthode sur java.io.PrintStream. –

+0

@Ari Non, le nombre 20 dezimal EST identique à 14 en hexadécimal ou 00010100 en binaire. Vous ne pouvez représenter textuellement ce nombre que dans une base arbitraire.Je ne suis toujours pas sûr de ce que votre objectif réel est - voulez-vous écrire la représentation de la chaîne dans le fichier ou le numéro dans un fichier binaire? Edit: Commentaire a disparu en écrivant ceci, oh wel. – Voo

1
static String decimalToHex(String decimal, int minLength) { 
    Long n = Long.parseLong(decimal, 10); 
    // Long.toHexString formats assuming n is unsigned. 
    String hex = Long.toHexString(Math.abs(n), 16); 
    StringBuilder sb = new StringBuilder(minLength); 
    if (n < 0) { sb.append('-'); } 
    int padding = minLength - hex.length - sb.length(); 
    while (--padding >= 0) { sb.append('0'); } 
    return sb.append(hex).toString(); 
} 
3

Si vous voulez réellement des chaînes hexadécimaux, alors (format "%02X" n) est beaucoup plus simple que les cerceaux que vous sauter à travers dans votre premier essai. Si ce n'est pas le cas, écrivez simplement les valeurs entières directement dans un fichier sans essayer de les convertir en chaîne.

Quelque chose comme (.write out (read-string string-representing-a-number)) devrait suffire.

1

Voici vos trois étapes roulées dans une ligne de Clojure:

(apply str (map #(format "0x%02X " %) (.getBytes (str 42)))) 
  • Convertir en octets (.getBytes (str 42))
  • pas besoin réel pour l'étape 2
  • converti chaque octet à une chaîne de caractères le représentant en hexadécimal

ou vous pouvez le faire ressembler plus à vos pas avec le "thread last" macro

(->> (str 42)     ; start with your value 
    (.getBytes)     ; put it in an array of bytes 
    (map #(format "0x%02X " %)) ; make hex string representation 
    (apply str))    ; optionally wrap it up in a string