C到Lua转换 - 奇怪的结果

时间:2016-09-16 00:40:02

标签: lua

我有一个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

有人能告诉我我做错了吗?

由于

2 个答案:

答案 0 :(得分:1)

它们似乎产生了相同的结果:

pure-C

WCRC = 18432
WCRC = 11520
WCRC = 16640
WCRC = 11520

pure-Lua

BYTE COUNT = 4
WCRC = 18432
BYTE COUNT = 3
WCRC = 11520
BYTE COUNT = 2
WCRC = 16640
BYTE COUNT = 1
WCRC = 11520

ASCII convertor:

你是什么意思?

答案 1 :(得分:0)

改变Lua样本时出现错误 1. bit32.band()返回数字。数字0不等于'nil',这是完全不同的类型。您正在尝试将数字与nil进行比较,并且该检查将始终失败。
2。 for iIndex=0,8 do迭代9次,包括最终索引8。