2011-11-15 6 views
1

Je passe toute la journée à essayer de trouver la réponse, donc finalement j'écris ici. Je crypte une chaîne avec une classe crypto et j'obtiens un octet []. Je dois convertir cet octet en chaîne avec tostring(), à télécharger dans un site Web. J'ai besoin d'obtenir cette chaîne, décrypte et récupère la chaîne d'origine. Mon problème concerne getBytes, qui ne renvoie pas le même octet [] à décrypter.Méthode chaîne à octet

J'ai besoin de convertir la chaîne d'origine en byte [], encrypt, obtenir l'octet [] qui retourne, convertir en chaîne puis, cette chaîne convertir en byte [] et obtenir le même octet [] encrypted.

J'essaye tout ce que j'avais à l'esprit. J'ai besoin d'une méthode qui avec une chaîne, retourne toujours le même octet [] et getbytes ne le fait pas.

ajouter un exemple:

 String s2="this is an example"; 
     byte[] b1=s2.getBytes("UTF-8"); 
     byte[] b2=s2.getBytes("UTF-8"); 
     System.out.println("Byte s:"+b1); 
     System.out.println("Byte s:"+b2); 

Il y a une méthode à partir d'une chaîne donne le même octet []? Avec getBytes (au moins chez moi) j'obtiens deux octets différents []. Merci.

+0

Désolé, mais votre question est très difficile à suivre, probablement parce que l'anglais n'est pas votre langue maternelle. Pouvez-vous poster un code montrant ce que vous faites et ce que vous sortez n'est pas ce que vous voulez? –

+0

Quel jeu de caractères utilisez-vous lors du décodage de byte [] en String et quel charset utilisez-vous lors de l'encodage de String à byte []? Vous devez utiliser le même jeu de caractères pour les deux ou vous ne pouvez pas obtenir l'octet original []. –

+0

Ce n'est pas ma langue maternelle, désolé. Je poste un exemple sur mon problème. Si j'écris ceci: Chaîne s = "ceci est un exemple"; octet [] b1 = s.getBytes ("UTF-8"); octet [] b2 = s.getBytes ("UTF-8"); System.out.println ("Octets s:" + b1); System.out.println ("Octet s:" + b2); J'obtiens deux octets différents. J'ai besoin de quelque chose que pour une chaîne j'obtiens un byte [], une relation symétrique byte [] -> String -> byte [] avec les deux octets égaux. J'ai essayé tout le jeu de caractères, par défaut, UTF-8 ... et je me suis soucié de coder et de décoder avec le même. Merci à vous deux. – Jmm

Répondre

2

Vous devez utiliser String#getBytes(charsetName) qui prend un codage de caractères spécifique.

byte[] bytes = string.getBytes("UTF-8"); 
// ... 

Ensuite, pour reconstruire la chaîne, vous devez utiliser le constructeur String(bytes, charsetName) qui prend un codage de caractères spécifique. Dans le cas contraire, le codage de caractères par défaut de la plateforme sera utilisé pour décoder les caractères de la chaîne en octets. Le codage de caractères par défaut de la plateforme n'est pas nécessairement le même sur toutes les plates-formes. Une plate-forme peut utiliser UTF-8 tandis que l'autre plate-forme utilise CP1252 ou ISO-8859-1, par exemple.

Vous pouvez également utiliser Base64 pour encoder/décoder les octets dans une chaîne compatible US-ASCII afin qu'il soit compatible avec pratiquement tous les caractères décents connus dans le monde entier.

+0

J'ai essayé cette méthode getBytes et j'ai le problème que j'ai dit. Je vais essayer base64, merci. – Jmm

+0

Ensuite, votre problème est causé ailleurs et probablement pas résolu par Base64. Il est impossible d'identifier la cause de votre problème sans un SSCCE de votre côté. Ma meilleure estimation serait que la chaîne est à son tour écrite sur le réseau en utilisant le mauvais encodage. Peut-être utilisiez-vous un 'Writer' sans l'avoir enveloppé dans' OutputStreamWriter' ou sans écrire 'string.getBytes (" UTF-8 ")' dans 'OutputStream'. – BalusC

2

je dois convertir cet octet dans la chaîne avec toString(), à télécharger dans une bande

Non, vous ne le faites pas. Vous pouvez télécharger des octets très bien, et en fait les octets sont la seule chose que vous pouvez envoyer via HTTP. À un certain point, votre chaîne sera convertie en octets, alors pourquoi ne pas ignorer les conversions supplémentaires qui ne corrompent que vos données?

+0

Parce qu'il est spécifié par la bibliothèque, j'utilise le téléchargement avec une chaîne. – Jmm

1

Avez-vous essayé de recréer la chaîne et de récupérer les octets en spécifiant explicitement l'encodage?

final String newString = new String(bytes, utf8_charset); 
final byte[] bytes = oldString.getBytes(utf8_charset); 
0

Le problème peut se produire car JDK est incapable de reconnaître correctement le jeu de caractères. Utilisez la déclaration:

public byte[] getBytes(String charsetName) 

pour spécifier le jeu de caractères à utiliser. Cela peut aider. Je ne vois pas d'autre raison pour laquelle il retournerait un tableau d'octets différent.

2

Est-il possible d'omettre la conversion en chaîne? Je veux dire, vous pouvez envoyer l'octet [] et recevoir l'octet [].Ou vous pouvez encoder l'octet [] en utilisant base64 (qui produit une série de caractères imprimables), l'envoyer en tant que chaîne, puis le décoder à partir de la base 64 et obtenir l'octet original [].

+0

Il n'est pas possible d'omettre la conversion car j'utilise une bibliothèque pour télécharger l'information et il faut une chaîne. A propos de l'encodage de l'octet [] en utilisant base64 je n'ai pas essayé, peut-être que cela fonctionne. Merci – Jmm

3

Vous méprendre sur la ligne suivante

System.out.println("Byte s:"+b1); 

Ici, nous appelons implicitement la méthode toString() sur le tableau d'octets. Cela ne pas retourner le contenu de la matrice. Utilisez à la place:

System.out.println("Byte s:" + java.util.Arrays.toString(b1)); 

Ceci vous montrera le contenu du tableau d'octets que vous pouvez utiliser pour votre comparaison.

Votre utilisation de la méthode String.getBytes(String) est correcte. Il renvoie deux tableaux d'octets différents instances mais les deux ont le même contenu.

@Test 
public void testGetBytes() throws Exception { 
    String s2 = "this is an example"; 

    byte[] b1 = s2.getBytes("UTF-8"); 
    byte[] b2 = s2.getBytes("UTF-8"); 

    Assert.assertEquals(b1, b2); 
} 
Questions connexes