2017-08-28 8 views
2

J'ai un problème de gestion des données d'octet sans les corrompre. Voici mon codeComment gérer le flux d'octets sans corrompre les données

... 
byte[] b = new byte[1000]; 

// read input stream 
BufferedInputStream inData = new BufferedInputStream(socket.getInputStream()); 
int length = inData.read(b); 

String data = new String(b, 0, length); 
if (Log4j.log.isEnabledFor(Level.INFO)) { 
    Log4j.log.info("Data Length: " + length 
      + ", Received data: " + data); 
} 

... 
// start a new socket to other server 
... 
BufferedOutputStream out = new BufferedOutputStream(remote.getOutputStream()); 

out.write(data.getBytes()); 
out.flush(); 
... 

Cela ne semble pas poser de problème ici. Mais si je suis une chaîne hexagonale comme

F8 F0 F0 C2 20 00 00 80 00 00 

quelques données comme C2 seront transformées en 3F. Je pouvais voir cela dans mon journal & journal du serveur distant aussi. Dans un premier temps, je soupçonne que ce sera le débordement. Mais puisque ces données seront traitées comme Hex String et envoyées à un autre serveur, ce soupçon sera croisé. Je n'ai pas la moindre idée de ce qui se passe à ce sujet, donc je pourrais vraiment utiliser de l'aide si quelqu'un sait à propos de ce problème.

Répondre

3

Actuellement, vous convertissez les octets en String avec le jeu de caractères par défaut de la plate-forme, puis en appelant getBytes() ultérieurement. Si les octets ne représentent pas une chaîne valide dans ce jeu de caractères, les données seront perdues, par ex. les octets invalides seront remplacés par le caractère '?'.

Arrêtez cela. Si vous avez des octets, passez-les en byte[]. Ne les convertissez à aucun moment en String.

+0

Ah, vous avez raison! mon autre chaîne de test l'a passé correctement, donc j'ai pensé que mon code n'avait rien de mal. – Kaninchen