vb6 - CRC计算错误输出
问题描述
我正在尝试找出串行控制设备的 CRC 检查。我有一个示例,当我将此示例发送到设备时,它会正确响应。
这是设备响应的完整串行字符串:
\x00\x17\x3d\x30\x32\x32\x30\x39\x39\x30\x30\x30\x30\x30\x30\x30\x30\x30\x37\x34\x30\x30\x30\x30\x30\x01\x28
(最后 2 个字节 ( \x01\x28
) 是 CRC 结果)。
这是我的代码:
Dim Send As String
Dim CRC1 As String
Dim CRC2 As String
Dim TEMP As String
Private Sub Command1_Click()
Send = &H0 & &H17 & "=" & "022" & "099" & "00" & "00" & "0000074" & "00000"
CRC1 = &H0
CRC2 = &H0
TEMP = &H0
For i = 1 To Len(Send)
TEMP = CRC1
CRC1 = CRC2 Xor Asc(Mid$(Send, i, 1))
CRC2 = TEMP
Next i
Text1.Text = "CRC1= " & CRC1 & " / CRC2= " & CRC2
End Sub
输出应该是:(CRC1 = 1
十进制)和CRC2 = 40
(十进制)但我得到51
/ 60
。
我认为这与数据类型有关。
这是设备的原始 CRC 公式:
Set <CRC1> and <CRC2> to zero.
For every <CHAR> in <MSG> do
<TEMP> = <CRC1>
<CRC1> = <CRC2> XOR <CHAR>
<CRC2> = <TEMP>
提前致谢!
解决方案
您应该查看您的字符串Send
以确保它是您想要的。它不是。其建设需要:
Send = Chr(&H0) & Chr(&H17) &
...
然后你会得到你正在寻找的答案。
顺便说一句,您正在计算的东西绝不是CRC。写这个公式的人不知道他们在说什么。他们构建的是一个糟糕的校验值算法,所以他们也不知道自己在做什么。
推荐阅读
- avplayer - Apple TV - AVPlayer - 播放直播视频时视频播放器选项菜单上的持续时间
- sql - PLSQL 立即执行 ORA-00955 名称已被现有对象使用
- r - 试图将 Excel CSV 文件放入 R shinydashboard
- jquery - div 不会右对齐
- javascript - 将印度-阿拉伯数字转换为英文数字
- r - 为什么 ggplotly 会丢失我的 scale_size_continuous 图例?
- android - ConnectionService PhoneAccount 在 android 中注册的问题
- java - 从支持等待的 Java 在 Windows 上执行批处理脚本
- python - 无法在 Google Colab 中安装 winsound
- java - jFreeChart的DefaultCategoryDataset中removeValue()和setValue()需要什么参数?