Java 位移位-为什么该代码使用24、16和8右移?

Java 位移位-为什么该代码使用24、16和8右移?,java,bit-shift,Java,Bit Shift,我正在看这段java代码并试图理解它。我对它的一切都很了解,只知道有点不对劲 我知道下面使用位移位的代码正在构建一些值来填充字节[],但我不知道为什么它特别使用右移位,为什么是24位,然后是16位,然后是8位?选择这些值而不是其他值的位置和原因 private void Send(NetSocket out, int MsgID, byte MsgSeq, char MsgLetter, String data) { int msglen = data.length() + 2;

我正在看这段java代码并试图理解它。我对它的一切都很了解,只知道有点不对劲

我知道下面使用位移位的代码正在构建一些值来填充字节[],但我不知道为什么它特别使用右移位,为什么是24位,然后是16位,然后是8位?选择这些值而不是其他值的位置和原因

private void Send(NetSocket out, int MsgID, byte MsgSeq, char MsgLetter, String data) 
{
    int msglen = data.length() + 2; 
    byte[] msg = new byte[msglen + 8];
    byte[] md = data.getBytes();
    msg[0] = (byte) (msglen >> 24);
    msg[1] = (byte) (msglen >> 16);
    msg[2] = (byte) (msglen >> 8);
    msg[3] = (byte) (msglen);
    msg[4] = (byte) (MsgID >> 24);
    msg[5] = (byte) (MsgID >> 16);
    msg[6] = (byte) (MsgID >> 8);
    msg[7] = (byte) (MsgID);
    msg[8] = (byte) MsgLetter;
    msg[9] = MsgSeq;
    System.arraycopy(md, 0, msg, 10, msglen - 2);

    // send
}

这只是将一个32位整数的4个字节压缩成4个连续字节,注意使用一个特定的endianness(在本例中是big-endian)。它只是说:

// put the "biggest" 8 bits into the first byte,
// by right shifting the value 24 bits
msg[0] = (byte) (msglen >> 24);
将32位整数右移24位意味着您将在最低有效位的8个位置保留8个最高有效位,准备打包到
字节中。接下来的3行处理接下来的8位(右移位16),然后是下一位(右移位8),以此类推

转换为
字节
只会丢弃除最低有效8位以外的所有内容,因此在每次移位(或在最后一个移位中缺少移位)后,我们将取32位中的四分之一


同样,这只是实现了帧的大端长度前缀。接收代码将通过左移和/或ing来逆转这一点,以从前4个字节重建长度。

这只是将32位整数的4个字节打包为4个连续字节,注意使用特定的尾数(在本例中为大尾数)。它只是说:

// put the "biggest" 8 bits into the first byte,
// by right shifting the value 24 bits
msg[0] = (byte) (msglen >> 24);
将32位整数右移24位意味着您将在最低有效位的8个位置保留8个最高有效位,准备打包到
字节中。接下来的3行处理接下来的8位(右移位16),然后是下一位(右移位8),以此类推

转换为
字节
只会丢弃除最低有效8位以外的所有内容,因此在每次移位(或在最后一个移位中缺少移位)后,我们将取32位中的四分之一


同样,这只是实现了帧的大端长度前缀。接收代码将通过左移和/或ing来反转此值,以从前4个字节重建长度。

如果您有一个32位整数,则可以将其视为四个8位整数:

31 30 29 28 27 26 25 24 23 22 21 20 19 17 16 15 14 13 11 10 09 08 07 06 04 02 01
\---------------------/ \---------------------/ \---------------------/ \------------------/
位24-31(8位)位16-23(8位)位8-15(8位)位0-7(8位)
Big-endian编码是首先发送最高有效字节的编码,因此第一个字节中需要位24-31,第二个字节中需要位16-23,依此类推。网络通信的标准字节顺序是big-endian。(Little endian是另一种方式,通常用于x86和其他一些平台上的内存存储。)

如果将整数转换为字节,则最高有效位将被丢弃

31 30 29 28 27 26 25 24 23 22 21 20 19 17 16 15 14 13 11 10 09 08 07 06 04 02 01
\---------------------/ \---------------------/ \---------------------/ \------------------/
位24-31(8位)位16-23(8位)位8-15(8位)位0-7(8位)
转换为(字节)
07 06 05 04 03 02 01
\------------------/
位0-7(8位)
如果右移,则移动位,以便可以转换为
(字节)
,并依次获得32位整数的其他部分:

31 30 29 28 27 26 25 24 23 22 21 20 19 17 16 15 14 13 11 10 09 08 07 06 04 02 01
\---------------------/ \---------------------/ \---------------------/ \------------------/
位24-31(8位)位16-23(8位)位8-15(8位)位0-7(8位)
|
\---------------------------- >> 24 -----------------------------------\
|
07 06 05 04 03 02 01
\------------------/
先前为第24-31位
现在是0-7位(8位)

如果您有一个32位整数,可以将其视为四个8位整数:

31 30 29 28 27 26 25 24 23 22 21 20 19 17 16 15 14 13 11 10 09 08 07 06 04 02 01
\---------------------/ \---------------------/ \---------------------/ \------------------/
位24-31(8位)位16-23(8位)位8-15(8位)位0-7(8位)
Big-endian编码是首先发送最高有效字节的编码,因此第一个字节中需要位24-31,第二个字节中需要位16-23,依此类推。网络通信的标准字节顺序是big-endian。(Little endian是另一种方式,通常用于x86和其他一些平台上的内存存储。)

如果将整数转换为字节,则最高有效位将被丢弃

31 30 29 28 27 26 25 24 23 22 21 20 19 17 16 15 14 13 11 10 09 08 07 06 04 02 01
\---------------------/ \---------------------/ \---------------------/ \------------------/
位24-31(8位)位16-23(8位)位8-15(8位)位0-7(8位)
转换为(字节)
07 06 05 04 03 02 01
\------------------/
位0-7(8位)
如果右移,则将位移到上方,以便可以转换为
(