蟒蛇;结构;重复计数24位整数

时间:2014-04-15 14:19:40

标签: python struct

我想解压缩2760字节的数组到920 24位整数的新数组。与...不同16位整数,struct.unpack_from('920h',array,0)会做什么,你不能使用24位整数的'重复计数'语法:

struct.unpack_from('920<i', array,0 )

这会产生以下错误:“struct format中的错误计数”。

那么24位整数的语法是什么?我在文档中找不到任何内容。

1 个答案:

答案 0 :(得分:1)

struct本身不支持24位整数。

如果这些是无符号整数,那么你可以使用的是使用array.array() type将数据作为字节读取,然后按照3处理这些:

import array

b = array.array('B', yourdata)
result = [b[i] << 16 | b[i + 1] << 8 | b[i + 2] for i in xrange(0, len(b), 3)]

或者您可以根据需要使用array.fromfile()从文件输入中读取数据:

with open('somefilename', 'rb') as infh:
    b = array.array('B')
    b.fromfile(infh, 920)
    result = [b[i] << 16 | b[i + 1] << 8 | b[i + 2] for i in xrange(0, len(b), 3)]

根据需要调整字节顺序(交换b[i]b[i + 2]引用)。

如果这些是签名的 24位整数,您可能必须坚持struct,并使用空字节填充最低端,然后将结果右移8。这样你就不必担心负数与正数以及如何填写最重要方面的任何一种类型:

[struct.unpack('>i', yourdata[i:i+3] + '\x00')[0] >> 8
 for i in range(0, len(yourdata), 3)]

表示big-endian,

[struct.unpack('<i', '\x00' + yourdata[i:i+3])[0] >> 8
 for i in range(0, len(yourdata), 3)]

对于little-endian签名的24位整数。

如果您使用的是Python 3.2或更高版本,则可以一次读取3个字节的数据,并使用int.from_bytes()转换为整数,这样可以提供更多关于字节序的灵活性,以及​​解析有符号或无符号整数的情况。

相关问题