问题标签 [crc16]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1057 浏览

java - sun.misc.CRC16 使用什么 CRC-16 实现?

我正在做的工作需要我们将 CRC16 校验和与数据行一起存储,最近我发现 sun.misc.CRC16 的性能是我们正在运行的代码的主要瓶颈之一。

我从搜索中发现,使用查找表实现 CRC16 会给我带来我正在寻找的性能提升,而且还有许多不同的标准。由于可能需要一些时间来尝试获得有关用户实际想要的任何类型的答案,同时我想将 sun.misc.CRC16 替换为其查找表功能等效项。但是,我能够在课程本身上找到的唯一真正的文档/资源并没有真正详细说明——或者至少,我对 CRC 的理解还不够好。

0 投票
2 回答
3053 浏览

hash - 试图对数据包校验和/CRC/哈希进行逆向工程

我有一个旧的、不再生产的带有串行端口的电子设备。我正在尝试对该设备中使用的数据包 CRC/校验和/哈希进行逆向工程。

任何有敏锐的眼睛,敏锐的数学技能的人都可以破解这个东西吗?

这是我到目前为止所知道的......

  • 每个数据包总是 21 个字节。19 个字节的数据加上 2 个字节用于 CRC/校验和/哈希
  • 因此,这里没有长度或标题字节。哈希计算涉及所有 19 个字节。
  • 我有能力用设备生成一定数量的数据包
  • 我的第一个想法是数据包有某种 CRC-16 计算
  • 所以我遵循了www.cosc.canterbury.ac.nz/greg.ewing/essays/CRC-Reverse-Engineering.html中的反转提示
  • 验证我的数据包样本符合上述网页链接中概述的“叠加原理”。这表明它们具有数学 XOR 关系。

  • 开始感觉很好……但在那之后就难住了。无法确定 CRC-16 多项式。这些数据包哈希很可能与 CRC 无关,而是一些自制方案。

  • 通读 Ross N. Williams 的“CRC 错误检测算法的无痛指南”

  • http://www.ross.net/crc/download/crc_v3.txt
  • 还使用的应用程序:CRC Reveng – 逆向工程应用程序
  • 见 reveng.sourceforge.net
  • 还是没有运气...
  • 不幸的是,我无权访问任何设备源/二进制代码

  • 还进行了测试以查看是否使用了其他哈希值,例如 Fletcher 的校验和

这是我的数据包的各种样本。

0x47366B2EE00000000000751CEB5F3469543B585E2D
0x47366B2ED00000000000751CEB5F3469543B582A2C
0x47366B2EC80000000000751CEB5F3469543B580B2B
0x47366B2EC40000000000751CEB5F3469543B58BB2A
0x47366B2EC20040000000751CEB5F3469543B58DFE7
0x47366B2EC10000000000751CEB5F3469543B58A328
0x47366B2EC08000000000751CEB5F3469543B584127
0x47366B2EC04000000000751CEB5F3469543B588126
0x47366B2EC02000000000751CEB5F3469543B580525
0x47366B2EC01000000000751CEB5F3469543B580124

请注意以下关于这些数据包的...

  • 在数据包的最后 2 个字节上找到 CRC。
  • 如果我查看逻辑分析仪上的位,我已将字节表示为 MSB-first
  • 因此,数据包 0x47366B2EE00000000000751CEB5F3469543B585E2D 在二进制中被视为:
  • 01000111 .................................................... ............00101101
  • (0x47).​​................................................. ......................(0x2D)

  • 我不知道我的系统是大端还是小端,但相当确定的字节是 LSB 优先的

  • 请注意,对于上述 10 个数据包样本,每个数据包的不同之处在于 1 个位移至 10 个位位置。除了第 5 个数据包,我必须更改 2 位
  • 查看数据包的 0x47366B2E 部分之后的数据字节。

  • 我看到的唯一模式是每个数据包的最后一个字节减一(2D,2C,...)。(除了第 5 个数据包,我必须更改 2 位)

  • 最后一个字节不是某种序列号,因为我可以随时以相同的值生成它们。
  • 但它可能会提示使用的数学哈希。

任何帮助表示赞赏!

0 投票
1 回答
280 浏览

c# - 将 C# 单元测试转换为方法

我得到了一些作为 xunit 单元测试编写的代码。我需要在我的应用程序中使用此代码来生成 CRC-16。我怎样才能得到下面的代码来返回我需要的东西?

0 投票
2 回答
69230 浏览

c# - 如何从 C# 生成 CRC-16

我正在尝试使用 C# 生成 CRC-16。我用于 RS232 的硬件要求输入字符串为 HEX。下面的屏幕截图显示了正确的转换,对于测试,我需要 8000 为 0xC061,但是生成 CRC-16 的 C# 方法必须能够转换任何给定的 HEX 字符串。

所需输出的屏幕截图。

我试过使用 Nito.KitchenSink.CRC

我还尝试了以下在输入 8000 时生成 8009 -

0 投票
2 回答
11667 浏览

vb.net - VB.NET 计算字符串或字节数组的 CRC16 的示例

参考此链接 Calculate CRC32 of an String or Byte Array 我修改了代码以计算CRC16而不是CRC32,但是我得到了错误的结果,有人能指出错误在哪里吗?

0 投票
1 回答
1173 浏览

php - 具有位反射的自定义 CRC16

为了扩展和解释上面发布的链接,这里是 PHP 中的一个函数,用于获取字符串数据的 CRC16 校验和:

如果您不想添加反射,请在函数 crc16() 中替换这些行:

替换Refin = True:

使用 Refin = False:

替换 Refout = True:

使用 Refout = False (删除这一整行):

0 投票
1 回答
386 浏览

java - JAVA CRC16 函数返回 3 个字符而不是 4 个字符的响应

我有一个如下所示的 Java CRC16 函数,我需要它返回一个 4 长度的字母数字结果。但有时它只返回一个 3 长度的字母数字。为什么?我将此 CRC 与计算 CRC 的 C 应用程序进行交叉比较,通常它是相同的 CRC,但 JAVA 有时会返回一个 3 个字符的结果,这会引发异常。为什么?

0 投票
3 回答
19186 浏览

c++ - C++ 中的 CRC-16 (IBM) 反向查找

我无法创建与特定输出匹配的 Maxim CRC-16 算法。我列出了我用来帮助我编写以下程序的资源:

借助上述参考资料,我编写了一个简单的程序,该程序将使用逐位方法和查找表方法来计算 CRC-16。逐位方法如下所示

下面是 CRC-16 计算的查找表版本

使用这些等式,我可以计算一个 8 位十六进制数的数组来计算 CRC-16 校验和值。该代码确实编译并运行,没有任何错误。

当我尝试验证这些计算的正确性时,问题就出现了。我的目标是尝试使 CRC-16 以与该系统相同的方式工作。换句话说,我想创建一个系统来模拟另一个系统上使用的 CRC-16 计算。

下面是发送到原始系统的 CRC-16 计算器的消息的描述:

“这个 CRC 是使用 CRC-16 多项式生成的,首先清除 CRC 生成器,然后移入 Write Scratchpad 命令的命令代码 (0Fh)、目标地址(TA1 和 TA2)以及所有数据字节......数据从暂存器的开头开始写入暂存器。”

有了这个,我使用以下输入:

在原始系统中,CRC-16 输出为0x4E2A,这不是查找表或逐位 CRC-16 的输出。事实上,查找表计算器的 CRC-16 输出与逐位计算器的 CRC-16 输出不匹配。这并不令人意外,因为我用于此计算的表格很可能与我计算 CRC-16 的其他方法不同。

TL;DR:最终,我想要的是一种计算 CRC-16 的方法,以便它与我发送给定输入时原始系统给出的输出相匹配。我也有兴趣了解如何制作 CRC-16 查找表,以便它与我的逐位方法相匹配(也使用我的 8 位数字数组作为输入)。任何意见,将不胜感激。

0 投票
1 回答
8968 浏览

python - 如何在 Python 的 crcmod 库上获得 CCITT-CRC16?

我在使用 CRCMOD 库在 Python 3.4 中编写代码以获取 CCITT CRC16 检查时遇到问题。

那是我的字符串:

预期的 crc 值为1d7f

我的代码:

它返回:7d67

我究竟做错了什么?

0 投票
1 回答
499 浏览

crc - 试图理解不同的 CRC 实现

取自 IEEE 802.3,

在数学上,对应于给定 MAC 帧的 CRC 值由以下过程定义:

a) 帧的前 32 位被补码。
b) 受保护字段的 n 位然后被认为是次数为 n – 1 的多项式 M(x) 的系数。(目标地址字段的第一位对应于 x(n–1) 项和MAC 客户端数据字段(或填充字段,如果存在)的最后一位对应于 x0 项。)
c) M(x) 乘以 x32 并除以 G(x),产生度数 ≤ 的余数 R(x) 31.
d) R(x) 的系数被认为是一个 32 位序列。
e) 对位序列进行补码,结果为 CRC。

https://www.kernel.org/doc/Documentation/crc32.txt

以这种方式编写的大端 CRC 编码如下:

c)部分在哪里M(x) 乘以 x^32我没有看到任何数字附加了 32 个零。

以下代码对我来说也毫无意义。代码和数学并不真正匹配。

评估 CRC-32 实现的差异

这些实现在做什么?它们都没有真正类似于原始程序。

即使在阅读完这篇文章的最后它仍然没有意义: http ://www.relisoft.com/science/crcmath.html