2010-04-16 13 views
3

J'ai un programme qui gère les tableaux d'octets en Java, et maintenant je voudrais écrire cela dans un fichier XML. Cependant, je ne suis pas sûr de la façon dont je peux convertir le tableau d'octets suivant en une chaîne sensible pour écrire dans un fichier. Si l'on suppose qu'il était des caractères Unicode je tentais le code suivant:Convertir un tableau d'octets en chaîne compréhensible

String temp = new String(encodedBytes, "UTF-8"); 

seulement pour avoir le spectacle débogueur que les encodedBytes contiennent "\ufffd\ufffd ^\ufffd\ufffd-m\ufffd\ufffd\/ufffd \ufffd\ufffdIA\ufffd\ufffd". La chaîne doit contenir un hachage au format alphanumérique.

Comment devrais-je transformer la chaîne ci-dessus en une chaîne sensible pour la sortie?

+0

"inintelligibles" ou "sensible" à qui? Est-ce que l'objectif est de produire un message de sorte qu'un humain puisse comprendre les valeurs ou est-ce que le but est de le produire dans un format qui peut être relu et transformé en un tableau d'octets? –

+0

Serait sérialisation (Arrays en Java sont sérialisables) travail? Voir par exemple http://www.rgagnon.com/javadetails/java-0470.html – Searles

+0

@Bert F: Par souci d'arguments, disons que la sortie lisible par l'homme est "2jvjsgjlgj39hg9". Je voudrais convertir la chaîne dans la question à cette chaîne afin qu'elle puisse être lue par des humains et stockée. –

Répondre

7

Si votre chaîne est la sortie d'un schéma de hachage de mot de passe (ce qui semble être le cas) alors je pense que vous aurez besoin de coder en Base64 pour le mettre en texte brut.

La procédure standard, si vous avez des octets bruts que vous souhaitez exporter dans un fichier texte, est d'utiliser le codage Base 64. La bibliothèque Commons Codec fournit un encodeur/décodeur Base64 à utiliser.

Espérons que cela aide.

+0

C'est une très bonne réponse. –

+0

Recommandez au demandeur de créer un attribut pour cet élément afin d'indiquer le codage (avec une valeur par défaut dans la DTD ou le schéma, vous n'avez donc pas besoin de le spécifier dans le document). –

+0

Oui, c'est un hachage. Je jetterai un coup d'oeil sur les trucs de Commons Codec bientôt. Je suppose que vous venez de télécharger les pots et de les implémenter dans votre projet? –

10

Le tableau d'octets ne ressemble pas à UTF-8. Notez que \ufffd (nommé REPLACEMENT CHARACTER) est "used to replace an incoming character whose value is unknown or unrepresentable in Unicode."

Addendum: Voici un exemple simple de comment cela peut se produire. Lorsqu'il est converti en byte, le point de code pour ñ n'est ni UTF-8 ni US-ASCII; mais est valide ISO-8859-1. En effet, vous devez savoir ce que les octets représentent avant de pouvoir les encoder en String.

public class Hello { 

    public static void main(String[] args) 
      throws java.io.UnsupportedEncodingException { 
     String s = "Hola, señor!"; 
     System.out.println(s); 
     byte[] b = new byte[s.length()]; 
     for (int i = 0; i < b.length; i++) { 
      int cp = s.codePointAt(i); 
      b[i] = (byte) cp; 
      System.out.print((byte) cp + " "); 
     } 
     System.out.println(); 
     System.out.println(new String(b, "UTF-8")); 
     System.out.println(new String(b, "US-ASCII")); 
     System.out.println(new String(b, "ISO-8859-1")); 
    } 
} 

Sortie:

 
Hola, señor! 
72 111 108 97 44 32 115 101 -15 111 114 33 
Hola, se�or! 
Hola, se�or! 
Hola, señor!