将HexString转换为字节然后返回HexString会增加额外的零

时间:2016-07-29 14:09:09

标签: java hex byte bytearray

将64位/ 16十六进制字符串转换为字节数组但似乎没有很好地进行转换。 我究竟做错了什么? 所以我的字符串是FEDCBA9876543210但是当我将它转换为byteArray时,它是9个字节而不是8个字节! 转换回来后,我得到00FEDCBA9876543210

我做错了什么。我的函数中使用了thread。 这是我的转换代码。

public static byte[] hexStringToByteArray(String str) {
    int len = str.length();
    byte [] data = new byte[len/2];
    for (int i=0; i<len; i+=2) {
        data[i/2] = (byte) ((Character.digit(str.charAt(i), 16) << 4) +
                (Character.digit(str.charAt(i+1), 16)));
    }
    return data;
}

这是转换回来的代码。

public static String byteArrayToHexString(byte [] bytes) {
    char[] hexArray = "0123456789abcdef".toCharArray();
    char[] hexChars = new char[bytes.length * 2];

    for (int i=0; i<bytes.length; i++) {
        int c = bytes[i] & 0xFF;
        hexChars[i*2] = hexArray[c >>> 4];
        hexChars[i*2 + 1] = hexArray[c & 0x0F];
    }
    return new String(hexChars);
}

1 个答案:

答案 0 :(得分:0)

我犯了一个可怕的错误。 转换后的某个地方,我正在使用BigInteger.toByteArray转换重新转换此BigInteger值。 (不要问我为什么!!)以前工作的遗留物。

根据文档here,转换为字节数组会添加一个符号位。

在删除链接时,我现在有8个字节。 :)

this.vendingKey = Conversions.hexStringToByteArray(vendingKey);
BigInteger bigInteger = new BigInteger(vendingKey, 16);
this.vendingKey = bigInteger.toByteArray();