我目前正在尝试在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如上所述。
对此的任何帮助将不胜感激!
答案 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')