Java中String和byte[]互转问题
2017-07-28 17:11
260 查看
最近使用tlv协议传输数据,发现Java中的String存放二进制数剧是有问题的。代码如下:
输出结果为:
3,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,1,0,1,0,0,1,17,0,0,84,1,-128,97,97,97,97,97,
3,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,1,0,1,0,0,1,17,0,0,84,1,63,97,97,97,97,97,
可以看出用String构造函数生成的String,经过getBytes()函数后,得到的byte数组与之前的不一样。
所以当byte[]包含二进制数据时,不能用String构造函数将String转化为byte数组。
(如果是字符串经过getBytes()后得到的byte[],这样互转是没有问题的)
正确的方法应该是把byte[]转化为16进制字符串;
然后再逆转化,就可以得到原来的byte[]。
byte[]和16进制字符串互转代码:
主函数调用:
输出:
03350000000000000000000000000000000000000000200100010000011100005401806161616161
3,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,1,0,1,0,0,1,17,0,0,84,1,-128,97,97,97,97,97,
可以看出互转之后byte[]是没有问题的。
byte[] bytes ={3,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,1,0,1,0,0,1,17,0,0,84,1,-128,97,97,97,97,97}; for(int i=0; i<40; ++i){ System.out.print(bytes[i] + ","); } System.out.println(); String str = new String(bytes, 0 , bytes.length, "UTF-8"); byte[] bytes_t = str.getBytes();//这个byte[]与之前的不相同 for(int i=0; i<40; ++i){ System.out.print(bytes_t[i] + ","); }
输出结果为:
3,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,1,0,1,0,0,1,17,0,0,84,1,-128,97,97,97,97,97,
3,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,1,0,1,0,0,1,17,0,0,84,1,63,97,97,97,97,97,
可以看出用String构造函数生成的String,经过getBytes()函数后,得到的byte数组与之前的不一样。
所以当byte[]包含二进制数据时,不能用String构造函数将String转化为byte数组。
(如果是字符串经过getBytes()后得到的byte[],这样互转是没有问题的)
正确的方法应该是把byte[]转化为16进制字符串;
然后再逆转化,就可以得到原来的byte[]。
byte[]和16进制字符串互转代码:
/** * byte[]转化为16进制字符串 * @param src * @return */ public static String bytesToHexString(byte[] src){ StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } /** * 16进制字符串转化为byte[] * @param hexString * @return */ public static byte[] hexStringToBytes(String hexString) { if (hexString == null || hexString.equals("")) { return null; } hexString = hexString.toUpperCase(); int length = hexString.length() / 2; char[] hexChars = hexString.toCharArray(); byte[] d = new byte[length]; for (int i = 0; i < length; i++) { int pos = i * 2; d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); } return d; } private static byte charToByte(char c) { return (byte) "0123456789ABCDEF".indexOf(c); }
主函数调用:
String str_bin = bytesToHexString(bytes); System.out.println(str_bin); bytes = hexStringToBytes(str_bin); for(int i=0; i<40; ++i){ System.out.print(bytes[i] + ","); }
输出:
03350000000000000000000000000000000000000000200100010000011100005401806161616161
3,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,1,0,1,0,0,1,17,0,0,84,1,-128,97,97,97,97,97,
可以看出互转之后byte[]是没有问题的。
相关文章推荐
- Android 中 -Java中byte[]转String问题
- JAVA里面关于byte数组和String之间的转换问题
- [原]深入 JAVA里面关于byte数组和String之间的转换问题
- JAVA里面关于byte数组和String之间的转换问题
- JAVA关于byte数组与String转换的问题
- JAVA里面关于byte数组和String之间的转换问题
- Java中byte[]转String问题
- [Java]_[初级]_[utf8编码的byte[]数组转换为String时要注意的问题]
- Java byte数组转String字符集问题
- java中一些int,String,byte的转换问题
- 用java String类的getBytes(String charsetName)和String(byte[] bytes, String charsetName)解决乱码问题
- java中byte[]转换成String类型的问题
- [Java]_[初级]_[utf8编码的byte[]数组转换为String时要注意的问题]
- java中byte[]转换成String类型的问题
- 深入 JAVA里面关于byte数组和String之间的转换问题
- Android 中 -Java中byte[]转String问题
- Java中byte[]转String问题
- [Java]_[初级]_[utf8编码的byte[]数组转换为String时要注意的问题]
- Java中byte[]转String问题 丢失字节
- [原]深入 JAVA里面关于byte数组和String之间的转换问题