java怎么将长度为2位的16进制格式的字符串转成一个字节(byte)?

以下是是java代码,第一个方法转换的结果有问题

    public static byte stringTobyte(String hex) {
        char[] hexChars = hex.toCharArray();
        byte b=(byte) (charToByte(hexChars[0]) << 4 | charToByte(hexChars[1]));
        return b;
    }
    
    public static byte[] hexStringToBytes(String hexString) {
        hexString = hexString.toLowerCase();
        String[] hexStrings = hexString.split(" ");
        byte[] bytes = new byte[hexStrings.length];
        for (int i = 0; i < hexStrings.length; i++) {
            char[] hexChars = hexStrings[i].toCharArray();
            bytes[i] = (byte) (charToByte(hexChars[0]) << 4 | charToByte(hexChars[1]));
        }
        return bytes;
    }

第一个方法是把长度为2位的16进制格式的字符串转换为字节,第二个是把一个分隔符为空格的多个2位长度的16进制字符串转换为字节数组

第二个方法是从网上找的,第一个方法是从第二个方法的for循环代码里抠出来改的。

但第一个方法测试使用有问题,第二个方法测试没有问题,

第一个方法,只要出现了字母,调用后转换的byte输出出来的全是-1,在转成16进制的字符串,就变成了FF,例如输入0A,0B,AA ,AB等,转换后的byte值是-1,转回16进制字符串会变成FF

第二个方法就没有这种问题,例如输入"0A 0B AA AB",转成字节数组,在转回来,还是"0A 0B AA AB"

阅读 5.1k
2 个回答

参考

// string 长度必须为偶数
public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

commons-codec工具里面有个Hex

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题