将十六进制字符串转换为字节数组

13

我有一个像这样的字符串:

init_thread = "2b11020000ed"

我必须通过蓝牙发送这个字符串,为此我需要这样做:

byte[] init = init_thread.getBytes();
GlobalVar.mTransmission.write(init);

我需要定义init_thread字符串为十六进制字符串,然后再将其转换为字节,因为如果我不这样做,它会得到错误的结果:

现在的操作是 = 2(1byte), b(1byte), 1(1byte), 1(1byte)...

正确的操作应该是 = 2b(1byte), 11(1byte), 02(1byte)...


看一下这个链接1,可能会有用。 - Bahram
2个回答

38

将十六进制转换为字节并将字节转换为十六进制。

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;
            }

final protected static char[] hexArray = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
public static String byteArrayToHexString(byte[] bytes) {
            char[] hexChars = new char[bytes.length*2];
            int v;

            for(int j=0; j < bytes.length; j++) {
                v = bytes[j] & 0xFF;
                hexChars[j*2] = hexArray[v>>>4];
                hexChars[j*2 + 1] = hexArray[v & 0x0F];
            }

            return new String(hexChars);
        }

2
我遇到了字符串下标越界异常。我的输入是:e1a0b7f - HeartlessArchangel
@HeartlessArchangel,你的字符串只有7个字符长,这不足以表示4字节,你需要8个字符。 - Antonio Vlasic

1
如果我们想将十六进制转换为字节数组,我们需要确保十六进制字符串的长度是偶数。下面的方法处理了这个问题。
public static byte[] hexToByteArray(String hex) {
    hex = hex.length()%2 != 0?"0"+hex:hex;

    byte[] b = new byte[hex.length() / 2];

    for (int i = 0; i < b.length; i++) {
        int index = i * 2;
        int v = Integer.parseInt(hex.substring(index, index + 2), 16);
        b[i] = (byte) v;
    }
    return b;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接