我有以下算法,我想在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中,这个功能相当于什么?特别是按位操作
答案 0 :(得分:5)
答案 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)