Struct.unpack和字节对象的长度

时间:2014-07-06 02:20:40

标签: python

我有以下代码(数据是一个字节对象):

    v = sum(struct.unpack('!%sH' % int(len(data)/2), data))

让我困惑的部分是格式字符串中的%sH和%int(len(data)/ 2

这部分代码究竟是如何工作的?字节对象的长度是多少?这到底是什么?

2 个答案:

答案 0 :(得分:2)

假设您有一个字节字符串data,例如:

>>> data = b'\x01\x02\x03\x04'
>>> data
'\x01\x02\x03\x04'

长度是字节字符串中的字节数(或字符数):

>>> len(data)
4

所以这相当于你的代码:

>>> import struct
>>> struct.unpack('!2H', data)
(258, 772)

这告诉struct模块使用以下format characters

  • ! - 使用网络(大端)模式
  • 2H - 解包2 x无符号短路(每个16位)

它返回两个与我们提供的数据相对应的整数:

>>> '%04x' % 258
'0102'
>>> '%04x' % 772
'0304'

您的所有代码都会自动计算unsigned shorts的数量

>>> struct.unpack('!%sH' % int(len(data)/2), data)
(258, 772)

但是int转换是不必要的,它不应该使用%s占位符,因为它是字符串替换:

>>> struct.unpack('!%dH' % (len(data)/2), data)
(258, 772)

因此,unpack返回与数据字节str中解包2 unsigned shorts相关的两个整数。 Sum然后返回这些的总和:

>>> sum(struct.unpack('!%dH' % (len(data)/2), data))
1030

答案 1 :(得分:1)

您的代码的工作原理:

  • 您正在解释data的字节结构
    • struct.unpack使用字符串来确定要解释的数据的字节格式
    • 给定格式stuct.unpack返回解释数据的可迭代内容。
  • 然后,您可以对可比较的内容进行总结。

字节格式

要解释您传递的数据,您需要创建一个string来告诉Python data的格式是什么。具体来说,%sH部分是这个数字的简写无符号短裤然后您可以格式化以说明您想要的unsigned short的确切数量。

在这种情况下,数字是:

int(len(data) / 2)

因为unsigned short通常是2个字节宽。