今天在工作中,用udp进行网络通信的时候,client端接收数据后,为了检验正确性,把byte[]转换成十六进制字符串打印。但输出的十六进制字符串中除了server端发送的内容外,后面还有很多的0。
例:
本来的结果应该是:
61616161616101000000D8010F00000069703B63656C6C69643B6273736964
转换后的结果却是:61616161616101000000D8010F00000069703B63656C6C69643B62737369640000000000000000000000000000000000000000……
后来查找发现:原来 是写的转换方法有问题。
public static String bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
这个转换方法里,是直接用b的长度来实现的。但是在udp接收数据时,可能一次接到的数据长度达不到定义的buffer长度。但在转换的时候却是直接用byte[]长度来访问的。所以导致把接到的数据后面的空的也转换出来,用0填补。把方法改成下面的之后,就可以。
/*
*byte[] :要转换的byte数组
*int: 要转换的byte数组的长度
*/
public static String bytes2HexString(byte[] b,int len) {
String ret = "";
for (int i = 0; i < len; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
转换的时候要按byte[]的实际长度。
以上仅作笔记。