2013-02-24 2 views
0

Я пытаюсь сделать GIF-анализатор; У меня возникают проблемы с чтением произвольного количества бит в виде целого числа в маленьком значении. Struct хорош для аргументов размера байтов, но некоторые из GIF-структур представляют собой 3-битные минимальные целые числа без знака (в частности, в заголовке GIF, http://www.onicos.com/staff/iz/formats/gif.html). Каков наилучший способ инвертировать эти числа?маленькие биты конца в python

Я попытался обратить вспять порядок байт весь байт/с Struct, но он не хочет, чтобы инвертировать:

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

3 бита или 3 байта ? – entropy

+0

3 бит, для размера палитры и глубины цвета – rsheldiii

+0

@rsheldii: Итак, у вас есть только 8 разных цветов? –

ответ

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 
>>> 

Очевидно, что вам еще нужно извлечь соответствующие биты в число, используя-структуру, но это должно заботиться о проблеме порядка байтов

+0

спасибо, это было так, так как я работал с бинарными данными, это было намного лучше, чем то, что я написал бы для обратных бит – rsheldiii

Смежные вопросы