Python 24位流没有给出正确的值



我将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: 'Ou4f7ay'

所以这就是问题所在,第一个字母被解密为O,最后一个字母和y一样正确,但由于某种原因,它不会为z做正确的事情。怎么了?

看起来你少了一个&0 xff:

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

给出正确答案。当重移回来时,你需要屏蔽掉上面的位,因为第一个字符设置的位(移位了16位)仍然在那里。

发生这种情况是因为您忘记过滤掉第一个字母中的位!
事实上,第二个字母"z"的ASCII值显示为"7a",但正如你所看到的,它前面有"4f"(即"O"的ASCII)。试试这样写:
cbk1 = ((chr(bk1>>16)) + (chr((bk1 & 0xFF00)>>8) ) + (chr(bk1&0xFF)))

正如warvariuc的回答中所指出的,Python的struct模块帮助管理各种形式的记录的打包和解包,但是在您学习Python和整个编码系统的这一点上,您可能希望坚持使用显式的按位操作。

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

相关内容

  • 没有找到相关文章

最新更新