在lua中编写一个函数(包含按位运算)

时间:2013-05-10 08:16:25

标签: c 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 scipting中,这个功能相当于什么?特别是按位操作

3 个答案:

答案 0 :(得分:5)

在标准的Lua 5.1中,没有位操作。有两种解决方案可以解决你的问题。

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

答案 1 :(得分:3)

从版本5.2开始,查看属于Lua标准库的bitlib library。十六进制整数文字就像在C中那样工作。

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

答案 2 :(得分: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&amp; B)