24-битный поток Python не дает правильное значение? - PullRequest
2 голосов
/ 13 ноября 2011

Я преобразую 3 буквы в двоичную запись ASCII, а затем увеличиваю первую букву на 16 позиций, вторую - на 8 позиций, а последняя остается на месте, так что при настройке 24-битного потокапервые 8 битных мест представляют первую букву, следующие 8 - среднюю букву, а последние - последнюю букву.Вот мой код:

# create a block for the word 'Ozy'
bk1 = (ord('O')<<16) + (ord('z')<<8) + (ord('y'))
# Now take off the encryption for the block
cbk1 = ((chr(bk1>>16)) + (chr(bk1>>8)) + (chr(bk1&0xFF)))
# output of cbk1 is: 'O\u4f7ay'

Так вот в чем проблема, первая буква была расшифрована как O, последняя буква была правильной, а также y, но по какой-то причине это несделать правильную вещь для z.Что не так?

Ответы [ 3 ]

1 голос
/ 13 ноября 2011

Это происходит потому, что вы забыли отфильтровать биты из первой буквы!
Действительно, значение ASCII для 2-й буквы, 'z', отображается как '7a', но как вывидите, перед ним стоит «4f» (т. е. ASCII для «O»).Попробуйте что-то вроде:
cbk1 = ((chr(bk1>>16)) + (chr((bk1 & 0xFF00)>>8) ) + (chr(bk1&0xFF)))

Как указано в ответе warvariuc , Python-модуль struct помогает управлять упаковкой и распаковкой записей различной формы, но на этом этапеизучая Python и системы кодификации в целом, вы, вероятно, захотите придерживаться явных побитовых манипуляций.

1 голос
/ 13 ноября 2011

Похоже, вам не хватает & 0xff:

cbk1 = ((chr(bk1>>16)) + (chr((bk1>>8) & 0xff)) + (chr(bk1&0xFF)))

дает правильный ответ.При изменении смещения назад вам необходимо также замаскировать старшие биты, потому что биты, установленные первым символом (смещенные на 16 бит), все еще будут там.

0 голосов
/ 13 ноября 2011
>>> import struct
>>> a = chr(0) + 'Ozy' # make the data 4 byte long
>>> x = struct.unpack('>I', a)[0] # convert byte data into unsigned integer of 4 bytes
>>> hex(x) # it should be 3 bytes long, because first byte was 0x00
'0x4f7a79'
>>> a = struct.pack('>I', x)[1:] # pack the integer back to bytes and throw away the left most 0x00 byte
>>> a
'Ozy'
>>> 
...