具有产生 nACK 响应的校验和函数的函数
Function with Checksum Function Producing nACK Responses
对于我当前的应用程序,我正在编写一个允许设备与从属设备通信的插件。从设备有两个校验和,一个 header 和一个数据校验和。 header 校验和产生了一些不稳定的结果,这里的成员对其进行了微调和更正:
现在我不确定我的数据校验和是否正确。我相信这是因为我在这里创建了一个线程来帮助理解和构建它,我在这里做了:
现在,我不认为它是数据校验和功能。但我相信这是我尝试实现它的方式。我现在正试图复制示例代码并将其发送到我的从属设备,希望我能收到适当的响应。问题是我在 return 中收到 nACK。我已经尝试了我能想到的每一种排列和组合,但我没有收到可接受的值。 input
表示我需要发送到下面的 function 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))
我应该根据打印语句中的那些字节值获取数据校验和。我将整个字符串发送到 function databuild(str)
函数。从那里我将结果转换为十六进制格式,然后连接该结果(在通过 string.char
将 two-byte 值转换为十六进制之后),然后连接 return 整个十六进制字符串。
现在,我得到了结果 170B
。不幸的是,我的编程水平还不够高,无法正确调试或测试我收到的信息是否真实。
我应该在执行 function CRC(data, length)
之前先将数据字符串转换为十六进制,还是应该先将其保留为十进制表示形式,或者这有什么关系吗???
因为我的文件中的所有 2 字节和 4 字节的字都需要是 little-endian,这是否意味着我的校验和也应该是 little-endian?还是校验和保持不变? (校验和功能在从设备手册中的 C 中提供。
最后,什么是处理 function databuild(str)
的更好方法,这样我就不会分解每个字节,翻译它,然后将它连接这么多?当我的代码被更正时,我非常感激。但是有人可以帮助我确切地理解为什么这不是一件好事吗?
由于我对一般编程还很陌生,所以大多数时候我并不想在这个 low-level(位操作)上工作。我在我的任何 类 中都没有达到这一点,因为它一直都是 higher-level 编程(Java 和 self-taught 我在 Lua 中知道的)。这是我的第一个工作项目,它真正 "baptism by fire" 涉及字节、十六进制转换等。不用说,我在这里勉强保持头脑清醒。所以我得到的所有建设性批评都是绝对需要的。
你可以替换
for char in str:gmatch("..") do
dataConv = dataConv..string.char("0x"..char)
end
与
dataConv = str:gsub("..",function (x) return string.char(tonumber(x,16)) 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
对于我当前的应用程序,我正在编写一个允许设备与从属设备通信的插件。从设备有两个校验和,一个 header 和一个数据校验和。 header 校验和产生了一些不稳定的结果,这里的成员对其进行了微调和更正:
现在我不确定我的数据校验和是否正确。我相信这是因为我在这里创建了一个线程来帮助理解和构建它,我在这里做了:
现在,我不认为它是数据校验和功能。但我相信这是我尝试实现它的方式。我现在正试图复制示例代码并将其发送到我的从属设备,希望我能收到适当的响应。问题是我在 return 中收到 nACK。我已经尝试了我能想到的每一种排列和组合,但我没有收到可接受的值。 input
表示我需要发送到下面的 function 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))
我应该根据打印语句中的那些字节值获取数据校验和。我将整个字符串发送到 function databuild(str)
函数。从那里我将结果转换为十六进制格式,然后连接该结果(在通过 string.char
将 two-byte 值转换为十六进制之后),然后连接 return 整个十六进制字符串。
现在,我得到了结果 170B
。不幸的是,我的编程水平还不够高,无法正确调试或测试我收到的信息是否真实。
我应该在执行
function CRC(data, length)
之前先将数据字符串转换为十六进制,还是应该先将其保留为十进制表示形式,或者这有什么关系吗???因为我的文件中的所有 2 字节和 4 字节的字都需要是 little-endian,这是否意味着我的校验和也应该是 little-endian?还是校验和保持不变? (校验和功能在从设备手册中的 C 中提供。
最后,什么是处理
function databuild(str)
的更好方法,这样我就不会分解每个字节,翻译它,然后将它连接这么多?当我的代码被更正时,我非常感激。但是有人可以帮助我确切地理解为什么这不是一件好事吗?
由于我对一般编程还很陌生,所以大多数时候我并不想在这个 low-level(位操作)上工作。我在我的任何 类 中都没有达到这一点,因为它一直都是 higher-level 编程(Java 和 self-taught 我在 Lua 中知道的)。这是我的第一个工作项目,它真正 "baptism by fire" 涉及字节、十六进制转换等。不用说,我在这里勉强保持头脑清醒。所以我得到的所有建设性批评都是绝对需要的。
你可以替换
for char in str:gmatch("..") do
dataConv = dataConv..string.char("0x"..char)
end
与
dataConv = str:gsub("..",function (x) return string.char(tonumber(x,16)) 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