gpt4 book ai didi

java - 在java中将两个字节转换为有符号整数

转载 作者:行者123 更新时间:2023-11-30 02:07:32 25 4
gpt4 key购买 nike

简短的问题

有没有办法将两个字节读取为有符号整数?

详细信息和示例

给定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

这些只是示例。将会有更多的字节,它们将代表正整数和负整数。

有没有办法读取两个字节作为有符号整数并得到正确的结果?

提前致谢。

最佳答案

就您而言,您只需从高字节中删除按位 & 即可:

int i = (byteArray[2] << 8) | (byteArray[3] & 0xff);

& 0xff 正在撤消您想要的符号扩展。 You still need it on the low byte.

二进制补码扩展的工作原理如下:

  1. 如果设置了较小尺寸数字的最高有效位,

    //    v
    0b1000000_00000000
  2. 用 1 填充旧最高有效位上方的新位:

    //    vvvvvvvv vvvvvvvv
    0b11111111_11111111_1000000_00000000

每当 byteshort 转换为 intlong 时,Java 都会自动执行此操作,并且字节上的& 0xFF的目的是撤消自动符号扩展。

如果您无权访问字节,您可以使用算术右移自行进行符号扩展:

i = (i << 16) >> 16;

或转换为:

i = (short) i;

或者各种if测试,例如:

if ((i & 0x80_00) != 0) // Is the MSB of the high byte set?
i |= 0xFF_FF_00_00; // Fill the rest with 1s.

还有:

if (i > 32767)
i -= 65536;

关于java - 在java中将两个字节转换为有符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50980248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com