2017-08-28 58 views
2

我遇到了如何在不破坏数据的情况下处理字节数据的问题。这里是我的代码如何在不破坏数据的情况下处理字节流

... 
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(); 
... 

这里看起来没什么问题。但是,如果我有一个十六进制字符串像

F8 F0 F0 C2 20 00 00 80 00 00 

C2一些数据会变成3F。我可以在我的日志&远程服务器的日志中看到这一点。

起初,我怀疑它会溢出。但由于这些数据将被视为十六进制字符串并发送到另一台服务器,因此这种怀疑将被越过。

我不知道这件事发生了什么,所以如果有人知道这个问题,我真的可以使用一些帮助。

回答

3

现在您正在使用平台默认字符集将字节转换为String,然后稍后再调用getBytes()。如果该字节在该字符集中不代表有效的字符串,则数据将丢失,例如,无效字节将被替换为字符'?'

停止。如果你有字节,将它们作为byte[]传递给它们。不要将它们转换成String

+0

啊,你是对的!我的其他测试字符串正确传递它,所以我认为我的代码没有错。 – Kaninchen

相关问题