在python中使用unpack

时间:2013-11-14 10:54:56

标签: python

我有一个数据列表,其中列表中的每个成员都包含一个字节值。

list data = [0x00, 0x42, 0x00, 0xAD, 0x42, 010, 0xE0, 0xA2 ....]

这是我从某些外部API收到的数据。我需要将这些数据映射到固定格式。

我正在编写一个类,可以在每个字段值中检索。

class FmtData
    def __init__(self, data):
        self.data = data

    def getParam1(self):
       //This a to return a value of 8 bytes starting from say index 1 in data

    def getParam2(self):
       // return 12 bits [20-31] corresponding bits from {byte 3 and 4 - 0x00 and 0xAD}

在python中执行此操作的最佳方式是什么。

我正在尝试使用struct中的unpack,但不确定如何提取特定的位?

1 个答案:

答案 0 :(得分:0)

首先,您可能希望将字节列表转换为bytearray(list_data)

但是,struct模块不处理子字节打包。你可以手动完成,但那时,为什么要使用struct


ctypes模块允许您定义C样式结构,包括位字段。请参阅文档中的Structures and unions。对于某些用例来说这不方便,但我认为它在这里对你有用。例如:

from ctypes import *

class FmtStruct(Structure):
    _fields_ = [('padding', c_byte),
                #...
               ]

然后,您从数据构建bytearraycast将其构建为FmtStruct,然后只访问字段。


您还可以查看第三方模块,它允许您将一串字节转换为一串位(不浪费8倍的存储空间),然后您可以像任何其他字符串一样切片,并且还可以让您切换任何切片变成一个整数,听起来就像你想要的那样。我没有推荐的具体模块,但通过快速搜索,bitstringbitarray看起来很有希望。


或者,如果速度和大小不那么重要,只需手动将字节列表分解为位列表,对其进行切片,然后手动将切片手动转换为整数(例如,通过<<|)。