我有一个C函数,我想转换为LUA,但我从Lua得到奇怪的结果:
unsigned short crc16(const char* pstrCurrent, int iCount)
{
unsigned short wCRC = 0;
int iIndex = 0;
while(--iCount >= 0)
{
wCRC = wCRC ^ ((int)(*pstrCurrent++) << 8);
printf ("WCRC = %u\n", wCRC);
}
return (wCRC & 0xFFFF);
}
以下是我开始使用Lua的方式:
local function crc16(keyCurrent, byteCount)
wCRC = 0
byteIndex = 1
local crcInput = {}
while byteCount > 0 do
print ("BYTE COUNT= " .. byteCount)
wCRC=bit32.bxor(wCRC, bit32.lshift(keyCurrent[byteIndex], 8))
print ( "WCRC = " .. wCRC )
byteCount = byteCount-1
byteIndex = byteIndex+1
end
end
是的,我知道C函数不完整,我只想比较造成问题的原因。
WCRC的打印件为C,Lua打印完全不同的数字用于相同的输入。
我的Lua转换不正确吗?这是我第二次或第三次使用Lua,所以不太确定我做错了什么。
*****************更新********************
所以这里是完整的C和LUA以及一个快速的小测试代码:
unsigned short crc16(const char* pstrCurrent, int iCount)
{
unsigned short wCRC = 0;
int iIndex = 0;
// Perform the following for each character in the buffer
while(--iCount >= 0)
{
// Get the byte information for the calculation and
// advance the pointer
wCRC = wCRC ^ ((int)(*pstrCurrent++) << 8);
for(iIndex = 0; iIndex < 8; ++iIndex)
{
if(wCRC & 0x8000)
{
wCRC = (wCRC << 1) ^ 0x1021;
}
else
{
wCRC = wCRC << 1;
}
}
}
return (wCRC & 0xFFFF);
}
和LUA转换:
function crc16 (keyCurrent, iCount)
wCRC = 0
byteIndex = 1
iIndex = 0
local crcInput = {}
while iCount >= 1 do
wCRC = bit32.bxor (wCRC, bit32.lshift(keyCurrent[byteIndex], 8))
for iIndex=0,8 do
if (bit32.band (wCRC, 0x8000) ~= nil ) then
wCRC = bit32.bxor (bit32.lshift (wCRC, 1), 0x1021)
else
wCRC = bit32.lshift (wCRC, 1)
end
end
iCount = iCount-1
byteIndex = byteIndex+1
end
return (bit32.band (wCRC, 0xFFFF))
end
local dKey = {}
dKey = {8, 210, 59, 0, 18, 166, 254, 117}
print ( "CRC = " .. crc16 (dKey ,8) )
在C中,对于相同的数组,我得到:CRC16 = 567
在LUA中,我得到:CRC = 61471
有人能告诉我我做错了吗?
由于
答案 0 :(得分:1)
它们似乎产生了相同的结果:
WCRC = 18432
WCRC = 11520
WCRC = 16640
WCRC = 11520
BYTE COUNT = 4
WCRC = 18432
BYTE COUNT = 3
WCRC = 11520
BYTE COUNT = 2
WCRC = 16640
BYTE COUNT = 1
WCRC = 11520
你是什么意思?
答案 1 :(得分:0)
改变Lua样本时出现错误
1. bit32.band()返回数字。数字0不等于'nil',这是完全不同的类型。您正在尝试将数字与nil进行比较,并且该检查将始终失败。
2。 for iIndex=0,8 do
迭代9次,包括最终索引8。