结构解包和字节对象的长度

2024-04-24 17:31:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码(数据是字节对象):

    v = sum(struct.unpack('!%sH' % int(len(data)/2), data))

让我困惑的是格式字符串中的%sH和%int(len(data)/2

这部分代码到底是如何工作的?字节对象的长度是多少?这到底是多少?在


Tags: 数据对象字符串代码datalen字节格式
2条回答

代码的工作原理:

  • 您正在解释data的字节结构
    • struct.unpack使用字符串确定要解释的数据的字节格式
    • 给定格式stuct.unpack返回解释数据的iterable。在
  • 然后求出内部变量的和。在

字节格式

要解释传递的数据,需要创建一个string来告诉Python data是什么形式的。具体地说,%sH部分是这个数量的无符号shorts的简写,然后对其进行格式化以表示您想要的unsigned short的确切数量。在

在这种情况下,数字是:

int(len(data) / 2)

因为unsigned short通常为2字节宽。在

假设您有一个字节字符串data,例如:

>>> data = b'\x01\x02\x03\x04'
>>> data
'\x01\x02\x03\x04'

长度是字节字符串中的字节(或字符)数:

^{2}$

所以这相当于你的代码:

>>> import struct
>>> struct.unpack('!2H', data)
(258, 772)

这将告诉struct模块使用以下format characters

  • !-使用网络(big-endian)模式
  • 2H-解压2个无符号短路(每个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返回两个与解包2unsigned shorts有关的整数。Sum然后返回这两个整数的和:

>>> sum(struct.unpack('!%dH' % (len(data)/2), data))
1030

相关问题 更多 >