异或校验怎么写

开始问问看 2019-01-13 03:54:46


异或校验高、低4位的确定:

异或和高、低4位如果小于、等于9,则加上30h,成为 ASCII码数字发送,
例如:异或校验高4位为6,加30h后,为36h即ASCII码的6发送;


异或和高、低4位如果大于9,则加上37h,成为ASCII码字母发送,
例如:异或校验高4位为B,加37h后,为42h即ASCII码的B发送。

...全文
1349 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
脆皮大雪糕 2019-01-14
  • 打赏
  • 举报
回复
按照用例,异或校验值是0x1B, 第 10 和 11应该是 0x31 和 0x42 其中 chr(&h42) = "B"

    Dim aryData(1 To 12) As Byte
    '模拟一个数据包,数据按用例填充。第10、11字节置0,准备计算填充
    aryData(1) = &H2
    aryData(2) = &H2B
    aryData(3) = &H30
    aryData(4) = &H30
    aryData(5) = &H32
    aryData(6) = &H30
    aryData(7) = &H30
    aryData(8) = &H30
    aryData(9) = &H32
    aryData(10) = &H0
    aryData(11) = &H0
    aryData(12) = &H3
    
    
    Dim i As Integer
    Dim btyCheck As Long '计算异或结果,按理应该是byte,但是为了避免后面取高4位时遇到符号位问题,我们用long来处理,这样结果一样但符号位在老远不会影响结果。
    btyCheck = aryData(2) '先取第2个字节
    For i = 3 To 9 '再把2和3~9字节逐个做异或
        btyCheck = btyCheck Xor aryData(i)
    Next
    Debug.Print "异或校验结果:0x" & Hex(btyCheck) '按照用例,这里应该输出1B
    
    Dim btyHi As Byte, btyLo As Byte
    btyLo = btyCheck And &HF     '取低四位
    btyHi = (btyCheck And &HF0) / (2 ^ 4) '取高4位
    Debug.Print "异或校验高四位:0x" & Hex(btyHi) '
    Debug.Print "异或校低高四位:0x" & Hex(btyLo)
    '先把高低位填入
    aryData(10) = btyHi
    aryData(11) = btyLo
    '根据规则处理第10和11字节
    For i = 10 To 11
        If aryData(i) <= 9 Then
            aryData(i) = aryData(i) + &H30
        Else
            aryData(i) = aryData(i) + &H37
        End If
    Next
    Debug.Print "验证结果输出:"
    For i = 1 To 12
        Debug.Print "    data(" & i & ")=" & Format(Hex(aryData(i)), "00")
    Next

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧