首页 > 解决方案 > 位移位 - 为什么此代码使用 24、16 和 8 位右移?

问题描述

我正在查看这个 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
}

标签: javabit-shift

解决方案


这只是将 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 个最高有效位,准备好打包到byte. 接下来的 3 行处理接下来的 8 位(右移 16),然后是下一个(右移 8),等等。

转换为 a会byte简单地丢弃除最低有效 8 位之外的所有内容,因此在每次移位后(或最后一个移位中没有移位),我们取 32 位的四分之一。

再说一遍:这只是实现了帧的大端长度前缀。接收代码将通过左移和 or-ing 反转这一点,从前 4 个字节重建长度。


推荐阅读