c# - C# 中的 CRC-CCITT 16 位计算
问题描述
我正在尝试编写一个用于串行端口通信的程序,我需要发送带有 CRC 的数据包,我正在用 C# 语言编写此代码。
下面是接收方期望的带有 CRC 的示例数据包。
10 02 B1 F0 3F 32 08 00 00 10 03 B4 5C
第二个数据包:10 02 B1 F0 3F 32 07 00 00 10 03 4D EE
10 - DLE 代码
02 - STX
B1 F0 3F 32 08 00 00 是数据
10-DLE
03-ETX
B4 - CRC 低位再见
5C - CRC - 上再见
CCIT : (Fx) = x16 + x12 + x5 + 1
操作初始值:FFFFH
我尝试了一些在线 CRC 计算器,但到目前为止没有运气,任何人都可以指导如何计算上述数据的 CRC(B1 F0 3F 32 08 00 00)?可能可以建议可以给我以上输出的在线计算器(B4 5C)
。
感谢您的意见!
解决方案
我发现了一些有用的东西,但它似乎有点奇怪。
首先我对这两个样本进行异或
10 02 B1 F0 3F 32 08 00 00 10 03 B4 5C
10 02 B1 F0 3F 32 07 00 00 10 03 4D EE
--------------------------------------
00 00 00 00 00 00 0F 00 00 00 00 F9 B2
这消除了初始 CRC 和最终异或值,并导致使用位反映 0x11021 的 CRC。CRC 似乎使用了 8 个字节的数据,包括尾随的 0x10。
使用下面链接的 CRC 计算器,选择任何 CRC16,然后单击自定义并将参数设置为:输入反射检查,输出反射检查,poly = 0x1021。如果没有不同大小的消息,没有足够的信息来确定初始值和最终异或值。使用 8 字节数据,一些示例选项是:初始值 = 0x5B08,最终异或值 = 0x0000,或初始值 = 0xffff,最终异或值 = 0xdde5,或初始值 = 0x0000,最终异或值 = 0xa169。
使用反射参数时,计算器位反转初始值(0x5B08 为 0x17DA 位反转)。对于代码,这 3 个组合是 {0x17da,0x0000}、(0xffff,0xdde5}、{0x0000,0xa169}。Poly = 0x8408 并且是右移。
使用 xx's 来表示 ingored 数据,我得到了
xx xx B1 F0 3F 32 08 00 00 10 xx B4 5C
xx xx B1 F0 3F 32 07 00 00 10 xx 4D EE
由于前两个字节是 {10 02},固定值,因此可以通过更改初始值来包含它们。但是,我无法包含 ETX 03 值。
推荐阅读
- routing - 带有自定义 ValueMapper 的 TYPO3 RouteEnhancer
- ubuntu-16.04 - Ubuntu 16 上 yarn --version 的纱线语法错误
- java - 在 java 中,如何使用正则表达式模式来解析事件名称和两个数字字符串的“Event=Bell,time=9000,rings=5”?
- javascript - 如何将单个对象对象转换为对象数组?
- winforms - Windows 窗体 - 单击按钮将数据添加到列表视图
- java - 比较子实体列表时获取父实体 ID
- r - 如何在 kknn 函数中进行预测?图书馆(kknn)
- python - 如何将数组相乘以输出多个数组而不是相乘的值?
- python - 运行 tox 时如何修复“envreport”中的“UnicodeDecodeError”?
- vim - 紧迫
突然映射到 Esc(而不是字符“#”