byte []中的数组索引有问题

时间:2013-01-30 23:58:40

标签: java

我有这样的字符串

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来到哪里!?

2 个答案:

答案 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它只是一个数字