【问题标题】:Sending binary/hex through socket (Python)通过套接字发送二进制/十六进制(Python)
【发布时间】:2013-11-07 12:44:36
【问题描述】:

我正在使用 Python 开发一个安全的文件传输系统,我现在正在处理协议。我的想法是:

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

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

假设我发送了一个数据包,其中命令(二进制)是00000001(1 字节)。 dataLength = 200 字节,因为我有 16 位来存储它,所以我有0000000011001000。所以标题是:000000010000000011001000。问题是:如何发送那个“原始”,而不用每个 1 字节编码 0 和 1?

【问题讨论】:

  • 缺乏学习练习......所有已经尝试和测试的现有安全传输协议到底有什么问题?
  • Byte Array in Python的可能重复
  • 我怀疑你必须自己发送实际的 1 和 0。发送代表字节的str 值。 \x00 是二进制的00000000\x0100000001,等等

标签: python sockets


【解决方案1】:

您可以将模块 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])
>>>

【讨论】:

  • 在使用struct 模块通过网络发送数据时,我肯定会考虑使用明确的字节顺序。总之struct.pack('>...', ...)struct.unpack('>...', ...)
猜你喜欢
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
相关资源
最近更新 更多