python len计算

时间:2012-03-22 17:19:31

标签: python

我目前正在尝试在python中构建一个RDP客户端,我通过len检查遇到了以下问题;

来自:http://msdn.microsoft.com/en-us/library/cc240836%28v=prot.10%29.aspx

  

81 2a - > ConnectData :: connectPDU length = 298字节由于第一个字节(0x81)的最高有效位设置为1而后续位设置为0,因此长度由第一个字节和第二个字节的低六位给出。因此,该值为0x12a,即298字节。

这听起来很奇怪。

对于正常的len检查,我只是使用:struct.pack(">h",len(str(PacketLen)))

但在这种情况下,我真的不知道如何计算len如上所述。

对此的任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

使用按位OR设置最高有效位:

struct.pack(">H", len(...) | 0x8000)

您可能需要添加一项检查以确保长度符合14位,即它小于2 ** 14

修改:根据TokenMacGuy的评论修复。

答案 1 :(得分:0)

处理带宽敏感的传输协议时,这并不是一个非常罕见的场景。它们基本上是说下面的长度是否适合0 - >的范围。 0x7F,只使用一个字节,否则,您可以选择使用2个字节。 (注意:该系统的最大法定价值是16,383)

这是一个简单的例子:

if len <= 0x7F:
    pkt = struct.pack('B', len)
elif len <= 0x3FFF:
    pkt = struct.pack('>h', len | 0x8000)
else:
    raise ValueError('length exceeds maxvalue')