Java中String和byte[]互转问题
来源:互联网 发布:淘宝水果供应商 编辑:程序博客网 时间:2024/06/05 15:23
最近使用tlv协议传输数据,发现Java中的String存放二进制数剧是有问题的。代码如下:
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[]是没有问题的。
阅读全文
0 0
- Java中String和byte[]互转问题
- Java中byte[]转String问题
- Java中byte[]转String问题
- Java中String类型和Byte类型的互换问题
- java中byte数组和String字符串怎么相互转换?(string 转 byte[]和byte[] 转 string)
- Android 中 -Java中byte[]转String问题
- Android 中 -Java中byte[]转String问题
- Android 中 -Java中byte[]转String问题
- Android 中 -Java中byte[]转String问题
- java中String转byte[]
- 网络传输时,Java中byte[]转String问题
- Java中byte[]转String问题 丢失字节
- 转:C#中有关string和byte[]转换的问题
- Java中有关byte和String的转换笔记[转]
- Java中String和byte[]的转换
- java中string, byte和int转换
- Java byte数组转String字符集问题
- Java之 byte[]转String问题
- js中退出语句break,continue和return 比较
- 双链表的创建、遍历、测长、插入、删除、销毁
- 实验吧-让我进去【salt加密 哈希长度拓展攻击】
- 判断一棵树是否是完全二叉树【每日一题】
- Apache Spark 内存管理详解
- Java中String和byte[]互转问题
- ES6 module export和import
- strcpy的参数
- 注册表
- SSAS对称维度与非对称维度
- windiows 下 WSAEventSelect模型
- Java中一个类里面有两个用synchronized修饰的非静态方法,不同的线程中的实例访问这两个方法时会发生什么?
- 被误解的明朝——中国的"文艺复兴"(转)
- 启动oracle数据库配置