为什么只存 packetLength 的低5位到body中?

来源:9-11 消息分片传输设计与实现-3

磊磊要酷酷滴

2019-05-02

  • 这里为什么只存 packetLength 的低 5 位到 body 中?
public SendHeaderFrame(short identifier, SendPacket packet) {
    super(PACKET_HEADER_FRAME_MIN_LENGTH,
            Frame.TYPE_PACKET_HEADER,
            Frame.FLAG_NONE,
            identifier,
            packet);

    final long packetLength = packet.length();
    final byte packetType = packet.type();
    final byte[] packetHeaderInfo = packet.headerInfo();

    // 头部对应的数据信息长度
    body = new byte[bodyRemaining];

    // 头5字节存储长度信息低5字节(40位)数据
    // 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    body[0] = (byte) (packetLength >> 32);
    body[1] = (byte) (packetLength >> 24);
    body[2] = (byte) (packetLength >> 16);
    body[3] = (byte) (packetLength >> 8);
    body[4] = (byte) (packetLength);

    body[5] = packetType;

    if (packetHeaderInfo != null) {
        System.arraycopy(packetHeaderInfo, 0,
                body, PACKET_HEADER_FRAME_MIN_LENGTH, packetHeaderInfo.length);
    }
}
写回答

1回答

Qiujuer

2019-05-02

不是5位吧??是40位。5字节。

这是因为:我的数值本身都是正数,所以我们不必耗费字节来存储符号位;所以我们可以直接来看:
2的40次方:

1099511627776字节

1099511627776/1024/1024/1024 = 1024GB

试问,就算是极限情况下会一次性传递1024GB的数据么?不会吧。所以就已经足够了。

1
0

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2316 学习 · 476 问题

查看课程