我正在编写一个脚本,允许我的主机设备将数据文件发送到从设备。从站需要进行校验和计算,并在发送文件之前添加到我的请求的末尾。我的问题是,我不仅对编程很新,而且还在努力完全掌握位操作。我目前在Java类中,所以校验和功能所以部分函数确实有一个熟悉的格式,但由于我仍然在用位和位库搔痒我的头,我有问题将提供的校验和函数转换为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<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)发现我翻译中的任何错误都是我正在寻找的。
答案 0 :(得分:2)
由于lua具有位操作,因此它是相同的基本概念。这是怎么回事,有一些代码注释:
numeric_std