2

我将 3 个字母转换为它们的 ASCII 二进制符号,然后将第一个字母增加 16 位,第二个字母增加 8 位,最后一个字母保持原位,这样当配置 24 位流时,前 8 位places 代表第一个字母,接下来的 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. 怎么了?

4

3 回答 3

1

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

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

得出正确答案。重新移位时,您还需要屏蔽高位,因为第一个字符设置的位(移位 16 位)仍然存在。

于 2011-11-12T21:12:15.073 回答
1

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

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

于 2011-11-12T21:12:19.240 回答
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'
>>> 
于 2011-11-12T21:18:14.957 回答