我有这样的字符串
String text = "f001050000000000003d61c1c1df400200c0000009181600ef014000003f20"
我将它转换为字节以循环遍历字节
byte[] bytes = new BigInteger(text,16).toByteArray();
for (int i = 0; i < bytes.length; i++)
{
System.out.print(String.format("%02x ", bytes[i]));
}
但是当我打印数组值时,它会在实际字符串的开头添加字节00
!
它应以f0
开头,但以00
开头!
当我使用1
开始索引时,此00
消失。
从00
来到哪里!?
答案 0 :(得分:4)
JavaDoc of BigInteger#toByteArray()州:
返回包含二进制补码的字节数组 此BigInteger的表示。字节数组将采用big-endian字节顺序:最重要的字节位于第0个元素中。该数组将包含表示此BigInteger所需的最小字节数,包括至少一个符号位,即
(ceil((this.bitLength() + 1)/8))
。[...]
当你有一个正数时,第一位在二进制补码中将为零。
答案 1 :(得分:1)
我认为BigInteger不适合这项任务。你需要自己解析你的文本,这并不困难
byte[] bytes = new byte[text.length() / 2];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) ((Character.digit(text.charAt(i * 2), 16) << 4) + Character.digit(text.charAt(i * 2 + 1), 16));
}
不是它也正确地转换“0000f0 ...”但BigInteger会截断前导零(normalize),因为对于BigInteger它只是一个数字