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[]是没有问题的。

原创粉丝点击