如何在不破坏数据的情况下处理字节流
问题描述:
我遇到了如何在不破坏数据的情况下处理字节数据的问题。这里是我的代码如何在不破坏数据的情况下处理字节流
...
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
。我可以在我的日志&远程服务器的日志中看到这一点。
起初,我怀疑它会溢出。但由于这些数据将被视为十六进制字符串并发送到另一台服务器,因此这种怀疑将被越过。
我不知道这件事发生了什么,所以如果有人知道这个问题,我真的可以使用一些帮助。
答
现在您正在使用平台默认字符集将字节转换为String
,然后稍后再调用getBytes()
。如果该字节在该字符集中不代表有效的字符串,则数据将丢失,例如,无效字节将被替换为字符'?'
。
停止。如果你有字节,将它们作为byte[]
传递给它们。不要将它们转换成String
。
啊,你是对的!我的其他测试字符串正确传递它,所以我认为我的代码没有错。 – Kaninchen