socket客户端接收服务端发来的数据时,发现老有efbfbd乱码,如下图,服务端发送的是02040200013CF0,但是客户端接收到解析后却不一样
客户端接收解析并打印
在网上查原因后,原因是将接收的byte数组转换为String后,默认转换为了UTF-8格式,但是后面字节数不够出现了乱码,所以导致解析错误
对代码进行修改,接收的byte数组不转换为String,逐个字节进行接收并转换,然后拼接,结果是正确的,问题解决
InputStream in = socket.getInputStream();
int a = 0;
byte[] buffer = new byte[1024];
int len = in.read(buffer);
String hexString = "";
for(int i = 0;i < len;i++){
hexString += HexUtil.encodeToString(new byte[]{buffer[i]});
}
System.out.println("Client received: " + hexString);
上面的程序需要对逐个字节进行接收并转换,再拼接,效率比较低,可以再优化。这样优化的前提是需要知道接收的数据有多少个字节,在初始化字节数组时,就需要初始化大小。设置1024也可以,不过转换后,会有很多没用的内容,需要再截取。
InputStream in = socket.getInputStream();
int a = 0;
byte[] buffer = new byte[7];
int len = in.read(buffer);
String hexString = HexUtil.encodeToString(buffer);
System.out.println("Client received: " + hexString);