将 HexString 转换为字节,然后返回到 HexString 添加额外的零

Converting HexString to Bytes and then Back to HexString adds extra zero

我正在将 64 bit/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);
}

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

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

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

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