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

Python 24位流没有给出正确的值?,python,block-cipher,Python,Block Cipher,我将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 bloc

我将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'
#为单词“Ozy”创建一个块
bk1=(ord('O')8)+(chr(bk1&0xFF)))
#cbk1的输出为:“O\u4f7ay”

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

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

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的结构模块有助于管理各种形式记录的打包和解包,但在学习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'
>>>