为什么这个LFSR不总是正确地转换?

2024-05-15 12:43:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

^{pr2}$

我测试这个编号为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

为什么字节被损坏,我应该怎么做来修复这个问题?在


Tags: 函数return字节defbit数字integerlong