CRC-CCITT问题,急求助!

超越_zww 2015-08-07 03:33:29
数据内容:"00421001000000014E4F424F45574247375032303135303830343134333831396434663235623238383039353639303932323262303561646561326163663731"
如果我想对上面这段数据进行CRC-CCITT校验,CRC-CCITT码生成多项式为:x16+x12+x5+10 简记式为:1021
计算CRC检验时初始值从0x0000开始。
从网上找了很多VB代码,计算结果都不对,头大了。急求大家帮忙。谢了!
...全文
547 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-08-17
  • 打赏
  • 举报
回复
我算出来的 24A4 和 tst_crc.exe 的 CRC-CCITT (0x0000) 一致(包括其它不同初始值结果也一致)。
不可能两个来源的算法都错了吧。
说明程序完全没问题了。

至于其它问题,按照初始值0算出541E的,应该是哪段数据,你可以直接拿tst_crc.exe去和协作方当场验算。
这应该是你自己去沟通解决的问题了。
超越_zww 2015-08-14
  • 打赏
  • 举报
回复
引用 27 楼 Tiger_Zhao 的回复:
你看不懂HexToArr()还是没看tst_crc.exe的帮助。 又:回复请不要全文引用。
对不起,我没仔细看,HexToArr()这个方法是没错的。 按你的方法,用初始值&H5498,发上去给平台验证,没通过,我以为是数据搞错了,可能是这种方式不妥。 因对方平台要求是: 校验的范围为不包含帧头、帧尾和校验值的全部数据内容的CRC-CCITT码校验值,高字节在前,低字节在后。CRC-CCITT码生成多项式为x16+x12+x5+10,简记式为:1021。 计算CRC校验时初值从0x0000开始,校验值占两个字节。 数据包由五部分构成:帧头标示、数据头、数据体、校验值,帧尾标示。
Tiger_Zhao 2015-08-14
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 zwwall 的回复:]对不起,你搞错了。
样本数据不是字符串,而是十六进制数据[/Quote]
你看不懂HexToArr()还是没看tst_crc.exe的帮助。

又:回复请不要全文引用。
超越_zww 2015-08-14
  • 打赏
  • 举报
回复
引用 25 楼 Tiger_Zhao 的回复:
按照你#13的数据,找到初始值是&H5498&。
'http://bbs.csdn.net/topics/391542907
Option Explicit

'这是按我#11链接中的逐位计算法翻译的'
Public Function CRC_CCITT(buf() As Byte, ByVal InitCRC As Long) As Long
    Dim shift       As Long
    Dim Data        As Long
    Dim val         As Long
    Dim i           As Long
    Dim j           As Long

    shift = InitCRC And &HFFFF&

    For i = 0 To UBound(buf)
        Data = buf(i) * &H100&
        For j = 1 To 8
            val = shift Xor Data
            shift = (shift * 2) And &HFFFF&
            Data = (Data * 2) And &HFFFF&
            If (val And &H8000&) = &H8000& Then
                shift = shift Xor &H1021&
            End If

        Next
    Next

    CRC_CCITT = (shift And &HFFFF&)
End Function

Sub Main()
    Dim Data()      As Byte
    Data = HexToArr("004210010000000042555159465047424D5432303135303831313130353232306365633264623062366130643062316139303432303030656633336535336562")
    Debug.Print "0000", Hex(CRC_CCITT(Data, 0))
    Debug.Print "FFFF", Hex(CRC_CCITT(Data, &HFFFF&))
    Debug.Print "1D0F", Hex(CRC_CCITT(Data, &H1D0F&))
    Debug.Print "5498", Hex(CRC_CCITT(Data, &H5498&))
End Sub

'这是用来找到&H5498&这个初始值的方法'
Sub FindInitCRC()
    Dim i           As Long
    Dim crc         As Long
    Dim Data()      As Byte
    Data = HexToArr("004210010000000042555159465047424D5432303135303831313130353232306365633264623062366130643062316139303432303030656633336535336562")

    For i = 0 To &HFFFF&
        crc = CRC_CCITT(Data, i)
        Debug.Print Hex(i), Hex(crc)
        If crc = &H541E Then Exit For
    Next

End Sub

Public Function HexToArr(ByVal Data As String) As Byte()
    '借用#6的代码'
End Function
输出
0000      24A4
FFFF          F27E
1D0F          F112
5498          541E
这是用#15链接中下载的lib_crc.zip进行的测试。 用来验证翻译的CRC_CCITT()正确性。
D:\CRC>tst_crc.exe -x

CRC algorithm sample program
Lammert Bies,  Version 1.16

Input: 004210010000000042555159465047424D543230313530383131313035323230636563326
4623062366130643062316139303432303030656633336535336562
"" :
CRC16              = 0x0BE7      /  3047
CRC16 (Modbus)     = 0x24A7      /  9383
CRC16 (Sick)       = 0x5F25      /  24357
CRC-CCITT (0x0000) = 0x24A4      /  9380
CRC-CCITT (0xffff) = 0xF27E      /  62078
CRC-CCITT (0x1d0f) = 0xF112      /  61714
CRC-CCITT (Kermit) = 0xA172      /  41330
CRC-DNP            = 0x082E      /  2094
CRC32              = 0x653399C1  /  1697880513
================================================================ 对不起,你搞错了。 样本数据不是字符串,而是十六进制数据“004210010000000042555159465047424D5432303135303831313130353232306365633264623062366130643062316139303432303030656633336535336562”,得到的正确CCITT检验码是“541E”。
超越_zww 2015-08-13
  • 打赏
  • 举报
回复
]
引用 23 楼 bakw 的回复:
这是准备破解通讯,还是外围开发,如果是外围开发的话,建议还是问一下设备提供商,他们会给你详细解答的,只是你要找对人问,追着他们问,不然问不对人的话,可能会被忽悠了 如果是破解,那就不好搞了 你这个数据包可以解成ASCII码,大部分都是可读的,而且还有一层十六进制码,NOBOEWBG7P20150804143819d4f25b2880956909222b05adea2acf71 校验码可能是针对其中的一部分来校验的。
没错,数据内容,是ASSII码的,红色部分经过MD5加密处理。 ================================================== 这个是完整说明: 校验的范围为不包含帧头、帧尾和校验值的全部数据内容的CRC-CCITT码校验值,高字节在前,低字节在后。CRC-CCITT码生成多项式为x16+x12+x5+10,简记式为:1021。 计算CRC校验时初值从0x0000开始,校验值占两个字节。 数据包由五部分构成:帧头标示、数据头、数据体、校验值,帧尾标示。
Tiger_Zhao 2015-08-13
  • 打赏
  • 举报
回复
按照你#13的数据,找到初始值是&H5498&。
'http://bbs.csdn.net/topics/391542907
Option Explicit

'这是按我#11链接中的逐位计算法翻译的'
Public Function CRC_CCITT(buf() As Byte, ByVal InitCRC As Long) As Long
Dim shift As Long
Dim Data As Long
Dim val As Long
Dim i As Long
Dim j As Long

shift = InitCRC And &HFFFF&

For i = 0 To UBound(buf)
Data = buf(i) * &H100&
For j = 1 To 8
val = shift Xor Data
shift = (shift * 2) And &HFFFF&
Data = (Data * 2) And &HFFFF&
If (val And &H8000&) = &H8000& Then
shift = shift Xor &H1021&
End If

Next
Next

CRC_CCITT = (shift And &HFFFF&)
End Function

Sub Main()
Dim Data() As Byte
Data = HexToArr("004210010000000042555159465047424D5432303135303831313130353232306365633264623062366130643062316139303432303030656633336535336562")
Debug.Print "0000", Hex(CRC_CCITT(Data, 0))
Debug.Print "FFFF", Hex(CRC_CCITT(Data, &HFFFF&))
Debug.Print "1D0F", Hex(CRC_CCITT(Data, &H1D0F&))
Debug.Print "5498", Hex(CRC_CCITT(Data, &H5498&))
End Sub

'这是用来找到&H5498&这个初始值的方法'
Sub FindInitCRC()
Dim i As Long
Dim crc As Long
Dim Data() As Byte
Data = HexToArr("004210010000000042555159465047424D5432303135303831313130353232306365633264623062366130643062316139303432303030656633336535336562")

For i = 0 To &HFFFF&
crc = CRC_CCITT(Data, i)
Debug.Print Hex(i), Hex(crc)
If crc = &H541E Then Exit For
Next

End Sub

Public Function HexToArr(ByVal Data As String) As Byte()
'借用#6的代码'
End Function

输出
0000      24A4
FFFF F27E
1D0F F112
5498 541E

这是用#15链接中下载的lib_crc.zip进行的测试。
用来验证翻译的CRC_CCITT()正确性。
D:\CRC>tst_crc.exe -x

CRC algorithm sample program
Lammert Bies, Version 1.16

Input: 004210010000000042555159465047424D543230313530383131313035323230636563326
4623062366130643062316139303432303030656633336535336562
"" :
CRC16 = 0x0BE7 / 3047
CRC16 (Modbus) = 0x24A7 / 9383
CRC16 (Sick) = 0x5F25 / 24357
CRC-CCITT (0x0000) = 0x24A4 / 9380
CRC-CCITT (0xffff) = 0xF27E / 62078
CRC-CCITT (0x1d0f) = 0xF112 / 61714
CRC-CCITT (Kermit) = 0xA172 / 41330
CRC-DNP = 0x082E / 2094
CRC32 = 0x653399C1 / 1697880513
Tiger_Zhao 2015-08-12
  • 打赏
  • 举报
回复
如15楼所说,你的协议不是已知的一种,算出来结果没法和541E对上号。
超越_zww 2015-08-12
  • 打赏
  • 举报
回复
被老板狂批了一顿
笨狗先飞 2015-08-12
  • 打赏
  • 举报
回复
这是准备破解通讯,还是外围开发,如果是外围开发的话,建议还是问一下设备提供商,他们会给你详细解答的,只是你要找对人问,追着他们问,不然问不对人的话,可能会被忽悠了 如果是破解,那就不好搞了 你这个数据包可以解成ASCII码,大部分都是可读的,而且还有一层十六进制码,NOBOEWBG7P20150804143819d4f25b2880956909222b05adea2acf71 校验码可能是针对其中的一部分来校验的。
超越_zww 2015-08-12
  • 打赏
  • 举报
回复
引用 19 楼 of123 的回复:
你写一个程序测试一下吧。 首先,设定一种初始值和先入方式,与一个标准 CRC-CCITT 在线得到相同的 CRC 值,确认你的算法代码是正确的。 然后,尝试从 0000 到 FFFF 的所有初始值和高位先入、低位先入,直至找到与预期的 541E 相同的那一个。 如果遍历了以后还没有,那就是多项式也不一样了。
交通平台,只给出这么一点啥也没有。 数据内容,CRC-CCITT校验,CRC-CCITT码生成多项式为:x16+x12+x5+10 简记式为:1021 计算CRC检验时初始值从0x0000开始。
超越_zww 2015-08-12
  • 打赏
  • 举报
回复
引用 20 楼 zdingyun 的回复:
[quote=引用 17 楼 zwwall 的回复:] 被老板狂批了一顿
那么老板有代码吗?[/quote] 老板懂个屁,只说好几天还搞不定,不是很简单。靠!
zdingyun 2015-08-12
  • 打赏
  • 举报
回复
引用 17 楼 zwwall 的回复:
被老板狂批了一顿
那么老板有代码吗?
of123 2015-08-12
  • 打赏
  • 举报
回复
你写一个程序测试一下吧。 首先,设定一种初始值和先入方式,与一个标准 CRC-CCITT 在线得到相同的 CRC 值,确认你的算法代码是正确的。 然后,尝试从 0000 到 FFFF 的所有初始值和高位先入、低位先入,直至找到与预期的 541E 相同的那一个。 如果遍历了以后还没有,那就是多项式也不一样了。
超越_zww 2015-08-11
  • 打赏
  • 举报
回复
我去找了很多CCITT算法,得到值,都不是以上值。
超越_zww 2015-08-11
  • 打赏
  • 举报
回复
引用 10 楼 bakw 的回复:
好歹也给个数据的样本啊,数据,还有对应验证码
样本数据: 十六进制数据“004210010000000042555159465047424D5432303135303831313130353232306365633264623062366130643062316139303432303030656633336535336562”,得到的正确CCITT检验码是“541E”。
of123 2015-08-11
  • 打赏
  • 举报
回复
建议查表法。
超越_zww 2015-08-11
  • 打赏
  • 举报
回复
大家帮帮忙啊,急!在线等。
of123 2015-08-11
  • 打赏
  • 举报
回复
CRC-CCITT 是多项式相同的一类 CRC 协议的总称。 由于不同初始值以及高位还是低位先入,CRC-CCITT 也分成很多具体的协议。常见的有: CRC-CCITT (XModem) CRC-CCITT (0xFFFF) CRC-CCITT (0x1D0F) CRC-CCITT (Kermit) 你的协议,似乎不属于上述任何一种。 有一个 CRC 在线计算网站,可以算多种 CRC 的:http://www.lammertbies.nl/comm/info/crc-calculation.html
超越_zww 2015-08-10
  • 打赏
  • 举报
回复
大家帮帮忙啊,急!
Tiger_Zhao 2015-08-10
  • 打赏
  • 举报
回复
可以用查表法:CRC16 三种算法及c实现
加载更多回复(9)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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