0

我有这个 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 迭代(以及位移),然后以十六进制格式打印数字。

def i_lfsr(state,times):
    cstate = state
    for i in range(times):
        cstate = iterate_lfsr(cstate)
    print str(hex(-1 & cstate))

我正在使用数字 0x12345678 测试这个 LFSR,并且每次将其移动一个字节:

>>> 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。这不应该发生——按位移位最终应该将所有内容一次移动一个字节,同时从另一侧填充新字节。

我希望看到输出更接近以下序列(当然是一个例子):

0x12345678
0xef123456
0xbeef1234
0xadbeef12
0xdeadbeef

为什么字节被破坏,我应该怎么做才能解决这个问题?

4

1 回答 1

0
return long(i % pow(2,32))

当需要精确结果时不要使用浮点数。使用 AND、OR 和移位。

于 2012-05-04T02:11:41.310 回答