我有以下代码(数据是一个字节对象):
v = sum(struct.unpack('!%sH' % int(len(data)/2), data))
让我困惑的部分是格式字符串中的%sH和%int(len(data)/ 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个字节宽。