gpt4 book ai didi

checksum - 从数据 + CRC 确定 CRC 算法 - 嵌入式应用程序。

转载 作者:行者123 更新时间:2023-12-02 19:01:52 30 4
gpt4 key购买 nike

我有一组受 16 位校验和保护的数据,需要更正。校验和位置是已知的,计算它们的确切区域以及用于计算它们的确切算法却未知。 16 位,最低有效位在前。我怀疑这是某种 16 位 CRC,但我无法找到实际计算校验和的代码。

示例:

00    4E00FFFF26EC14091E00A01830393630  
10 30313131313030393030363030313030
20 30303131313030393030363030313030
30 30303131313030393030363030313030
40 3030FFFF225E363436304D313037**0CE0**
50 64000000000000008080808080800000
60 00000000**BE6E**FC01E001EB0013010500

校验和存储在4E和64处。我不知道它们是从每个数据部分开头的第一个字的偏移量开始计算,还是从之后开始计算,还是从整个范围开始计算。我尝试了一些常见的 CRC 算法和多项式,但没有成功。没有适用于此应用的引用资料或规范。

这里是另一个具有不同 CRC 的数据部分,以便进行比较。

00    4E00FFFF26C014091600A01030393132  
10 30313131313030393030313230313030
20 30303131313030393030313230313030
30 30303131313030393030313230313030
40 3030FFFF225E343231324F313044**8348**
50 64000000000000008080808080800000
60 00000000**72F8**E001EB00130105000E01

我的问题是,任何人都可以识别该算法吗?有没有办法根据数据和 CRC 计算 CRC 多项式和其他因子?

谢谢!

编辑:

对常见 CRC16 多项式 0xA001 的反汇编搜索揭示了这个函数:

34F86 ; =============== S U B R O U T I N E =======================================
34F86
34F86
34F86 Possible_Checksum: ; CODE XREF: MEM_EXT_4:00034FEEP
34F86 ; MEM_EXT_4:0003503AP ...
34F86 mov [-r0], r9 ; Move Word
34F88 mov r4, r12 ; Move Word
34F8A mov r5, r13 ; Move Word
34F8C shr r4, #14 ; Shift Right
34F8E shl r5, #2 ; Shift Left
34F90 or r5, r4 ; Logical OR
34F92 mov r4, r12 ; Move Word
34F94 mov DPP0, r5 ; Move Word
34F98 and r4, #3FFFh ; Logical AND
34F9C movb rl3, [r4] ; Move Byte
34F9E mov DPP0, #4 ; Move Word
34FA2 movbz r9, rl3 ; Move Byte Zero Extend
34FA4 mov r15, #0 ; Move Word
34FA6
34FA6 loc_34FA6: ; CODE XREF: MEM_EXT_4:00034FC8j
34FA6 mov r4, [r14] ; Move Word
34FA8 xor r4, r9 ; Logical Exclusive OR
34FAA and r4, #1 ; Logical AND
34FAC jmpr cc_Z, loc_34FBA ; Relative Conditional Jump
34FAE mov r4, [r14] ; Move Word
34FB0 shr r4, #1 ; Shift Right
34FB2 xor r4, #0A001h ; Logical Exclusive OR
34FB6 mov [r14], r4 ; Move Word
34FB8 jmpr cc_UC, loc_34FC0 ; Relative Conditional Jump
34FBA ; ---------------------------------------------------------------------------
34FBA
34FBA loc_34FBA: ; CODE XREF: MEM_EXT_4:00034FACj
34FBA mov r4, [r14] ; Move Word
34FBC shr r4, #1 ; Shift Right
34FBE mov [r14], r4 ; Move Word
34FC0
34FC0 loc_34FC0:

最佳答案

您从 loc_34FA6 以下发布的代码基本上如下:

unsigned short
crc16_update(unsigned short crc, unsigned char nextByte)
{
crc ^= nextByte;

for (int i = 0; i < 8; ++i) {
if (crc & 1)
crc = (crc >> 1) ^ 0xA001;
else
crc = (crc >> 1);
}

return crc;
}

这是一个带有 0xA001 多项式的 CRC-16。一旦找到 CRC-16 适用的数据范围,即可将 CRC 初始化为 0xFFFF,并为序列中的每个字节调用此函数。存储返回值并在下次通过时传回。最后返回的值就是您的最终 CRC。

我不知道序言在做什么......

关于checksum - 从数据 + CRC 确定 CRC 算法 - 嵌入式应用程序。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/401231/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com