编写一个包含位运算符的Lua函数。

我有以下算法,我想在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脚本中,这个函数的等价物是什么?特别是位运算。

点赞
用户2195474
用户2195474

在标准 Lua 5.1 中没有位运算。不过你有两种解决方法:

  1. 你可以尝试使用 LuaJIT 中的 BitOp
  2. 你可以编译你的 C 函数为共享库,并直接从 Lua 调用它。

我会选择第二个选项。

2013-05-10 08:32:06
用户577603
用户577603

看一下 Lua 标准库自从 5.2 版本开始的 bitlib 库。十六进制整数字面量像 C 语言中那样工作。

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

2013-05-10 08:36:30
用户1162141
用户1162141

最近版本的 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 (这将是整数除法和模数操作)

randNumber = (randNumber * 0x343fd + 0x269ec3) & 0xffffffff; 稍微近似于 (randNumber * 0x343fd + 0x269ec3) % 0x100000000;

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

2013-05-10 09:25:40