通过套接字发送二进制/十六进制(Python)

时间:2013-11-07 12:44:37

标签: python sockets

我正在使用Python开发一个安全的文件传输系统,我正在处理该协议。我的想法是拥有类似的东西:

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

我的问题是我不知道如何在Python中处理二进制/十六进制。

想象一下,我发送一个包命令(二进制)是00000001(1byte)。 dataLength = 200字节,然后,因为我有16位存储它,我有0000000011001000。所以标题是:000000010000000011001000。问题是:如何发送“原始”,而不编写0和1的每个1byte?

1 个答案:

答案 0 :(得分: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])
>>>