Python中的小端位序

0 投票
1 回答
1921 浏览
提问于 2025-04-17 16:59

我正在尝试制作一个GIF分析器,但在读取任意数量的位作为小端整数时遇到了问题。使用结构体(Struct)处理字节大小的参数还不错,但有些GIF结构是3位的小端无符号整数(特别是在GIF头部,http://www.onicos.com/staff/iz/formats/gif.html)。请问有什么好的方法来反转这些数字吗?

我尝试过用结构体反转整个字节的字节序,但它似乎不想反转:

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

1 个回答

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 把相关的位提取成一个数字,但这个方法应该可以解决字节序的问题。

撰写回答