2

3文字をASCIIバイナリ表記に変換してから、最初の文字を16桁、2番目の文字を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。どうしたの?

4

3 に答える 3

1

& 0xff が欠落しているようです:

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

正しい答えが得られます。再シフトするときは、最初の文字 (16 ビット分シフト) によって設定されたビットがまだ存在するため、上位ビットもマスクする必要があります。

于 2011-11-12T21:12:15.073 に答える
1

これは、最初の文字からビットを除外するのを忘れたために発生します!
実際、2 番目の文字 '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 に答える