将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);
}
答案 0 :(得分:0)
我犯了一个可怕的错误。 转换后的某个地方,我正在使用BigInteger.toByteArray转换重新转换此BigInteger值。 (不要问我为什么!!)以前工作的遗留物。
根据文档here,转换为字节数组会添加一个符号位。
在删除链接时,我现在有8个字节。 :)
this.vendingKey = Conversions.hexStringToByteArray(vendingKey);
BigInteger bigInteger = new BigInteger(vendingKey, 16);
this.vendingKey = bigInteger.toByteArray();