1

这个问题与这篇文章有关: int to binary python

我有这个需要增加的序列号,现在它已经修复并且工作正常。但是,我刚刚发现实际上序列号不仅仅是一个简短的,考虑这个方案:

     12 bits           4 bits
 Sequence number   Fragment number

所以如果我发送一个值为 258 (\x02\x01) 的序列号,它实际上是;

Fragment number :2
Sequence number :16

我想知道如何将 258 作为实际的序列号,而不是这样拆分。有没有简单的方法来实现这一点struct

更新:

我在上述问题中的意思是:

我正在构建一个像这样的网络数据包生成器:

class PacketHeader(Packet):
fields = OrderedDict([
    ("head", "\x00"),
    ("headpad", "\x00"),
    ("headlen", "\x1a\x00" ),
    ("presentflag", "\x2e"),
    ("timestamp", "\x43\x10\x58\x16\xa1\x01\x00\x00"),
    ("flag", "\x03"),
    ("Sequencenum", "\x04\x00"), 
###12 bits of this 'short' is Seq num, 4 bits left are if this is a fragment or not(if it is, its value will be =>1, and will then represent the frag number.)

])

后来,我打电话给我的班级并像这样发送数据包:

send(PacketHeader(Sequencenum=257))
send(PacketHeader(Sequencenum=258))
send(PacketHeader(Sequencenum=259))

我需要将序列号转换为一个短序列号(在这种情况下假设为 257),并处理代表该 16 位短序列号的 4 位。我希望始终将片段编号设置为 0,但将 Sequencenum 正确递增。

提前致谢 !

4

1 回答 1

1

沿线的东西:

number_to_send = (sequence_number << 4) + fragment_number
bytes_to_send = struct.pack("!H", number_to_send)

然后回来:

sequence_number = struct.unpack("!H", bytes_to_send)[0] >> 4
于 2012-07-11T03:31:44.830 回答