[英]Struct.unpack and Length of Byte Object
我有以下代码(数据是一个字节对象):
v = sum(struct.unpack('!%sH' % int(len(data)/2), data))
令我感到困惑的部分是格式字符串中的%sH和%int(len(data)/ 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
模块使用以下格式字符 :
!
-使用网络(大端)模式 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
data
的字节结构
struct.unpack
使用字符串来确定要解释的数据的字节格式 stuct.unpack
返回可解释数据的可迭代值。 要解释你的数据,你是路过,你创建一个字符串来告诉Python何种形式data
的用武之地。具体的%sH
部分是一个简短的手这个数字签名短裤的你再格式要说的确切数量,其unsigned short
你想。
在这种情况下,数字为:
int(len(data) / 2)
因为unsigned short
通常为2个字节宽。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.