2011-12-28 9 views
13

J'utilise le code ci-dessous pour convertir octet chaîne:Convertir octet à chaîne en Java

System.out.println("string " + Byte.toString((byte)0x63)); 

Pourquoi imprimer "string 99". Comment modifier pour laisser imprimer "chaîne c"?

+0

Il est impossible de * simplement * convertir un octet en chaîne.[Vous devez utiliser un codage de caractères] (http://stackoverflow.com/questions/10611455/what-is-character-encoding). – Raedwald

Répondre

13

La cteur chaîne convient à cette conversion:

System.out.println("string " + new String(new byte[] {0x63})); 
+0

@Downvoter des commentaires? – Matten

+1

Parce que la réponse de gustafc a un point très important: Le constructeur String (byte []) utilise le codage par défaut du système pour convertir le tableau d'octets en caractères String. Il ne faut pas supposer qu'une valeur d'octet 0x63 est mappée à la lettre 'c'. Par exemple, en UTF-16, la lettre 'c' est représentée par 2 octets de codage, pas un. Cet article de blog développe ceci: http://www.joelonsoftware.com/articles/Unicode.html – tbacker

3

Vous pouvez utiliser printf:

System.out.printf("string %c\n", 0x63); 

Vous pouvez ainsi créer une chaîne avec une telle mise en forme, en utilisant String#format:

String s = String.format("string %c", 0x63); 
+0

Peut-il convertir en chaîne? – brian

+0

Oui, voir mon édition – MByD

32
System.out.println(new String(new byte[]{ (byte)0x63 }, "US-ASCII")); 

Notez en particulier que la conversion des octets en chaînes toujours implique un codage. Si vous ne le spécifiez pas, vous utiliserez l'encodage par défaut de la plate-forme, ce qui signifie que le code peut se casser lors de l'exécution dans des environnements différents.

+2

+1 pour mentionner le codage –

+10

Pour éviter le 'UnsupportedEncodingException' vérifié lancé par ce constructeur, vous voudrez probablement passer en [' StandardCharsets.US_ASCII'] (http://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html#US_ASCII) au lieu d'utiliser le nom du jeu de caractères. – gustafc

2

Vous devez construire une nouvelle chaîne dans un tableau d'octets. Le premier élément de votre byteArray doit être 0x63. Si vous souhaitez ajouter d'autres lettres, rendez le byteArray plus long et ajoutez-les aux indices suivants.

byte[] byteArray = new byte[1]; 
byteArray[0] = 0x63; 

try { 
    System.out.println("string " + new String(byteArray, "US-ASCII")); 
} catch (UnsupportedEncodingException e) { 
    // TODO: Handle exception. 
    e.printStackTrace(); 
} 

Notez que spécifier l'encodage finira par jeter un UnsupportedEncodingException et vous devez gérer cela en conséquence.

1

Si c'est un seul octet, juste jeté le byte à un char et il devrait travailler à être bien dire donner une entité char correspondant à la valeur codepoint de l'octet donné. Sinon, utilisez le constructeur String comme mentionné ailleurs.

char ch = (char)0x63; 
System.out.println(ch); 
3

vous pouvez utiliser

l'équivalent de caractères à 0x63 est 'c', mais l'octet équivalent à c'est 99

System.out.println("byte "+(char)0x63); 
9

Utiliser caractère au lieu de l'octet:

System.out.println("string " + (char)0x63); 

Ou si vous voulez être un puritan Unicode, vous utilisez des points de code:

System.out.println("string " + new String(new int[]{ 0x63 }, 0, 1)); 

Et si vous aimez le vieux skool US-ASCII "chaque octet est un caractère" idée:

System.out.println("string " + new String(new byte[]{ (byte)0x63 }, 
              StandardCharsets.US_ASCII)); 

Évitez d'utiliser le constructeur String(byte[]) recommandé dans d'autres réponses; il repose sur le jeu de caractères par défaut. Des circonstances peuvent survenir où 0x63 n'est pas le caractère c.

1
String str = "0x63"; 
int temp = Integer.parseInt(str.substring(2, 4), 16); 
char c = (char)temp; 
System.out.print(c); 
Questions connexes