繁体   English   中英

将C校验和函数转换为Lua

[英]Converting a C Checksum Function to Lua

我正在编写一个脚本,以允许主机设备将数据文件发送到从属设备。 从属服务器需要进行校验和计算,然后将其添加到我的请求末尾,然后再发送文件。 我的问题是,不仅我对编程不熟悉,而且我仍在尝试完全掌握位操作。 我目前在Java类中,所以校验和函数使函数的某些部分的确具有熟悉的格式,但是由于我仍然用比特和比特库来抓头,因此在将提供的校验和函数转换为a

首先在C中提供功能之前,先对功能进行如下描述:

Initialise the checksum as FFFF(hex).
For each byte
    Checksum = Checksum XOR (current Byte)
    For I = 0 to 7
        If ((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)在翻译中发现任何错误的建议都是我所要的。

由于lua具有位操作,所以它是相同的基本概念。 这是怎么回事,带有一些代码注释:

function CRC(data, length)
    sum = 65535
    local d
    for i = 1, length do
        d = string.byte(data, i)    -- get i-th element, like data[i] in C
        sum = ByteCRC(sum, d)
    end
    return sum
end

function ByteCRC(sum, data)
    sum = sum ~ data
    for i = 0, 7 do     -- lua for loop includes upper bound, so 7, not 8
        if ((sum & 1) == 0) then
            sum = sum >> 1
        else
            sum = (sum >> 1) ~ 0xA001  -- it is integer, no need for string func
        end
    end
    return sum
end

print(CRC("foo", 3));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM