我有一个数据列表,其中列表中的每个成员都包含一个字节值。
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,但不确定如何提取特定的位?
答案 0 :(得分:0)
首先,您可能希望将字节列表转换为bytearray(list_data)
。
但是,struct
模块不处理子字节打包。你可以手动完成,但那时,为什么要使用struct
?
ctypes
模块允许您定义C样式结构,包括位字段。请参阅文档中的Structures and unions。对于某些用例来说这不方便,但我认为它在这里对你有用。例如:
from ctypes import *
class FmtStruct(Structure):
_fields_ = [('padding', c_byte),
#...
]
然后,您从数据构建bytearray
,cast
将其构建为FmtStruct
,然后只访问字段。
您还可以查看第三方模块,它允许您将一串字节转换为一串位(不浪费8倍的存储空间),然后您可以像任何其他字符串一样切片,并且还可以让您切换任何切片变成一个整数,听起来就像你想要的那样。我没有推荐的具体模块,但通过快速搜索,bitstring
和bitarray
看起来很有希望。
或者,如果速度和大小不那么重要,只需手动将字节列表分解为位列表,对其进行切片,然后手动将切片手动转换为整数(例如,通过<<
和|
)。