0

私はPythonで安全なファイル転送システムを開発しており、現在プロトコルを扱っています。私の考えは、次のようなものを持つことです:

[Command:1byte][DataLength:2bytes][Data]

私の問題は、Python でバイナリ/16 進数を処理する方法がわからないことです。

コマンド (バイナリ) が00000001(1 バイト) のパケットを送信したとします。dataLength = 200 バイトの場合、格納するのに 16 ビットあるので、0000000011001000. したがって、ヘッダーは次のとおり000000010000000011001000です。問題は、0 と 1 をそれぞれ 1 バイトでコーディングせずに、その「生」を送信する方法です。

4

1 に答える 1

2

モジュールstructarray次のように使用できます。

>>> from struct import pack, unpack
>>> from array import array
>>>
>>> # byte (unsigned char) + 2 bytes (unsigned short)
>>> header = pack('BH', 0, 15)
>>> # array of 15 null byte, you can also use string
>>> buffer = array('B', '\0' * 15).tostring()
>>>
>>> header
'\x00\x00\x0f\x00'
>>> buffer
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>>
>>> header + buffer
'\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>>

バイトオーダーを考慮する必要があります。そのバッファをアンパックするには、次のようにします。

>>> package = header + buffer
>>>
>>> package
'\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>>
>>> # unpacking the header
>>> unpack('BH', package[:4])
(0, 15)
>>>
>>> # unpacking the payload
>>> array('B', package[4:])
array('B', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>>
于 2013-11-07T12:57:23.383 に答える