Algorithm 在CRC覆盖的二进制文件中嵌入数据,意味着什么?
假设以下场景:Algorithm 在CRC覆盖的二进制文件中嵌入数据,意味着什么?,algorithm,embedded,crc,Algorithm,Embedded,Crc,假设以下场景: 对于微控制器,有一些应用程序的二进制图像(为了避免引起ELF/PE格式的问题,无论如何,我的特定相关问题是微控制器项目) 该二进制图像受CRC保护(用于检测其中的错误,无需加密) 我希望有一个可以在以后替换的部分(例如使用引导加载程序),而不影响CRC 问题是可以解决的,CRC32的示例如下: 内部流1:0x49 0xA3 0x45 0xEF=>CRC32:0xA1DD6F3B 内部流2:0xAD 0x33 0x10 0x86=>CRC32:0xF6717149 二进制1:
- 对于微控制器,有一些应用程序的二进制图像(为了避免引起ELF/PE格式的问题,无论如何,我的特定相关问题是微控制器项目)
- 该二进制图像受CRC保护(用于检测其中的错误,无需加密)
- 我希望有一个可以在以后替换的部分(例如使用引导加载程序),而不影响CRC
- 内部流1:0x49 0xA3 0x45 0xEF=>CRC32:0xA1DD6F3B
- 内部流2:0xAD 0x33 0x10 0x86=>CRC32:0xF6717149
- 二进制1:0x110x49 0xA3 0x45 0xEF 0x3B 0x6F 0xDD 0xA10x22=>0xDEAD20F7
- 二进制2:0x110xAD 0x33 0x10 0x86 0x49 0x71 0x71 0xF60x22=>0xDEAD20F7
因此,问题是,如果以这种方式使用CRC,外部块的部分(或仅由外部CRC检查的内部块)是否会在错误检测性能上出现任何降级。CRC检查是否捕获错误取决于错误翻转输入的哪些位,不是这些位的原始值 因此,所检查的数据对CRC的错误检测能力没有影响,除非它使传输系统容易产生某些类型的错误
这种情况不太可能发生,而且几乎可以肯定,它不会依赖于数据的CRC,因此您的方案不会降低错误检测。否。事实上,通过在消息中插入第二个CRC,您增加了总体错误检测概率。你也可以检查一下,看看被替换的部分是否有错误。
内部块[没有受益于]外部CRC
我怀疑这是否适用于不同的情况polynomials@greybeard也许是真的。但这不是提高纠错性能的要求,只是为了确保它不会在任何地方退化。实际上,内部块只有一个CRC,以消除其对外部块CRC的影响。我甚至不确定一个不同的多项式内块CRC是否能实现这个目标。这是相当不清楚的。0x22来自哪里?=>0xDEAD20F7
是什么意思?什么是“魔力值”:0xDEBB20E3
,你是怎么得到的?@Lundin-Ouch,我会重新考虑这个问题的措辞,我认为这些对于那些对CRC有足够兴趣的人来说是显而易见的,他们认为这个问题与他有关。“幻值”是CRC算法的一个属性:如果计算CRC,包括CRC值本身,则始终会得到相同的结果,对于CRC32,这是0xDEBB20E3。示例中的0x11和0x22被认为是嵌入内部流的二进制文件的一部分,而0xDEAD20F7是这些二进制文件的CRC32,这表明内部流的替换不会改变它。@Jubatian我对CRC有相当多的经验,我自己在C和数字逻辑硬件中实现了这样的算法。我不明白这个问题。这些都不是众所周知的CRC32中的多项式。您使用的是哪种CRC32?您使用的是反向还是非反向FCS?您最初是否将FCS包括在计算中?等等所以我认为0xDEBB20E3是当你用多项式计算一个包时得到的值?那是哪个CRC32?这是我的想法,但我不能完全确定。由于有人坚持我们不能使用CRC32,而应该自己做饭,因为数据包以后可能会在以太网帧中传输,这会神奇地削弱数据包的错误检测性能(以太网也使用CRC32),所以我们在这个环境中进行了长时间的辩论。如果您使用CRC32,那么CRC32未能检测到的错误也将无法被以太网的CRC32检测到,只要它适合于一个数据包,因为它们是相同的检查。如果您使用不同的检查或不同的CRC多项式,那么这两个检查将是独立的,您将获得这两个检查的附加安全性。