将C校验和函数转换为Lua

我正在编写一个脚本,允许我的主机设备将数据文件发送到从设备。 从站需要进行校验和计算,并在发送文件之前添加到我的请求的末尾。 我的问题是,我不仅对编程很新,而且还在努力完全掌握位操作。 我目前在一个Java类中,所以校验和function所以部分函数确实有一个熟悉的格式,但由于我仍然在用比特和位库弄乱我的头,我在将提供的校验和函数转换为Lua中。

在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>1 else sum = (sum >> 1) ^ 0xA001; } return sum; } 

现在我正在学校注册一个中级Java课程。 话虽如此,我理解这些function的一些部分。 但正如我之前所说,我仍然没有完全理解位操作的某些方面,以便将这些函数写入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));