Arn
Arn

Reputation: 600

C to Lua conversion - weird result

I have a C function that I want to convert to LUA but I'm getting strange results out of 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);
}

and here is how I started the 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

Yes, I know the C function is incomplete, I just want to compare what's causing issues.

The prints of the WCRC is C and Lua print completely different numbers for the same input.

Is my Lua conversion incorrect? It is my second or third time using Lua so not quite sure what I'm doing wrong.

***************** UPDATE ********************

So here is the full C and LUA and a quick little test code:

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);
}

and the LUA conversion:

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) )

In C, for the same array I get: CRC16 = 567

In LUA, I get: CRC = 61471

Can someone tell me what I'm doing wrong?

Thanks

Upvotes: 1

Views: 182

Answers (2)

Vlad
Vlad

Reputation: 5847

There's mistakes in altered Lua sample.
1. bit32.band() returns number. Number 0 not equals to 'nil', that's totally different type. You're trying to compare number with nil, and that check will fail always.
2. for iIndex=0,8 do iterates 9 times, including final index 8.

Upvotes: 0

Vyacheslav
Vyacheslav

Reputation: 27221

It seems they yield the same results:

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:

What do you mean?

Upvotes: 1

Related Questions