2024-04-24 17:31:21 发布
网友
我有以下代码(数据是字节对象):
v = sum(struct.unpack('!%sH' % int(len(data)/2), data))
让我困惑的是格式字符串中的%sH和%int(len(data)/2
这部分代码到底是如何工作的?字节对象的长度是多少?这到底是多少?在
data
struct.unpack
stuct.unpack
要解释传递的数据,需要创建一个string来告诉Python data是什么形式的。具体地说,%sH部分是这个数量的无符号shorts的简写,然后对其进行格式化以表示您想要的unsigned short的确切数量。在
%sH
unsigned short
在这种情况下,数字是:
int(len(data) / 2)
因为unsigned short通常为2字节宽。在
假设您有一个字节字符串data,例如:
>>> data = b'\x01\x02\x03\x04' >>> data '\x01\x02\x03\x04'
长度是字节字符串中的字节(或字符)数:
所以这相当于你的代码:
>>> import struct >>> struct.unpack('!2H', data) (258, 772)
这将告诉struct模块使用以下format characters:
struct
!
2H
它返回两个与我们提供的数据相对应的整数:
>>> '%04x' % 258 '0102' >>> '%04x' % 772 '0304'
您的代码所做的就是动态地自动计算unsigned shorts的数目
unsigned shorts
>>> struct.unpack('!%sH' % int(len(data)/2), data) (258, 772)
但是int转换是不必要的,它不应该像字符串替换那样使用%s占位符:
int
%s
>>> struct.unpack('!%dH' % (len(data)/2), data) (258, 772)
因此unpack从数据字节str返回两个与解包2unsigned shorts有关的整数。Sum然后返回这两个整数的和:
>>> sum(struct.unpack('!%dH' % (len(data)/2), data)) 1030
代码的工作原理:
data
的字节结构struct.unpack
使用字符串确定要解释的数据的字节格式stuct.unpack
返回解释数据的iterable。在字节格式
要解释传递的数据,需要创建一个string来告诉Python
data
是什么形式的。具体地说,%sH
部分是这个数量的无符号shorts的简写,然后对其进行格式化以表示您想要的unsigned short
的确切数量。在在这种情况下,数字是:
因为
unsigned short
通常为2字节宽。在假设您有一个字节字符串
data
,例如:长度是字节字符串中的字节(或字符)数:
^{2}$所以这相当于你的代码:
这将告诉
struct
模块使用以下format characters:!
-使用网络(big-endian)模式2H
-解压2个无符号短路(每个16位)它返回两个与我们提供的数据相对应的整数:
您的代码所做的就是动态地自动计算
unsigned shorts
的数目但是
int
转换是不必要的,它不应该像字符串替换那样使用%s
占位符:因此unpack从数据字节str返回两个与解包2
unsigned shorts
有关的整数。Sum然后返回这两个整数的和:相关问题 更多 >
编程相关推荐