[JAVA] mystere de conversion string - byte[ ]

[JAVA] mystere de conversion string - byte[ ] - Java - Programmation

Marsh Posté le 10-03-2010 à 19:31:58    

Bonjour,
Je me trouve face a un probleme de conversion : je souhaite transferer des fichiers d'une machine a une autre, et pour cela je dois couper mon fichier en plusieurs morceaux : bref il me faut recuperer des tableaux de byte (correspondant a des parties du fichier), a les convertir en string pour les envoyer, puis les reconvertir dans l'autre sens pour les recuperer. Et voici un test que j'ai fais et que je trouve vraiment bizarre  :
 
byte[][] tab;
...
System.out.println("Send : \n" + tab[cpt] + "\n" + new String(tab[cpt]).getBytes());
...
 et voici ce que m'affiche le system :
Send :  
[B@1fb8ee3
[B@61de33
 
 
 
N'est ce pas etrange ? ne devrais-je pas avoirla meme chose dans les 2 cas ?
Cela me pose un pb vu que les bytes ne semblent etre les meme si je converti 2 fois ou si je ne convertie pas.
Quelqu'un peut meclairer sur ce mystere ?
merci d'avance
cordialement,

Reply

Marsh Posté le 10-03-2010 à 19:31:58   

Reply

Marsh Posté le 11-03-2010 à 11:02:30    

C'est normal que tu ais des affichage différent. Ce qui est affichier n'est pas le contenu de tes tableaux mais leur adresse mémoire.

 

Si tu veux afficher le contenu il faut utiliser Arrays.toString(byte[])

 
Code :
  1. byte[][] tab;
  2. ...
  3. System.out.println("Send : \n" + Arrays.toString(tab[cpt]) + "\n" + Arrays.toString(new String(tab[cpt]).getBytes()));
  4. ...
 

Sinon, je te conseille d'utiliser le constructeur new String(byte[] bytes, String charsetName)
Sinon, si le charset par défaut est différent sur tes 2 machines tu risque d'avoir des résultats différents.

 

EDIT : au fait, pourquoi tu as besoin de passer par des String ? Quel mécanisme utilise-tu pour le transfert ?


Message édité par Bidem le 11-03-2010 à 11:06:10
Reply

Marsh Posté le 11-03-2010 à 18:18:54    

Bonjour et merci de me repondre !
J'utilise UDP et envoi de datagramPacket pour transferer mes fichiers. On est d'accord que vu que les paquets contiennent des tableaux de bytes, il n'y a aucun interet a traduire mon fichier en string, puis de nouveau en byte. Seulement je veu ajouter au début de mon paquet un "en tete" specifique pour indiquer a quoi correspond mon pauet, par exemple de la forme "req_data nameFile length data" avec nameFile le nom de mon fichier, length sa longeur, et data ben justement le tableau de byte correspondant au fichier ^^
Existe-t-il un moyen plus simple ?
Merci !
 
EDIT : au fait je pose cette question car mon transfert de fichier marche parfaitement avec des fichiers txt, mais pas avec des autres types (image, video, son ...). Quelqu'un a une idée de comment cela se fait ? SI ça marche pr un fichier, pourquoi ça ne marcherai pas pr un autre type ?
 
bien cordialement,

Reply

Marsh Posté le 12-03-2010 à 02:03:00    

Je pense que le plus simple reste encore de définir une taille fixe pour ton entête (prévoir suffisamment de place pour toutes les infos que tu veux mettre). ensuite tu mets ton fichier binaire.
 
L'autre solution est de définir un séparateur contenant une suite de caractères qui ne peuvent pas apparaitre dans ton entête et à la réception il te suffit de chercher ce séparateur : tout ce qui se trouve avant, c'est l'entête et tout ce qu'il y a près c'est ton fichier.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed