将我的32位放入4字节阵列

时间:2016-01-03 17:21:44

标签: java parsing bytearray

我将不同的二进制数放入字节数组中。其中一个数字是:10001101010010010000000000001000这个号码在我尝试解析它的行上给了我一个NumberFormatException,显然是因为它太大了。请参阅下面的代码,其中string是二进制数。

int number = Integer.parseInt(string, 2);
ByteBuffer bytes = ByteBuffer.allocate(4).putInt(number);
byte[] byteInstruction = bytes.array();

我想要的是将数字放在我的字节数组中,但因为它们是32位数字,所以我不想在数组中占用超过4个字节。当我使用long解析它有效但我在字节数组中占用了8个空格。

long number = Long.parseLong(string, 2);
ByteBuffer bytes = ByteBuffer.allocate(8).putLong(number);
byte[] byteInstruction = bytes.array();

如果我稍后打印出数组,我会得到这个:

[0, 0, 0, 0, -115, 73, 0, 8]

我们可以看到有4个免费点。我怎么解决这个问题?我怎么搞砸了? 感谢所有帮助。

1 个答案:

答案 0 :(得分:1)

您的输入字符串"10001101010010010000000000001000"表示对于已签名 Integer来说太大的值。 Integer.MAX_VALUE = 2147483647您输入的输入字符串的值为2370371592

Integer.parseInt 不会将位于第32位的前导1解释作为 sign 。如果您想要解析负值,则必须在-符号前面。

有关详细说明,请参阅此answer

如果您希望输入"10001101010010010000000000001000"实际上意味着"-0001101010010010000000000001000",则只需将第一个字符替换为+ / -,具体取决于右侧32位的值。< / p>

或者,如果您想在Two's complement compatible way中处理二进制字符串,可以使用此answer中的方法:

int msb = Integer.parseInt("1000110101001001", 2);
int lsb = Integer.parseInt("0000000000001000", 2);

int result = msb<<16 | lsb;