我有以下代码(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字节宽