当存在多个字节顺序时,Python struct.unpack(打包)?

当存在多个字节顺序时,Python struct.unpack(打包)?,python,python-3.x,performance,binaryfiles,iterable-unpacking,Python,Python 3.x,Performance,Binaryfiles,Iterable Unpacking,我有一个函数,它读取二进制文件,然后使用struct.unpack()解包文件内容。我的函数运行得很好。如果/当我使用长“格式”字符串解包整个文件时,速度会更快。问题是,有时字节对齐方式会改变,所以我的格式字符串(无效)看起来像“llh”(这只是一个示例(它们通常要长得多))。有没有什么超灵巧的方法来处理这种情况?没有什么超灵巧的方法,但是如果速度很快,那么struct模块的顶级函数就是包装器,必须重复检查缓存中与格式字符串对应的实际struct.struct实例;虽然您必须创建单独的格式字符串

我有一个函数,它读取二进制文件,然后使用struct.unpack()解包文件内容。我的函数运行得很好。如果/当我使用长“格式”字符串解包整个文件时,速度会更快。问题是,有时字节对齐方式会改变,所以我的格式字符串(无效)看起来像“llh”(这只是一个示例(它们通常要长得多))。有没有什么超灵巧的方法来处理这种情况?

没有什么超灵巧的方法,但是如果速度很快,那么
struct
模块的顶级函数就是包装器,必须重复检查缓存中与格式字符串对应的实际
struct.struct
实例;虽然您必须创建单独的格式字符串,但可以通过避免重复的缓存检查来解决部分速度问题

而不是做:

buffer = memoryview(somedata)
allresults = []
while buffer:
    allresults += struct.unpack_from('<10sHHb', buffer)
    buffer = buffer[struct.calcsize('<10sHHb'):]
    allresults += struct.unpack_from('>llh', buffer)
    buffer = buffer[struct.calcsize('>llh'):]
将为您提供一个结构,使您能够:

mystruct = MainStruct()
memoryview(mystruct).cast('B')[:] = bytes(range(25))
然后您将按预期顺序获得结果,例如:

>>> hex(mystruct.b[0])  # Little endian as expected in main struct
'0xb0a'
>>> hex(mystruct.big.x[0]) # Big endian from inner big endian structure
'0xf101112'
虽然在某种程度上很聪明,但它很可能会运行得更慢(
ctypes
属性查找在我的经验中速度非常慢),而且与
struct
模块函数不同,您不能在一行中解压成顶级命名变量,它始终是属性访问

mystruct = MainStruct()
memoryview(mystruct).cast('B')[:] = bytes(range(25))
>>> hex(mystruct.b[0])  # Little endian as expected in main struct
'0xb0a'
>>> hex(mystruct.big.x[0]) # Big endian from inner big endian structure
'0xf101112'