计算 CRC 初始值而不是将 CRC 附加到有效负载

2024-01-23

我实现的大部分 CRC 都是追加计算出的 CRC 值到消息(有效负载),并在所有字节(包括)之后在接收器处检查零结果。 CRC 值通过 CRC 寄存器输入。 显然这是一个相当标准的方法。

现在我想使用不同的方法:

  1. 根据有效负载计算一个值。
  2. 使用该值作为 CRC 寄存器的初始值before这 消息字节(有效负载)通过 CRC 寄存器馈送 这样有效负载的最后一个字节之后的结果 被馈送的将为零。

做到这一点的最佳方法是什么? 有没有一个好主意或一些可以深入挖掘的指示?

ps:我为什么要这么做?在某些应用程序 (ROM) 中,我无法附加数据,因为数据存储在 ROM 地址空间的末尾。所以我想预加载 CRC 寄存器或将值添加到消息中。


我现在已经为上述问题编写了一个解决方案,该解决方案比我最初想象的要容易。

我找到了几篇关于如何伪造 CRC 的文章。这意味着如何修补数据,使计算出的 CRC 值具有预定义的值 价值。

使用这种方法,我只需使用实际的最后一个字节 有效负载作为 CRC 值,这是非常明显的。

最后,我只需要使用我的有效负载数据来计算“反向”CRC。 这个计算的结果是我必须使用的初始值 计算CRC。

由于我正在开发一个内存非常有限的系统,因此我减小了 CRC 表有 256 个条目(CRC32 为 1024 字节) 到 16 个条目(64 字节),现在分两步处理每个字节, 仍然比移位快得多。

// Reverse CRC table for Castagnoli polynomial (0x1EDC6F41)
static const unsigned long crc32c_revTable[16] =
{
    0x00000000L, 0x05EC76F1L, 0x0BD8EDE2L, 0x0E349B13L,
    0x17B1DBC4L, 0x125DAD35L, 0x1C693626L, 0x198540D7L,
    0x2F63B788L, 0x2A8FC179L, 0x24BB5A6AL, 0x21572C9BL,
    0x38D26C4CL, 0x3D3E1ABDL, 0x330A81AEL, 0x36E6F75FL
};

unsigned long calcReverseCRC32C(unsigned long crc32c, 
                                const unsigned char* pData,
                                unsigned long len)
{
    while (len--)
    {
        crc32c = (crc32c << 4) ^ crc32c_revTable[crc32c >> 28];
        crc32c = (crc32c << 4) ^ crc32c_revTable[crc32c >> 28];
        crc32c ^= *pData--;
    }

    return crc32c;
}

Usage:

{
    // This array contains test data with 4 bytes CRC appended
    // The result of CRC-32C calculation using this data is zero
    unsigned char arr[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9',
                           0x7c, 0x6d, 0xf9, 0x1c};

    unsigned long expectedResultOfCRC = 0;
    unsigned long init = calcReverseCRC32C(expectedResultOfCRC,
                                           &arr[sizeof(arr) -1],
                                           sizeof(arr) );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算 CRC 初始值而不是将 CRC 附加到有效负载 的相关文章

  • Java中多项式x^16 + x^12 + x^5 + 1计算CCITT标准CRC

    我需要帮助在 Java 中使用多项式 x 16 x 12 x 5 1 0x1081 计算 CCITT 标准 CRC 我在互联网上尝试了很多示例 但每个示例都返回与示例中不同的值 例如 对于此数组 0xFC 05 11 结果需要为 27 56
  • 用“/”字符修补 kubernetes 标签

    我有以下代码 https stackoverflow com questions 57310483 whats the shortest way to add a label to a pod using the kubernetes go
  • 文件的 CRC 检查

    我正在使用一个小型 FAT16 文件系统 并且想要为存储配置信息的单个 XML 文件生成 CRC 值 如果数据发生更改或损坏 我希望能够检查 CRC 以确定文件仍处于原始状态 问题是 如何将CRC值放入文件中 而不改变文件本身的CRC值 我
  • 具有 PCLMULQDQ 的快速 CRC *未反映*

    我正在尝试写一个PCLMULQDQ 优化的 CRC 32 https www intel com content dam www public us en documents white papers fast crc computatio
  • git:补丁没有有效的电子邮件地址

    我有一个补丁文件 我想将此补丁应用到 git 存储库中的代码 当我使用 subversion 时 这个过程非常简单 右键 gt tortoise svn gt 应用补丁 它总是按我的预期工作 但我不能使用 git 来做到这一点 Git 不应
  • 反向搜索栏(从右到左)颜色

    我一直在尝试实现一个类似于您用来接受或拒绝呼叫的搜索栏 对于呼叫接受 我设置 sbLeft setProgress 0 对于呼叫拒绝 我设置 sbRight setProgress 15 setMax 15 机器人两个搜索栏 这给了我预期结
  • 我可以用 git 拆分已经拆分的块吗?

    I ve recently discovered git s patch option to the add command and I must say it really is a fantastic feature I also di
  • 反转列表时出现意外结果

    我需要对下面代码的意外结果进行一些解释 似乎是由于一些错误 reverse b gt b reverse reverse x x reverse x xs last x xs reverse xs Main gt reverse 0 8 2
  • CRC-CCITT (0xFFFF) 功能?

    有人可以帮我用 Delphi 实现 CRC CCITT 0xFFFF 已经获得 Java 版本 但对如何将其移植到 Delphi 感到困惑 public static int CRC16CCITT byte bytes int crc 0x
  • 棘手的 CRC 算法

    我正在尝试找到适用于以下结果的 crc 字节串由 2 个字节组成 即 0xCE1E crc 是单个字节 即 0x03 byte crc CE1E 03 CE20 45 CE22 6F 0000 C0 0001 D4 FFFF 95 有人可以
  • Java字符串数组反转

    我试图反转 java 数组中的所有字符串 但似乎用第一个字符串覆盖了所有字符串 private static void palindrome String s int flag 0 String reverse for int i 0 i
  • 如何在 Gradle 中应用补丁文件?

    我有一个 Gradle 构建脚本 可以成功构建我的项目并编译我需要的所有工件 然而 在某些情况下 我想让其他开发人员可以选择修补某些文件 例如 在其中一个档案中有一个 xml 文件 其中包含有关数据库挂钩的信息 一些开发人员使用其他版本 甚
  • javascript中的(多维)数组中的反向条目

    我正在使用 leaflet js 在 openstreetmap 上显示一些多边形 我有一个外部数据资源 它为我提供了多边形的坐标 不幸的是 这个数组的坐标顺序错误 例子 我得到 10 5254913 52 2734311 10 52588
  • Python仅枚举反向索引

    我正在尝试反转给出的索引enumerate同时保留被枚举列表的原始顺序 假设我有以下内容 gt gt range 5 0 1 2 3 4 如果我列举这一点 我会得到以下结果 gt gt list enumerate range 5 0 0
  • 如何计算 CRC 中使用的 XOR 余数?

    我试图记住如何计算循环冗余检查中的 XOR 算法的剩余部分以验证网络消息的剩余位 我不应该扔掉那本教科书 这在代码中很容易完成 但是如何手动计算出来呢 我知道它看起来像标准除法算法 但我不记得从那里去哪里获得余数 1010 10110100
  • OSGi 应用程序修补策略

    修补 OSGi 容器的适当机制是什么 1 Should the bundles binaries jars have the same name as the old ones then a Replace the bundle with
  • 如何用mock修补模块的内部函数?

    我所说的 内部函数 是指从定义它的同一模块内调用的函数 我正在使用mock http www voidspace org uk python mock 图书馆 特别是patch http www voidspace org uk pytho
  • CRC 16 -DECT 与聚 x^16 + x^10 + x^8 + x^7 + x^3 + 1

    相信我 我已经尝试过编写这个代码 尝试过谷歌 但没有任何运气 我正在尝试使用这个 Poly 实现 CRC16 x 16 x 10 x 8 x 7 x 3 1 使用C语言 因为我对 PHP 有了更好的了解 所以我试图让一个函数运行 但我没有得
  • nginx server_name 在流块内可能吗?

    目前设置如下 stream server listen 9987 udp server name subdomain EXAMPLE com this line is resulting in an error proxy pass loc
  • 如何反转字符串中的单词但将标点符号保留在正确的位置? [复制]

    这个问题在这里已经有答案了 我编写了以下代码来反转输入字符串 Scanner s new Scanner System in System out println Please enter a sentence String sentenc

随机推荐

  • 可以在运行时将目录添加到类路径中吗?

    为了更好地理解 Java 中的工作原理 我想知道是否可以在运行时动态地将目录添加到类路径中 例如 如果我启动一个 jar using java jar mycp jar 并输出java class path财产 我可能会得到 java cl
  • 类型错误:+ 不支持的操作数类型:“生成器”和“生成器”

    我在目标函数中添加三个表达式时遇到问题 我用了quicksum构建每个表达式 但是 当我尝试将它们添加在一起时 出现错误 无法在 生成器 类上使用 操作数 这是我的代码的最后一部分 the shipping cost expression
  • Angular是否需要取消订阅this.activatedRoute订阅

    My code ngOnInit this activatedRoute params subscribe params Params gt do stuff this activatedRoute data subscribe data
  • Builders 页面从 Eclipse 项目属性中消失

    我不知道我的带有最新 Android SDK 和最新 Sequoyah 插件的 Eclipse Helios 发生了什么 突然 我在项目属性中看不到 构建器 页面 不是工作区中的单个项目 我怎样才能恢复这个页面 检查您目前处于哪个视角 右上
  • 如何处理ETIMEDOUT错误?

    如何处理此调用的 etimedout 错误 var remotePath myremoteurltocopy var localStream fs createWriteStream myfil var out request uri re
  • 在Linux中设置Mysql++

    我想在linux中用C 连接mysql数据库 在我的本地计算机上 我运行 Ubuntu 并安装了 mysql 服务器和客户端软件包 sudo apt get install mysql server mysql client 我碰到Mysq
  • 有什么方法可以获得断点特定的宽度类吗?

    Bootstrap 4 包括宽度类别 https getbootstrap com docs 4 0 utilities sizing w 25 w 50 w 75 w 100 我只想为某些断点及以上指定宽度 例如 w md 25 等 是否
  • 在电子邮件正文中显示 Python HTML 表

    我编写了一个 python 脚本来查询数据库并以 HTML 表格式显示数据 我怎样才能让这个代码以表格的形式显示在电子邮件中 我尝试将代码粘贴到第二个脚本 EMAIL 的 html 标签内 但它不读取 python 代码 仅读取 HTML
  • CUDA 点积

    我正在做一个 cuda 教程 其中我必须制作两个向量的点积 实施教程中提供的解决方案后 我遇到了一些问题 这些问题已在this https stackoverflow com questions 15822412 dot product i
  • Rails Devise:如何(mem)缓存设备对用户对象的数据库请求?

    每次我点击经过身份验证的页面时 我都会注意到设计发出一条 SQL 语句 用户负载 0 2ms 选择users FROM users WHERE users id 1 限制 1 顺便说一句 我正在使用Rails 3 所以cache money
  • 为 DividerItemDecoration 设置可绘制对象

    我正在尝试为 DividerItemDecoration 设置自定义可绘制 线 但没有成功 错误在哪里 DividerItemDecoration dividerItemDecoration new DividerItemDecoratio
  • 垃圾收集:对象属性

    假设我有一个对象 其中包含另一个对象作为其属性 例如 var obj 1 42 When obj超出范围 所有嵌套对象是否都隐式销毁 或者我需要迭代它们并且delete明确地 是的 除非另一个参考仍然存在 var obj 1 42 var
  • 未找到 User 类型的属性索引

    我正在尝试在同一个项目中将 ElasticSearch 与 MySQL 一起使用 我在不同的项目中定义了两个存储库 但我总是收到此错误消息 Exception in thread main org springframework beans
  • Swagger.NET MVC Api 异常

    我一直在寻找提供自动生成的 API 文档的不同选项 Swagger 似乎就在那里 然而 当我第一次尝试这个时 我在启动时遇到了异常 运行 Visual Studio 2013 创建新的 Web API 项目 使用包管理器 运行 Instal
  • NSIncrementalStore 的简单英语解释

    我一直看到NSIncrementalStore当我一直在研究使用核心数据与 Web 服务交互的最佳方式时 这个问题就出现了 看完之后德鲁 克劳福德的文章 http sealedabstract com code nsincrementals
  • 有些控件没有绘制,看似随机

    我正在尝试为自己编写一个小 MFC 应用程序 以测试我正在训练的一些人工智能 因此 我添加了一个图片控件和一个静态控件 我可以在主窗口的 OnPaint 方法中自由地绘制内容 当只绘制一次应用程序时 它似乎可以工作 但我现在添加了一个在停止
  • 如何获取张量的值? Python

    在进行一些计算时 我最终计算出average acc 当我尝试打印它时 它输出 tf Tensor 0 982349 shape dtype float32 我如何获得0 98 它的值并将其用作普通浮点数 我想做的是将其中的一堆放在一个数组
  • 为什么标准输出不能被替换?

    出于教育目的 我尝试替换标准流 stdout stdin 和 stderr 我首先查找流的数据类型 我追溯到具有以下成员的 struct IO FILE gdb ptype IO FILE type struct IO FILE int f
  • FreeMarker 模板错误:以下内容已计算为 null 或缺失 |但事实并非如此

    我面临的错误是如此奇怪 一切看起来都很好 但是当浏览器向服务器发送 GET 请求时 我收到此错误 我想做的实际上是捕获 HTTP 参数 将它们保存在发送到 Freemarker 模板的 ArrayList 中保存的对象中 请你帮助我好吗 多
  • 计算 CRC 初始值而不是将 CRC 附加到有效负载

    我实现的大部分 CRC 都是追加计算出的 CRC 值到消息 有效负载 并在所有字节 包括 之后在接收器处检查零结果 CRC 值通过 CRC 寄存器输入 显然这是一个相当标准的方法 现在我想使用不同的方法 根据有效负载计算一个值 使用该值作为