如何在不破坏数据的情况下处理字节流

时间:2017-08-28 17:26:48

标签: java string byte serversocket

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

...
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。我可以在我的日志中看到这个远程服务器的日志也是如此。

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

我不清楚这是怎么回事,所以如果有人知道这个问题我真的可以帮忙。

1 个答案:

答案 0 :(得分:3)

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

停止。如果您有字节,请将它们作为byte[]传递。不要在任何时候将它们转换为String