-1

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

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 中最好的方法是什么。

我正在尝试从结构中使用解包,但不确定如何提取特定位?

4

1 回答 1

0

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

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


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

from ctypes import *

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

然后,您bytearray从数据构造 a ,将cast其构造为 a FmtStruct,然后访问字段。


您还可以查看第三方模块,它们可以让您将一串字节转换为一串位(不会浪费 8 倍的存储空间),然后您可以像任何其他字符串一样对其进行切片,还可以将任何切片转换为整数,这听起来正是你想要的。我没有要推荐的特定模块,但通过快速搜索,bitstring看起来bitarray很有希望。


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

于 2013-11-14T11:04:06.587 回答