结构体.解包和字节对象长度



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

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

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

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

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

>>> data = b'x01x02x03x04'
>>> data
'x01x02x03x04'

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

>>> len(data)
4

所以这相当于你的代码:

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

告诉struct模块使用以下格式字符:

  • ! -使用网络(大端)模式
  • 2H - unpack 2 x unsigned short(每个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

你的代码是如何工作的:

  • 你正在解释data的字节结构
    • struct.unpack使用字符串来确定要解释的数据的字节格式
    • 给定格式,stuct.unpack返回一个可迭代的解释数据
  • 然后对可交互项求和。

字节格式

为了解释你传递的数据,你创建了一个字符串来告诉Python data的形式。具体来说,%sH部分是的简写,这是无符号短裤的数量,然后将其格式化为您想要的unsigned short的确切数量。

在这种情况下,数字是:

int(len(data) / 2)

因为unsigned short通常是2字节宽

最新更新