无法将字节转换为普通视图

时间:2014-04-24 05:25:18

标签: java byte

我有很长的值,我想转换ot字节数组。我用这个函数

      public static byte[] longToByteArray(long value) {
        byte[] result = new byte[8];
        for(int i = 0; i < 8; i++) {
          result[i] = (byte)(value & 0xFF);
          System.out.println(result[i]);
          System.out.println(Integer.toBinaryString(result[i]));
          value >>>= 8;
        } 
        return result;
      }

并且输出数据类似于

18
10010
-12
11111111111111111111111111110100
88
1011000
83
1010011
0
0
0
0
0
0
0
0

为什么我在-12的二进制视图中有太多的1,我怎么能像

那样得到它
11110100

4 个答案:

答案 0 :(得分:0)

您的-12将以11111111111111111111111111110100形式出现,因为它是一个负数,以2的补码格式编码,使用所有可用的32位,因为它被解析为整数。

如果你只想要最后的8位,你可能需要像那样格式化它。请检查此答案:How to convert a byte to its binary string representation

答案 1 :(得分:0)

那是因为Integer.toBinaryString(result[i])将你的字节转换为int(32位),而且字节从-128到127表示,所以大于127的值表示为负数;因此,你的字节最终成为负int。要解决这个问题,你可以改变这一行:

System.out.println(Integer.toBinaryString(result[i]));

这个:

System.out.println(Integer.toBinaryString(result[i] & 0xFF));

答案 2 :(得分:0)

原因是,即使您在调用(byte)(value & 0xFF)时执行Integer.toBinaryString,它也会被转换回32位整数,并且您正在获得-12整数的正确输出。

一个简单的解决方案是将负字节值(-128到-1)转换为正无符号字节值(128到255)。这可以通过测试负数并添加256来完成,例如:

int b = (int)(value & 0xFF);
if (b<0) {
    b = b + 256;
}

这是在整数数据类型中完成的,但结果值为0..255,这适用于无符号字节。现在,结果证明,-12代替244,但事实证明,244的二进制表示与-12的8位版本相同。试试吧!

答案 3 :(得分:0)

您可以使用JBBP

byte [] packed = JBBPOut.BeginBin().Long(aLongValue).End().toByteArray();