python中的小尾部位

时间:2013-02-24 23:55:30

标签: python struct endianness

我正在尝试制作GIF分析仪;我在读取任意数量的位作为小端的整数时遇到问题。 Struct对于字节大小的参数很好,但是一些GIF结构是3位小端无符号整数(特别是在GIF头中,http://www.onicos.com/staff/iz/formats/gif.html)。反转这些数字的最佳方法是什么?

我尝试用Struct来反转整个字节的字节序,但它不想反转:

struct.unpack('<'+str(len(string))+'s',string)[0] //does not actually invert

1 个答案:

答案 0 :(得分:1)

我不知道你是否可以使用struct来处理小于一个字节的事情。但如果你不太担心速度,你可以尝试这个功能。它需要一个数字来反转并以位为单位并返回相反的结果。

def reverse(a,size):
    b = 0
    for i in range(size):
        b <<= 1
        b |= a >> i & 1
    return b

像这样使用它:

>>> reverse(3,3) # 011 => 110
6
>>> invert(6,3) # 110 => 011
3
>>> invert(4,3) # 100 => 001
1
>>> invert(5,3) # 101 => 111
5
>>> 

显然,您仍然需要使用struct将相关位提取到数字中,但这应该处理字节序问题