繁体   English   中英

Struct.unpack和字节对象的长度

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM