如何在不破坏数据的情况下处理字节流
How to handle byte stream without corrupting data
我遇到了如何在不损坏字节数据的情况下处理字节数据的问题。这是我的代码
...
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
。我也可以在我的日志和远程服务器的日志中看到这个。
起初,我怀疑它会溢出。但由于这些数据将被视为 Hex String 并发送到另一台服务器,因此这种怀疑将被消除。
我不知道这是怎么回事,所以如果有人知道这个问题,我真的可以提供一些帮助。
现在您正在将字节转换为具有平台默认字符集的 String
,然后稍后调用 getBytes()
。如果字节不代表该字符集中的有效字符串,则数据将丢失,例如无效字节将替换为字符 '?'
.
别这样了。如果你有字节,将它们作为 byte[]
传递。任何时候都不要将它们转换成 String
.
我遇到了如何在不损坏字节数据的情况下处理字节数据的问题。这是我的代码
...
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
。我也可以在我的日志和远程服务器的日志中看到这个。
起初,我怀疑它会溢出。但由于这些数据将被视为 Hex String 并发送到另一台服务器,因此这种怀疑将被消除。
我不知道这是怎么回事,所以如果有人知道这个问题,我真的可以提供一些帮助。
现在您正在将字节转换为具有平台默认字符集的 String
,然后稍后调用 getBytes()
。如果字节不代表该字符集中的有效字符串,则数据将丢失,例如无效字节将替换为字符 '?'
.
别这样了。如果你有字节,将它们作为 byte[]
传递。任何时候都不要将它们转换成 String
.