将 C 校验和函数转换为 Lua
Converting a C Checksum Function to Lua
我正在编写脚本以允许我的主机设备将数据文件发送到从属设备。在发送文件之前,奴隶需要进行校验和计算并将其添加到我的请求的末尾。我的问题是,我不仅对编程还很陌生,而且还在努力完全掌握位操作。我目前处于 Java class 所以校验和函数所以部分函数确实具有熟悉的格式,但由于我仍在用位和位库挠头,我是在将提供的校验和函数转换为 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 class 中级课程。话虽如此,我理解了这些功能的某些部分。但正如我之前所说,为了将这些函数写成 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));
我正在编写脚本以允许我的主机设备将数据文件发送到从属设备。在发送文件之前,奴隶需要进行校验和计算并将其添加到我的请求的末尾。我的问题是,我不仅对编程还很陌生,而且还在努力完全掌握位操作。我目前处于 Java class 所以校验和函数所以部分函数确实具有熟悉的格式,但由于我仍在用位和位库挠头,我是在将提供的校验和函数转换为 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 class 中级课程。话虽如此,我理解了这些功能的某些部分。但正如我之前所说,为了将这些函数写成 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));