3

我有以下算法,我想在 lua 中实现它。我正在锁定如何在 lua 中实现按位运算。

void wepkey64(char *passphrase, unsigned char k64[4][5])
{
    unsigned char pseed[4] = {0};
    unsigned int randNumber, tmp;
    int i, j;

    for(i = 0; i < strlen(passphrase); i++)
    {
        pseed[i%4] ^= (unsigned char) passphrase[i];
    }

    randNumber = pseed[0] | (pseed[1] << 8) | (pseed[2] << 16) | (pseed[3] << 24);

    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 5; j++)
        {
            randNumber = (randNumber * 0x343fd + 0x269ec3) & 0xffffffff;
            tmp = (randNumber >> 16) & 0xff;
            k64[i][j] = (unsigned char) tmp;
        }
    }
}

这个函数在 lua scipting 中的等价物是什么?尤其是按位运算

4

3 回答 3

5

在标准 Lua 5.1 中没有位操作。不过,有两种解决方案是您的问题。

  1. 您可以尝试使用来自LuaJIT的BitOp
  2. 您可以将 C 函数编译为共享库,然后直接从 Lua 调用它。

我会选择选项2。

于 2013-05-10T08:32:06.930 回答
3

查看自 5.2 版以来作为 Lua 标准库一部分的bitlib 库。十六进制整数文字的工作方式与 C 中的方式相同。

这里的一个主要问题是 Lua 使用双精度浮点数来表示数字,但 bitlib 定义的操作是在 32 位整数上执行的。正如文档所述,这两种表示之间的转换有时会导致未定义(即特定于实现)的行为。

于 2013-05-10T08:36:30.390 回答
1

最新版本的 lua 已经支持这个http://www.lua.org/manual/5.2/manual.html#6.7,但是如果你卡在旧版本上:

randNumber = pseed[0] | (pseed[1] << 8) | (pseed[2] << 16) | (pseed[3] << 24); 是等价的pseed[0] + (pseed[1] * 256) + (pseed[2] * 65536) + (pseed[3] * 16777216)

tmp = (randNumber >> 16) & 0xff;相当于(randnumber / 65536) % 0x100(即整数 div 和模运算)

randNumber = (randNumber * 0x343fd + 0x269ec3) & 0xffffffff;大致是`(randNumber * 0x343fd + 0x269ec3) % 0x100000000;

XOR (^) 可以实现为 A^B=A+B-2(A&B)

于 2013-05-10T09:25:40.000 回答