将一个 C 校验和函数转换成 Lua

我正在编写一个脚本,以便让我的主设备将数据文件发送到从设备。在发送文件之前,从设备需要进行校验和计算并将其添加到我的请求的末尾。我的问题是,我不仅对编程相当陌生,而且还在试图完全掌握位操作。我现在正在上一门Java课程,因此校验和函数的某些部分确实具有熟悉的格式,但由于我还在为位和位库苦苦思索,我在将提供的校验和函数转换为Lua时遇到了问题。

在提供C语言函数之前,首先对该函数进行了描述:

初始化校验和为FFFF(hex)。
对于每个字节
    校验和=校验和XOR(当前字节)
    对于I = 0到7
        如果((Checksum AND 1)=0)
            Checksum = Right_Bit_Shift Checksum 1 bit
        Else
            Checksum = (Right_Bit_Shift Checksum 1 bit) XOR A001(hex)
        Next I
    Next Byte

下面是提供的示例,以C语言编写:

/*
 *Routine CRC takes a data string (data) "length" long and *
 *   * returns the checksum value
 *
 *NOTE   WORD = unsigned short int
 *       BYTE = unsigned char
 */

WORD CRC( BYTE *data, WORD length)
{
    WORD sum = 65535;  /*Checksum value initialised to FFFFhex */
    while (length-- > 0)
    {
        sum = ByteCRC(sum, *data++ );
    }
    return sum;
}

WORD ByteCRC( WORD sum, BYTE data)
{
    WORD i;  /* Loop counter */
    sum = sum ^ (WORD)data;
    for (i=0; i<8; i++)
    {
        if ( (sum&1) == 0)
            sum = sum>>1
        else
            sum = (sum >> 1) ^ 0xA001;
    }
    return sum;
}

现在我目前正在就读一门中级Java课程。话虽如此,我理解其中的某些部分。但是像我之前说的那样,我还没有完全理解某些位操作方面的问题,以便将这些函数写成Lua格式。我正在尝试在Lua中自己重现它,但不认为我是正确的或接近的。不幸的是,我甚至没有足够的理解力来尝试测试这个。这是我根据提供的信息尝试自己编写的:

Function CRC(data, length)
    sum = 65535
    while length > 0 do
        sum = ByteCRC(sum, data=data+1)
        length = length - 1
    end
return sum
end

Function ByteCRC(sum, data)
    sum = sum ~ data
    for i = 0, 8 do
        if ((sum & 1) = 0)
            sum = sum >> 1
        else
            sum = (sum >> 1) ~ string.char(0xA001)
        end
    end
    return sum
end

任何批评和进一步的帮助,帮助我 A) 更好地编写这个和 B) 找到我翻译中的任何错误,都是我要寻求的。

点赞
用户744720
用户744720

由于 Lua 具有位运算,因此基本概念相同。以下是一些代码注释:

function CRC(data, length)
    sum = 65535
    local d
    for i = 1, length do
        d = string.byte(data, i)    -- 获取第 i 个元素,类似于 C 中的 data[i]
        sum = ByteCRC(sum, d)
    end
    return sum
end

function ByteCRC(sum, data)
    sum = sum ~ data
    for i = 0, 7 do     -- Lua 的 for 循环包含上界,因此是 7,而不是 8
        if ((sum & 1) == 0) then
            sum = sum >> 1
        else
            sum = (sum >> 1) ~ 0xA001  -- 它是整数,不需要使用字符串函数
        end
    end
    return sum
end

print(CRC("foo", 3));
2015-12-06 18:48:42