Partage
  • Partager sur Facebook
  • Partager sur Twitter

Conversion de tableau de byte[] en string

21 janvier 2018 à 13:02:03

Bonjour à tous,

J'ai un problème sur la conversion d'une string en byte[] et inversement.

String mess = "abcd";

byte messBytes[] = mess.getBytes();
System.out.println(messBytes);
	
String messLook = new String(messBytes);
		
byte a[] = messLook.getBytes();
System.out.println(a);
		
System.out.println(new String(a));

me done

[B@55f96302
[B@3d4eac69
abcd

Déjà je ne comprend pas pourquoi il y a deux "[B@..." différents et qu'ils n'ont pas la même valeur mais cela me donne bien la même string à la fin donc pas de problème.

Deuxièmement, le code :

String mess = "abcd";
byte b[] = rsa.chiffrer(mess.getBytes());
b = rsa.dechiffrer(b);
System.out.println(new String(b));

me done :

abcd

Donc pas de problème au niveau de mon cryptage RSA.

Mais j'ai un problème quand je fais les deux en même temps :

String mess = "abcd";
byte messLook[] = rsa.chiffrer(mess.getBytes());
String strMessLook = new String(messLook);
byte messUnlook[] = rsa.dechiffrer(strMessLook.getBytes());
System.out.println(new String(messUnlook));

me done :

Exception in thread "main" java.lang.NegativeArraySizeException
	at one.RSA.dechiffrer(RSA.java:174)
	at one.Principale.main(Principale.java:14)

Là je ne comprend absolument pas pourquoi.

Si vous pouviez m'aider, je vous en serai très reconnaisant.

Merci par avence,

Alexandre







  • Partager sur Facebook
  • Partager sur Twitter
21 janvier 2018 à 13:12:26

Bonjour,

Dans la classe String, regarde les méthodes qui prennent ou retournent des byte[].

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

  • Partager sur Facebook
  • Partager sur Twitter
21 janvier 2018 à 13:41:42

Désolé mais il n'y a pas d'autres méthodes que getByte[]...

et si vous ne comprenez pas mon explication, veuillez le signaler svp

Enfaite le problème est vraiment quand le converti le tableau de bytes cryptées et quand je les remets dans un tableau de bytes. Je ne sais pas à quoi cela est dû...

-
Edité par LoupDeLaJungle 21 janvier 2018 à 13:47:03

  • Partager sur Facebook
  • Partager sur Twitter
21 janvier 2018 à 15:05:32

"""Déjà je ne comprend pas pourquoi il y a deux "[B@..." différents et qu'ils n'ont pas la même valeur mais

cela me donne bien la même string à la fin donc pas de problème."""

C'est normal car :

byte messBytes[] = mess.getBytes(); // un object à une première adresse

byte a[] = messLook.getBytes();     // un deuxième objet, à une seconde adresse

Deux objets distincts, peut-être que leur contenu est le même, peut-être pas. Mais en tout cas ils ne sont pas au même endroit en mémoire.

Pour ton problème: ton chiffrage RSA prend en entrée un byte [] puis le modifie. On ne peut pas créé une String cohérente à partir d'un byte [], sauf si ce byte[] a été obtenue à partir d'un String.getBytes(). Or ici, tu a modifié ton byte[] donc il ne correspond plus à une chaîne de caractères.

Il faut faire:

String mess = "abcd";
byte chiffre[] = rsa.chiffrer(mess.getBytes());
byte enClair[] = rsa.dechiffrer(chiffre);
System.out.println(new String(enClair));

Hmm, l'éditeur openclassroom...

-
Edité par PyJav 21 janvier 2018 à 15:07:47

  • Partager sur Facebook
  • Partager sur Twitter
22 janvier 2018 à 9:19:54

Oui oui cela marche très bien comme ça, mais moi je veux qu'entre temps on puisse copier coller le texte chiffré, c'est pour celà que je le converti en String en milieu de procédure.

  • Partager sur Facebook
  • Partager sur Twitter
22 janvier 2018 à 13:30:04

On ne peut pas. Un byte[] ne correspond pas forcément à une String.
  • Partager sur Facebook
  • Partager sur Twitter
23 janvier 2018 à 11:12:13

Ah d'accord, c'est bien ce que je pensais, donc du coup, comment je peux faire pour copier/coller ou transférer le byte[] crypté ? Car là je n'ai aucune idée...

Merci pour les réponses ça m'aide beaucoup.

  • Partager sur Facebook
  • Partager sur Twitter
23 janvier 2018 à 12:04:34

Il faut utiliser des Stream (OutputStream, ObjectOutputStream etc...), ils sont fait pour échanger de l'information binaire.

N'utilises pas de Reader ou de Writer qui ne deal qu'avec des caractères.

2/3 en Java ? Vraiment ?

-
Edité par PyJav 23 janvier 2018 à 12:06:02

  • Partager sur Facebook
  • Partager sur Twitter