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 に答える