【问题标题】:Putting my 32 bits into a 4 bytearray将我的 32 位放入 4 字节数组
【发布时间】:2016-04-07 08:51:33
【问题描述】:

我将不同的二进制数放入一个字节数组中。其中一个数字是: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 个空位。我该如何解决这个问题?我怎么搞砸了? 感谢所有帮助。

【问题讨论】:

  • 关键是这个数字不适合int,因为在Java中int是签名的。
  • 你没有搞砸任何事情。 long 是 64 位,即 8 个字节
  • @cricket_007 但是我能做什么呢?因为我只想将我的号码存储在我的字节数组中的 4 个空格中,而不是 8 个。
  • 我不认为这个数字对于 int 来说太大了。签名的话只是一个很大的负数
  • 使用int number = (int)Long.parseLong(string,2);

标签: java parsing bytearray


【解决方案1】:

您的输入字符串 "10001101010010010000000000001000" 表示对于 signed Integer 来说太大的值。 Integer.MAX_VALUE = 2147483647 并且您传递的输入字符串的值为2370371592

Integer.parseInt 不解释位于右侧第 32 位的前导 1符号。如果您想解析负值,则必须在其前面加上 - 符号。

请参阅此answer 了解更多信息。

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

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

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

int result = msb<<16 | lsb;

【讨论】:

  • 比如把10000000000000000000000000000000变成-0
  • 整数.MIN_VALUE。在我对问题的评论中查看两人的赞美链接
  • @MattTimmermans 看到我的编辑。您还可以在问题中添加二进制补码要求,以便更容易找到
猜你喜欢
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
相关资源
最近更新 更多