この 32 ビット LFSR 関数があります。
def wu32(i):
# wrap unsigned 32 bit integer
return long(i % pow(2,32))
def iterate_lfsr(state):
return wu32(wu32(0x00000000L - wu32(state & 0x00000001L)) & 0xd0000001L) ^ wu32(state>>1)
テストのために、この関数をまとめました。この関数は、入力数値に対して特定の回数の LFSR 反復 (したがってビット シフト) を実行し、数値を 16 進形式で出力します。
def i_lfsr(state,times):
cstate = state
for i in range(times):
cstate = iterate_lfsr(cstate)
print str(hex(-1 & cstate))
この LFSR を番号 0x12345678 でテストし、毎回 1 バイトずつシフトしています。
>>> i_lfsr(0x12345678L,0)
0x12345678L
>>> i_lfsr(0x12345678L,8)
0x39123456L
>>> i_lfsr(0x12345678L,16)
0x2d791234L
>>> i_lfsr(0x12345678L,24)
0x87ad7913L
>>> i_lfsr(0x12345678L,32)
0x9727ad78L
ほとんど正常に動作しますが、バイトがわずかに変更されています。0x39 が 0x79 になり、0x2d が 0xad になり、0x12 が 0x13 になり、0x87 が 0x27 になり、0x79 が 0x78 になることに注意してください。これは起こるべきではありません - ビットごとのシフトは、反対側から新しいバイトを埋めながら、最終的に一度に 1 バイト以上すべてを移動する必要があります。
次のシーケンスに近い出力が表示されることを期待していました (もちろん、例です)。
0x12345678
0xef123456
0xbeef1234
0xadbeef12
0xdeadbeef
バイトがマングルされているのはなぜですか? これを修正するにはどうすればよいですか?