Lua 具有产生nACK响应的校验和函数的函数
对于我当前的应用程序,我正在编写一个插件,允许设备与从设备对话。从设备有两个校验和,一个报头和一个数据校验和。标题校验和产生了一些不稳定的结果,这里的成员对此进行了微调和更正: 现在我不确定我的数据校验和是否正确。我相信这是因为我在这里创建了一个线程来帮助理解和构建它,我在这里做到了: 现在,我不认为这是数据校验和函数。但我相信这是我试图实现它的方式。我现在正试图复制示例代码并将其发送到从属设备,希望收到适当的响应。问题是,我收到了nACK的回报。我尝试了我能想到的每一种排列和组合,但我没有得到一个可接受的值。Lua 具有产生nACK响应的校验和函数的函数,lua,checksum,Lua,Checksum,对于我当前的应用程序,我正在编写一个插件,允许设备与从设备对话。从设备有两个校验和,一个报头和一个数据校验和。标题校验和产生了一些不稳定的结果,这里的成员对此进行了微调和更正: 现在我不确定我的数据校验和是否正确。我相信这是因为我在这里创建了一个线程来帮助理解和构建它,我在这里做到了: 现在,我不认为这是数据校验和函数。但我相信这是我试图实现它的方式。我现在正试图复制示例代码并将其发送到从属设备,希望收到适当的响应。问题是,我收到了nACK的回报。我尝试了我能想到的每一种排列和组合,但我没有得
input
表示我需要发送到下面的函数databuild(str)
函数的字符串
input = "010032380000000000000000000000000000000000000000" -- title must be a specific length so it is filled with NUL's to meet that criteria
function CRC(data, length)
sum = 65535
local d
for i = 1, length do
d = string.byte(data, i)
sum = ByteCRC(sum, d)
end
return sum
end
function ByteCRC(sum, data)
sum = sum ~ data
for i = 0, 7 do
if ((sum & 1) == 0) then
sum = sum >> 1
else
sum = (sum >> 1) ~ 0xA001
end
end
return sum
end
function databuild(str) -- I know I should not be doing what's inside here but don't fully understand why not to and better ways of approaching it.
local dataSum = ""
local dataSumReslt = ""
local dataConv = ""
for char in str:gmatch("..") do
dataConv = dataConv..string.char("0x"..char)
end
dataSum = string.format("%04X", CRC(dataConv, #dataConv))
for char in dataSum:gmatch("..") do
dataSumReslt = dataSumReslt..string.char("0x"..char)
end
return dataConv..dataSumReslt
end
print(databuild(input))
我应该根据print语句中的字节值获取数据校验和。我将整个字符串发送到函数databuild(str)
函数。从那里,我将结果转换为十六进制格式,然后连接该结果(在通过string.char将两个字节的值转换为十六进制后),然后返回整个十六进制字符串
现在,我得到了结果170B
。不幸的是,我的编程水平还不够高,无法正确地调试或测试我收到的消息是否正确
- 在执行
函数CRC(data,length)
之前,我应该先将数据字符串转换为十六进制,还是应该先将其保留为十进制表示,或者这有什么关系
- 既然我的文件中的所有2字节和4字节字都需要是小尾端,这是否意味着我的校验和也应该是小尾端?还是校验和保持不变?(校验和功能在从设备手册的C中提供
- 最后,有什么更好的方法来处理
函数databuild(str)
,这样我就不会分解每个字节,翻译它,然后把它连接起来那么多?当我的代码被更正时,我非常感激。但是有人能帮我确切地理解为什么这不是一件好事吗
由于我对编程基本上是一个新手,所以大多数时候我都不想在这种低级(位操作)上工作。我的任何课程都没有达到这一点,因为它都是高级编程(Java和我在Lua中所知道的自学)。这是我的第一个工作项目,它真正是“火的洗礼”关于字节、十六进制转换等,不用说,我在这里几乎没有什么高见。因此,我得到的所有建设性的批评肯定是需要的。你可以替换
for char in str:gmatch("..") do
dataConv = dataConv..string.char("0x"..char)
end
与
您可以将此简化为
dataConv = str:gsub("..",HEX)
之后
HEX={}
for c=0,255 do
HEX[string.format("%02x",c)] = string.char(c)
end
这将避免连接。您好,您的MarkemImaje打印机有问题
这里有一个错误:
sum=(sum>>1)~0xA001-->sum=(sum>>1)^0xA001
在databuild
中,它不应该是return dataConv..dataSumReslt
?@lhf您是对的。我不知道我在想什么。修复了我原来的问题post@lhf或者任何其他成员,我计划合并lhf在下面提供的代码A)在将字符串发送到函数CRC(数据,长度)
之前,我应该先将数据字符串从十进制转换为十六进制,还是在发送时将其保留为十进制?和B)由于所有的2字节和4字节字都是小尾数,那么结果校验和是否应该以任何方式进行更改,或者让最终结果保持不变?您或其他人能否向我解释为什么最好避免我正在进行的串联?仅仅是因为它需要额外的资源来维护创建每个字节所执行的所有操作吗?或者它通常与位操作有关?我想更好地理解这一点。@Pwrcdr87字符串的每一个串联都需要将这两个部分分配并复制到一个新字符串中。因此,重复的连接会导致巨大的开销和大量必须由垃圾收集器释放的垃圾。使用table.concat
一次连接多个片段将避免大部分开销,使用string.gsub
&co并使它们在遍历时替换部分也是如此。(低级信息:它们使用一个增量增长的luaL_缓冲区
(),避免了大部分复制。)@Info。我将进一步阅读您提到的luaL_Buffer
,以获得更好的理解。@Pwrcdr87好吧,除非您是在C端工作,否则通常不需要知道这一点。(即使如此,只有当您需要手动组合多个字符串时——通常,您可以让asprintf
和其他人为您进行组合。)
HEX={}
for c=0,255 do
HEX[string.format("%02x",c)] = string.char(c)
end