我有很长的值,我想转换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
答案 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();