2017-06-14 2 views
0

J'essaie de convertir un tableau d'octets en un String et en l'écrivant dans un fichier en utilisant PrintWriter (seulement pour vérifier sa valeur avec mc, j'ai besoin du contenu en String) Mon problème a résumé :Convertir un tableau d'octets en une chaîne

//-77 is "equivalent" to 179 or 0xb3 (i also tried those using ByteArrayOutputStream, where these are valid values) 
byte[] b = new byte[]{0,0,1,-77}; 

//I save the String to a txt, so i can check its value with midnight commander 
try( PrintWriter out = new PrintWriter("~/Desktop/output.txt")){ 
    out.println(new String(b)); 
} 

contenu de la sortie.txt comme hex avec mc: 00 00 01 EF | BF BD 0A
En dépit de ce devrait être: 00 00 01 B3

Quelles en sont les causes? Je suppose que c'est l'encodage, mais je ne sais pas quel type d'encodage devrais-je utiliser (j'ai essayé quelques types de Cp ###, mais aucun d'entre eux ne fonctionne à ce jour).

MISE À JOUR:
Chaque octet négatif converti en chaîne comme ceci résultera: EF BF BD
Il ne fonctionne que si la valeur d'octet non signé est inférieure à 128. La question est de savoir comment puis-je représenter un octet supérieur à 127 dans la chaîne comme je l'ai fait avec 0-127 octets?

+2

Vous devriez probablement encoder les octets, plutôt que d'essayer de les utiliser comme s'il s'agissait d'une chaîne. Vous ne devez utiliser 'new String (byte [])' que lorsque le tableau byte est un encodage valide d'une chaîne. – RealSkeptic

+0

HTTP peut gérer les octets. –

+0

Votre tableau d'octets est peut-être signé. Essayez d'utiliser l'octet unigned []. – Pickle

Répondre

2

Cela fera l'affaire. Il affichera 00 00 01 b3 comme prévu.

FileOutputStream fos = new FileOutputStream("filename"); 
fos.write(b); 
fos.close(); 
+0

Merci pour la réponse rapide, ça a vraiment fait l'affaire. Mais l'écrire sur un txt est juste à des fins de test, j'ai besoin de sa valeur en tant que chaîne. Y a-t-il quelque chose de similaire à FileOutputStream for String? Ou devrais-je simplement relire le contenu de txt-s? (Cela ne semble pas trop optimal) – leviathan11

+1

@ leviathan11 C'est une toute nouvelle question. Personne ne verra jamais comme un commentaire à une réponse à une question différente. – EJP

+0

C'était exactement ma question originale, mais comme c'est mon premier post sur stackoverflow, je ne pouvais pas vraiment le composer, donc ça a été modifié en erreur sur le sujet. – leviathan11