【发布时间】:2018-12-01 11:27:53
【问题描述】:
简短的问题
有没有办法将两个字节读取为有符号整数?
详细信息和示例
给定java中的两个字节,每个代表一个整数,我们可以将它们转换为它们一起表示的int值:
byte[] byteArray = new byte[4];
byteArray[0] = 0x00;
byteArray[1] = 0x00;
byteArray[2] = .. //a byte representing an integer
byteArray[3] = .. //a byte representing an integer
int i = ((byteArray[2] & 0xff) << 8) | (byteArray[3] & 0xff);
当两位代表正整数时,它可以完美地工作。但是当两个整数为负时它会失败。 例如当:
byteArray[2] = 0xff; // -1
byteArray[3] = 0xf9; // -7
我明白了:
i = 65529;
这是不正确的。它应该只是 -8 即 0xf8。
我尝试使用 ByteBuffer:
byte[] array = new byte[4];
array[0] = 0x00;
array[1] = 0x00;
array[2] = 0xff;
array[3] = 0xf9;
ByteBuffer buffer = ByteBuffer.wrap(array);
int i = buffer.getInt();
没用。得到相同的结果:
i = 65529
这些只是示例。会有更多字节,它们将代表正整数和负整数。
有没有办法将两个字节作为有符号整数读取并得到正确的结果?
提前致谢。
【问题讨论】:
-
您可以尝试从您的逻辑中减去 65536,如果为负,则将结果移位,或者您是否正在寻找单行?
-
我不明白字节和 0xff 部分的需要。该操作的结果始终是第一个操作数...
-
@RayToal 我需要一种方法来处理负字节和正字节。我只提供了两个整数为负数的示例。当然还有其他情况。
-
改用short,因为int的最左边是0,所以它是一个正数。但是如果你使用short,那么你会得到你想要的负值,因为由于short只有2个字节,最左边的位将是0xFF中最左边的1,使其成为负数。
标签: java arrays byte bytebuffer signed-integer