大多数静态数据流的 CRC 计算

2023-12-02

背景:

我有一段内存,1024字节。最后 1020 字节始终相同。前 4 个字节将发生变化(产品的序列号)。我需要计算CRC-16 CCITT(0xFFFF 起始,0x1021 掩码)对于整个内存部分,CRC_WHOLE.

问题:

是否可以仅计算前 4 个字节的 CRC,CRC_A,然后应用如下函数来计算完整的 CRC?我们可以假设最后 1020 个字节的校验和,CRC_B,是已知的。

CRC_WHOLE = XOR(CRC_A, CRC_B)

我知道这个公式不起作用(尝试过),但我希望存在类似的东西。


是的。你可以看到如何在zlib's crc32_combine()。如果有两个序列 A 和 B,则 AB 的纯 CRC 是 A0 的 CRC 和 0B 的 CRC 的异或,其中 0 代表一系列零字节以及相应序列的长度,即 B和 A 分别。

对于您的应用程序,您可以预先计算一个运算符,该运算符非常快速地将 1020 个零应用于前四个字节的 CRC。然后您可以将其与预先计算的 1020 字节的 CRC 进行异或。

Update:

这是我 2008 年发表的一篇文章,其中包含 @ArtemB 发现的详细解释(我已经忘记了):

crc32_combine()zlib 中的方法基于两个关键技巧。对于接下来的内容, 我们不考虑标准 32 位 CRC 是前后的事实 有条件的。我们可以稍后再处理。现在假设 CRC 没有这样的条件,因此从寄存器开始 零。

技巧#1:CRC 是线性的。因此,如果您有流 X 和流 Y 相同长度且异或两个流逐位得到 Z, 即 Z = X ^ Y(使用 C 表示法进行异或),则 CRC(Z) = CRC(X) ^ CRC(Y)。对于当前的问题,我们有两个流 A 和 B 我们想要连接到流 Z 中的不同长度。什么 我们可用的是 CRC(A) 和 CRC(B)。我们想要的是一种快速的方法 计算 CRC(Z)。诀窍是构造 X = A 连接 length(B) 零位,并且 Y = length(A) 零位与 B 连接。 因此,如果我们简单地通过并置来表示串联 符号,X = A0,Y = 0B,则 X^Y = Z = AB。那么我们有 CRC(Z) = CRC(A0)^CRC(0B)。

现在我们需要知道 CRC(A0) 和 CRC(0B)。 CRC(0B) 很简单。如果我们喂食 CRC 机以零开头的一串零,寄存器 仍然充满了零。所以就好像我们什么也没做一样。 因此 CRC(0B) = CRC(B)。

然而,CRC(A0) 需要更多工作。采取非零 CRC 并馈送 CRC 机器的零并不会放过它。每一个零都会发生变化 寄存器内容。所以要得到CRC(A0),我们需要设置寄存器 到 CRC(A),然后通过它运行长度(B) 零。那么我们就可以 与 CRC(B) = CRC(0B) 进行异或,我们得到 我们想要的是 CRC(Z) = CRC(AB)。瞧!

好吧,实际上瞧现在还为时过早。我一点都不满意 那个答案。我不想进行需要时间的计算 与 B 的长度成正比。相比之下,这不会节省任何时间 只需将寄存器设置为 CRC(A) 并运行 B 流 通过。我认为必须有一种更快的方法来计算效果 喂养的nCRC 机器中的零(其中n= 长度(B))。所以 这导致我们:

技巧#2:CRC 机是一个线性状态机。如果我们知道 当我们向机器输入零时发生线性变换, 然后我们可以更有效地对该转换进行操作 找到喂养所产生的转化n零入 机器。

将单个零位送入 CRC 机的改造 完全由32x32的二进制矩阵表示。要应用 变换我们将矩阵乘以寄存器,取 寄存器为 32 位列向量。对于矩阵乘法 二进制(即在 2 的伽罗瓦域上),乘法的作用 由and'ing扮演,加法的角色由exclusive-扮演 或'ing。

有几种不同的方法来构建魔法矩阵 表示向 CRC 机器馈送 a 所引起的转变 单个零位。一种方法是观察矩阵的每一列 是当你的寄存器以一个开始时你得到的 它。所以第一列是当寄存器为 100 时你得到的...... 然后输入一个零,第二列来自于 0100...等(这些被称为基向量。)你可以看到 只需与这些向量进行矩阵乘法即可。 矩阵乘法选择矩阵的列 对应单个位置。

现在来说说技巧。一旦我们有了魔法矩阵,我们就可以搁置 初始寄存器内容一段时间,而是使用 一个零的变换来计算变换n零。我们可以乘以n矩阵的副本一起得到 矩阵为n零。但这比仅仅运行更糟糕n通过机器归零。然而,有一个简单的方法可以避免大多数 这些矩阵乘法得到相同的答案。假设我们 想知道运行八个零位或一个的转换 字节通过。让我们把代表运行的魔法矩阵称为 零到:M。我们可以进行七次矩阵乘法来得到 R = MxMxMxMxMxMxMxM。相反,让我们从 MxM 开始并将其称为 P。然后 PxP 是 MxMxMxM。我们称其为 Q。那么 QxQ 就是 R。所以现在我们已经 将七次乘法减少为三次。 P = MxM,Q = PxP,R = QxQ。

Now I'm sure you get the idea for an arbitrary n number of zeros. We can very rapidly generate transformation matrices Mk, where Mk is the transformation for running 2k zeros through. (In the paragraph above M3 is R.) We can make M1 through Mk with only k matrix multiplications, starting with M0 = M. k only has to be as large as the number of bits in the binary representation of n. We can then pick those matrices where there are ones in the binary representation of n and multiply them together to get the transformation of running n zeros through the CRC machine. So if n = 13, compute M0 x M2 x M3.

If j是二进制表示中的个数n, 然后我们 只是有j- 多 1 次矩阵乘法。所以我们总共有k

  • j- 1 次矩阵乘法,其中j <= k= 地板(logbase2(n)).

现在我们将快速构建的矩阵n零,并相乘 通过 CRC(A) 得到 CRC(A0)。我们可以在 O(log(n)) 中计算 CRC(A0) 时间,而不是 O(n) 时间。我们排除或与 CRC(B) 和 瞧! (真的,这一次),我们有 CRC(Z)。

这就是 zlib 的crc32_combine() does.

我将把它作为如何处理的练习留给读者 CRC 寄存器的预处理和后处理。你只需要 应用上面的线性观察。提示:你不需要知道 长度(A)。实际上crc32_combine()仅需要三个参数: CRC(A)、CRC(B) 和长度(B)(以字节为单位)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大多数静态数据流的 CRC 计算 的相关文章

  • CRC16 ISO 13239 实施

    我正在尝试在 C 中实现 Crc16 我已经尝试了许多不同的实现 但大多数都给了我不同的值 这是我已经使用过的一些代码 private static int POLYNOMIAL 0x8408 private static int PRES
  • _mm_crc32_u64 定义不明确

    为什么世界上有 mm crc32 u64 像这样定义 unsigned int64 mm crc32 u64 unsigned int64 crc unsigned int64 v crc32 指令always累积 32 位 CRC nev
  • 初学者了解循环冗余码算法

    at PNG 规范第 5 5 节 它在称为 CRC 或 循环冗余码 的 PNG 文件格式中讨论了这个概念 我以前从未听说过它 所以我正在尝试了解它 采用的 CRC 多项式是 x32 x26 x23 x22 x16 x12 x11 x10 x
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • _mm_crc32_u8 给出的结果与参考代码不同

    我一直在与内在因素作斗争 特别是使用标准 CRC 计算和据推测等效的英特尔内在函数 我想转而使用 mm crc32 u16 and mm crc32 u32但如果我不能让 8 位操作工作 那就没有意义了 static UINT32 g ui
  • 任何人都可以定义 Windows PE 校验和算法吗?

    我想用 C 实现这个 我看过这里 http www codeproject com KB cpp PEChecksum aspx http www codeproject com KB cpp PEChecksum aspx 并且我知道 I
  • CRC-CCITT 16位Python手动计算

    Problem 我正在为嵌入式设备编写代码 许多 CRC CCITT 16 位计算解决方案都需要库 鉴于使用库几乎是不可能的并且会消耗其资源 因此需要一个函数 可能的解决方案 下面是网上找到的CRC计算 然而 它的实现是不正确的 http
  • 在Python中计算modbus的CRC16

    首先 抱歉 我是初学者 我在 modbus 上得到以下字节序列 01 04 08 00 00 00 09 00 00 00 00f8 0c 该字节序列上粗体的 CRC 是正确的 但是 要检查 创建 CRC 我必须遵循设备规范 其中规定 错误
  • 带有 PL/pgSQL 的 CRC32 函数

    如何计算 32 位循环冗余校验 CRC 32 作为 PostgreSQL 中的函数 方法与MySQL http dev mysql com doc refman 5 7 en mathematical functions html func
  • 验证 CRC 校验和是否为零

    我过去接触过 CRC 16 校验和 习惯于通过对我要验证的文件重新计算 CRC 16 校验和 加上 CRC 16 本身的 2 个字节来验证它 如果结果为零 则文件完整性有效 否则无效 这可以非常有效地编码 就像下面的伪 C 一样 if re
  • CRC4 在 C 中的实现

    我修改了发现的实现here https stackoverflow com questions 28656471 how to confgure calculation of crc table 为 CRC4 构建表生成函数 如下所示 de
  • 确定 .NET 程序集是否是从同一源构建的

    有谁知道如何比较两个 NET 程序集以确定它们是否是从 相同 源文件构建的 我知道有一些差异实用程序可用 例如 Reflector 插件 但我对查看 GUI 中的差异不感兴趣 我只是想要一种自动方法来比较二进制文件集合以查看它们是否是从相同
  • 在 C# 中计算 Internet(又名 IP、又名 RFC791)校验和

    有趣的是 我可以在除 C 之外的几乎所有语言中找到 Internet 校验和的实现 有人有实现可以分享吗 请记住 互联网协议 http www faqs org rfcs rfc791 html规定 校验和字段是 16 位的 1 的补码 标
  • 为什么对文字使用异或而不是反转(按位非)

    我遇到过这个CRC32代码 http www opensource apple com source xnu xnu 1456 1 26 bsd libkern crc32 c很好奇为什么作者会选择使用 crc crc 0U 代替 crc
  • 具有 PCLMULQDQ 的快速 CRC *未反映*

    我正在尝试写一个PCLMULQDQ 优化的 CRC 32 https www intel com content dam www public us en documents white papers fast crc computatio
  • 如何在 Maven 中创建校验和然后将其输出到文本文件?

    还在学习如何使用Maven 我想知道是否有办法做到checksum在生成的WAR file The Maven目标是package 我想要实现的是得到一个checksum价值 包装的WAR文件 与打包文件一起放入文本文件中 提前致谢 让它与
  • 同一个 javac 编译器是否可以编译同一组源文件,但生成不同校验和的类文件?

    我试图比较这个结果 在蚂蚁中
  • 将 CRC8 从 C 翻译为 Java

    我收到一段 C 代码 它计算字节数组的 CRC8 值 我需要将其翻译成Java 这里的C Code CRC POLYNOM 0x9c CRC PRESET 0xFF unsigned int CRC CRC PRESET for i 0 i
  • Javascript CRC16 示例代码或实现

    有人可以分享一个链接或示例代码来实现 JavaScript 中字符串的校验和吗 预先非常感谢 你想要什么 你需要更具体 CRC16 算法数量众多 每种算法都有自己的多项式并用于特定用途 一些 CRC16 算法非常适合创建哈希 例如 对于 R
  • 防止 .exe 时间戳发生变化

    有谁知道如何防止可执行文件的时间戳更改 我正在尝试为 exe 生成一致的哈希代码 但我认为时间戳可能会阻止这种情况发生 每次我重新编译代码 VS C 时 FastSum 都会生成不同的校验和 Thanks PE 文件格式 如 EXE 中 具

随机推荐

  • C#,如何创建一个事件并在另一个类中监听它?

    我不知道如何做到这一点 这是示例代码 我想做的事 public Class MainForm Form MyUserControl MyControl new MyUserControl private void Button Click
  • Android kapt java.lang.UnsatisfiedLinkError Room

    我正在更新我的项目以使用 jetpack 库 我在命令行中执行了这个 gradlew app kaptDebugKotlin 在我的项目目录中 并抛出此错误 e kapt An exception occurred java lang Un
  • 带有“链接服务器”的 EF 6.1.3

    我正在使用 SQL Server 2012 和 EF 6 1 3 我有一个中央数据库 A 和另一个链接到数据库 A 的数据库 B 这两个数据库用于两个不同的应用程序 在数据库 B 中 我有一些视图 它们与中央数据库 A 中的某些表完全相同
  • java 9下运行时将jar添加到类路径

    Until java9为了在运行时通过编程方式将外部 jar 添加到类路径 每个人都使用 URLClassLoader sysloader URLClassLoader ClassLoader getSystemClassLoader Me
  • 为什么函数在画布中返回错误的颜色?

    我的画布颜色是 50 255 50 155 当我执行代码时 function getClickedAreaColor x y var data ctx getImageData x y 1 1 data color for var i 0
  • ItemSend 事件未触发

    我有一个 Outlook 2007 加载项 VSTO 任何使用 Outlook 发送的邮件都应在此之前进行修改 我用Application ItemSend事件 如果我直接从 Outlook 发送电子邮件 Inspector 或通过 使用的
  • 如何在 Windows Phone 中的计划任务代理上裁剪图像

    我需要使用 ScheduledTaskAgent 裁剪图像 由于它在后台运行 因此在尝试实例化 WriteableBitmap 时出现跨线程异常 因为它需要在 UI 线程中创建 我有一个图像流 如何在不使用 WriteableBitmap
  • 如何捕获 select2 的 Enter 按键

    我有一个国家 地区的 select2 下拉列表 多选 当用户输入关键字时 它会在菜单中显示相关项目 例如 如果用户输入ind 菜单显示India and 印度尼西亚 如果按下 Enter 键 则第一项 India 被选中 这是默认行为 现在
  • Visual Studio 2015 初始化部分 Nuget.PackageManagement.VisualStudio.VSolutionManager 必须在 UI 线程上调用

    在尝试在最近更新的 Visual Studio 2015 14 0 25431 01 Update 3 中构建或打开项目时 我不断收到有关 nuget 包管理的错误 每当我打开 VS 后第一次构建项目时 都会收到以下错误消息 当我尝试打开
  • 在考虑多个条件的方法中返回 null

    考虑以下方法 private static String method String string if string equals conditionOne return value else if string equals condi
  • 如何在 C++ 中可移植地计算 sha1 哈希值?

    目标是计算SHA1作为 C 程序一部分的一个或多个缓冲区的哈希值 我不确定使用 boost 的 UUID 是否会正确地在哈希值中添加前导零 据我所知 您的字符串应该始终具有相同的长度 因此这里是上面示例的简化版本 可以做到这一点 inclu
  • css3 动画停止

    目前我正在制作带有滑块动画的标题 仅限 css3 http jimmytenbrink nl slider 一切工作正常 除了有时从中心向右移动时滑块会出现故障 看来我需要停止动画几毫秒才能完成 然而 我在互联网上到处搜索 但似乎无法让它工
  • 无法访问 Metro 应用中的资产文件

    我正在尝试读取一个文本文件 该文件作为 Metro 应用程序中的资产提供 如果将文件路径指定为 ms appx Assets file txt 我会收到访问被拒绝错误 显然我需要设置一些访问安装位置文件夹的功能 我尝试启用清单设计器中的所有
  • Visual Studio 安装和部署构建失败,没有错误

    我有一个设置和部署项目 在我们的构建服务器上 在摘要中报告以下内容 全部重建 25 成功 2 失败 0 跳过 我不知道失败的两个是什么 但我相信其中之一是 vdproj 项目 因为如果我在没有安装程序的情况下运行构建 则根本不会报告任何错误
  • 如何用PHP下载大文件?

    我花了一周的时间来找到这个问题的正确答案 Right 我的意思是绝对符合现有的网络标准 可靠且性能有效 最后 我找到了解决方案 我在 StackOverflow 上找到的所有内容 在 PHP 中可靠地下载大文件 如何通过PHP脚本下载大文件
  • 使用 Quartz.NET 3.0.3 和简单注入器进行构造函数注入操作方法

    我正在尝试在 Windows 服务中使用 Quartz Net v3 0 3 和简单注入器 我有一个作业类 我想在其下面注入一些依赖项 例如我的记录器 public class JobWorker IJob private ILogger
  • 向按钮添加彩色阴影

    我需要向具有 来自 zeplin 这些属性的按钮添加阴影 这就是设计 我试过这段代码
  • React 中生成器的调用次数超出预期

    我发现生成器似乎被调用两次的行为 下面是一个简单的代码 它从生成器获取一个数字并将其输出到控制台 它期望控制台输出 0 和 1 但实际上输出的是 0 和 2 import useState useEffect from react func
  • <%= 导轨 4 中有一个块

    我正在尝试在助手中使用块 但这给了我这个错误 SyntaxError syntax error unexpected rbout concat green title do to s erbout concat n erb 4254 syn
  • 大多数静态数据流的 CRC 计算

    背景 我有一段内存 1024字节 最后 1020 字节始终相同 前 4 个字节将发生变化 产品的序列号 我需要计算CRC 16 CCITT 0xFFFF 起始 0x1021 掩码 对于整个内存部分 CRC WHOLE 问题 是否可以仅计算前