java - 将我的 32 位放入一个 4 字节数组

标签 java parsing arrays

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

最佳答案

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

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

查看此 answer通过解释了解更多信息。

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

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

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

int result = msb<<16 | lsb;

关于java - 将我的 32 位放入一个 4 字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34579350/

相关文章:

Android 如何使用 FlatBuffers 解析 JSON 文件?

arrays - 翻转元素以最小化最大的连续元素在一起

java - yarn 安装和构建消耗 100% CPU 和内存 95%

java - 如何在Linux上获得用户定义的系统颜色?

java - 用 JDBC 取消 SQL 语句

Java - 创建包范围或全局变量的最佳实践

c# - FileHelpers:搜索结果

java - 如何在Java中解析JSON

arrays - 在 gnuplot 中声明两个数组并将它们相对于另一个进行绘制

arrays - Bash:使用 IFS 将数组连接成字符串