2

以下代码是将 int 转换为 Bytes 数组。我知道 inti右移了 24、16、8 次,并与 0xFF 进行了与运算,但我不明白为什么要使用这些数字?

private static byte[] intToBytes(int i)
  // split integer i into 4 byte array
  {
    // map the parts of the integer to a byte array
    byte[] integerBs = new byte[4];
    integerBs[0] = (byte) ((i >>> 24) & 0xFF);
    integerBs[1] = (byte) ((i >>> 16) & 0xFF);
    integerBs[2] = (byte) ((i >>> 8) & 0xFF);
    integerBs[3] = (byte) (i & 0xFF);

    // for (int j=0; j < integerBs.length; j++)
    //  System.out.println(" integerBs[ " + j + "]: " + integerBs[j]);

    return integerBs;
  }  // end of intToBytes()
4

4 回答 4

8

好的,假设您有一个 32 位二进制数:

00001111 00000111 00000011 00000001

一个字节相当于 8 位,因此上面的数字由 4 个字节组成。

为了将这些字节分开,我们需要执行一系列移位和屏蔽操作。

例如,为了获取第一个字节(00001111),我们执行以下操作:

00001111 00000111 00000011 00000001 (original)
00000000 00000000 00000000 00001111 (shifted 24 spaces to the right)

现在我们不希望前面有 3 个字节的零,所以我们使用 8 位掩码并在结果数字和掩码之间(0xFF)执行AND操作。32 bit

例如:

00000000 00000000 00000000 00001111
&&                         11111111
-----------------------------------
                           00001111 (the first byte)

现在您可以想象如何获得第二个字节(仅右移 16 位)。整个目的是在前 8 个位置获得你想要的 8 位,并使用掩码去除前面的垃圾。

于 2013-04-18T06:35:48.807 回答
0

一个 32 位整数由四个字节组成:

  • 字节 0 从位 0 开始;
  • 字节 1 从第 8 位开始;
  • 字节 2 从第 16 位开始;
  • 字节 3 从位 24 开始。

我希望这能解释 8、16 和 24 的来源(它们是 8 的倍数,这是一个字节的宽度(以位为单位))。

最后,值得注意的是

integerBs[3] = (byte) (i & 0xFF);

是相同的

integerBs[2] = (byte) ((i >>> 0) & 0xFF);

这是缺失的零。

于 2013-04-18T06:31:50.403 回答
0

由于 anint由四个字节组成,您可以int通过移动 8 位的倍数 = 1 个字节来“到达” 中的每个字节。

为了获得第一个字节,您将其移动int24 位 = 3 个字节,将第二个字节移动 16 位 = 2 个字节,依此类推......

屏蔽& 0xFF的目的是防止溢出,所以你只需要你想要的字节。

将其可视化

31                              0  
 |                              |
 11111111111111111111111111111111

右移 24 等于

 31                             0
 |                              |
 00000000000000000000000011111111

使用掩蔽它& 0xFF会为您提供从 0 到 7 的 8 位。

于 2013-04-18T06:31:55.980 回答
0

一些整数:

1111 1001 1010 1001 1010 1001 1010 1001 1010

右移 24 位:

1111 1001 1010

与 0xFF 相加:

1111 1001 1010

0000 1111 1111


0000 1001 1010

...这只是第 4 个字节。

整数:

1111 1001 1010 1001 1010 1001 1010 1001 1010

右移 16 位:

1111 1001 1010 1001 1010

与 0xFF 相加:

1111 1001 1010 1001 1010

0000 0000 0000 1111 1111


0000 0000 0000 1001 1010

...这只是第三个字节。

ETC...

于 2013-04-18T06:41:01.087 回答