2011-11-12 72 views
2

我將3個字母轉換爲它們的ASCII二進制表示法,然後將第一個字母增加16個位置,將第二個字母增加8個位置,最後一個字符停留在原來的位置,以便在配置24位數據流時, 8位表示第一個字母,下一個8表示中間字母,最後一個表示最後一個字母。這裏是我的代碼:Python 24位流沒有提供正確的值?

# 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做正確的事。怎麼了?

回答

1

你好像缺少一個& 0xFF的:

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

得到正確的答案。當重新移回時,還需要屏蔽掉高位,因爲由第一個字符(由16位移位)設置的位將仍然存在。

1

發生這種情況是因爲您忘記過濾掉第一個字母的位!
實際上,第二個字母'z'的ASCII值顯示爲'7a',但正如您所看到的,它的前面有'4f'(即'O'的ASCII碼)。 試着這麼做:
cbk1 = ((chr(bk1>>16)) + (chr((bk1 & 0xFF00)>>8)) + (chr(bk1&0xFF)))

warvariuc的回答中指出,Python的結構模塊有助於管理包裝和各種形式的記錄開箱,而是在你的Python和編纂的學習這一點系統,你可能想要堅持明確的按位操作。

0
>>> 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' 
>>> 
相關問題