当前位置: 首页 > 知识库问答 >
问题:

查找使用的CRC-16算法

龚运乾
2023-03-14

我正在努力对与CRC-16校验和相关的一段数据进行反向工程。我知道用来计算原始校验和的多项式是0x8408,但没有别的,我不知道初始值(如果有),最终异或值(如果有),如果输入或结果被反映...

似乎有一个已知的CRC-16生成器使用thing polynom,CRC-16-CCITT,但尽管我尝试了所有的方法,我还是不能理解原始校验和是如何计算的。

|                           DATA                           |Inc|CRC|
|----------------------------------------------------------|---|---|
00 00 00 00 00 00 01 ef f7 fe ef ff fd ef fb fa fd a2 aa 21 01 f4 e0
00 00 00 00 00 00 01 ef f7 fd ef ff fd fe fb fa fd a2 aa 21 02 f4 d1
00 00 00 00 00 00 01 f7 fe fd fd ff fd df ff fb fd a2 aa 21 03 f4 cd
00 00 00 00 00 00 01 f7 fe fe fd ff f7 ef ff fa fd a2 aa 21 04 f4 c2
00 00 00 00 00 00 01 ef f7 fe ef ff fe ef fb fa fd a2 aa 21 05 f4 db
00 00 00 00 00 00 01 ef f7 fe ef ff fd ef fb fa fd a2 aa 21 06 f4 db

共有1个答案

郝永思
2023-03-14

每行的最后一个字节似乎是0xF3+除最后一个字节(包括0xF4)以外的所有字节的负和。以下代码适用于以下5个示例:

typedef unsigned char uint8_t;

static uint8_t data0[] = 
   {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xef,0xf7,0xfe,0xef,
    0xff,0xfd,0xef,0xfb,0xfa,0xfd,0xa2,0xaa,0x21,0x01,0xf4,0xe0};
static uint8_t data1[] = 
   {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xef,0xf7,0xfd,0xef,
    0xff,0xfd,0xfe,0xfb,0xfa,0xfd,0xa2,0xaa,0x21,0x02,0xf4,0xd1};
static uint8_t data2[] = 
   {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf7,0xfe,0xfd,0xfd,
    0xff,0xfd,0xdf,0xff,0xfb,0xfd,0xa2,0xaa,0x21,0x03,0xf4,0xcd};
static uint8_t data3[] = 
   {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf7,0xfe,0xfe,0xfd,
    0xff,0xf7,0xef,0xff,0xfa,0xfd,0xa2,0xaa,0x21,0x04,0xf4,0xc2};
static uint8_t data4[] = 
   {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xef,0xf7,0xfe,0xef,0xff,
    0xfe,0xef,0xfb,0xfa,0xfd,0xa2,0xaa,0x21,0x05,0xf4,0xdb};
static uint8_t data5[] = 
   {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xef,0xf7,0xfe,0xef,0xff,
    0xfd,0xef,0xfb,0xfa,0xfd,0xa2,0xaa,0x21,0x06,0xf4,0xdb};

int main()
{
size_t i;
uint8_t c = 0xf3;
uint8_t s;
    s = c;
    for(i = 0; i < sizeof(data0)-1; i++)
        s -= data0[i];
    if (data0[i] != s)
        printf("mismatch\n");
    s = c;
    for (i = 0; i < sizeof(data1) - 1; i++)
        s -= data1[i];
    if (data1[i] != s)
        printf("mismatch\n");
    s = c;
    for (i = 0; i < sizeof(data2) - 1; i++)
        s -= data2[i];
    if (data2[i] != s)
        printf("mismatch\n");
    s = c;
    for (i = 0; i < sizeof(data3) - 1; i++)
        s -= data3[i];
    if (data3[i] != s)
        printf("mismatch\n");
    s = c;
    for (i = 0; i < sizeof(data2) - 1; i++)
        s -= data4[i];
    if (data4[i] != s)
        printf("mismatch\n");
    return 0;
}
 类似资料:
  • 我需要帮助试图验证CRC-16值(也需要帮助与CRC-32值)。我试图坐下来了解CRC是如何工作的,但我一片空白。 更多信息如下: --编辑-- 我已经包括了更多的信息。我引用的文档是TIA-102.BAAA-A(来自TIA标准)。以下是文档陈述的内容(试图尽可能避免侵犯版权): FM(x)的系数被放置在CRC字段中,其中CRC的第0个八位元组的MSB对应于x^31,而CRC的第3个八位元组的LS

  • 我试图通过串行通信协议与设备通信,但在查找消息的最后2个字节使用的校验和/CRC算法时遇到了一些困难。我在各种在线crc实用程序中尝试了几种CRC16算法,比如:http://www.sunshine2k.de/coding/javascript/crc/crc_js.html http://www.zorc.breitbandkatze.de/crc.html 我也尝试了逆向工程,在REVENG

  • 我有一个通过RS232 COM与计算机通信的终端。我得到的协议说,我必须发送一定的字节组合和CRC 16 IBM计算的数据在最后发送 我还得到了一个C编写的应用程序,我可以用它来测试,该应用程序编写了一个带有发送数据和接收数据的日志。在该日志中,我查看是否向终端发送了以下字符串。我还必须发送数据06 35的这个CRC16 IBM结果。 我已经设法以某种方式将作为示例给出的C方法翻译成C#。但我的结

  • 因此,我的问题是:如何从整数结果到所需的双十六进制结果?我试了几个选择,都没有成功。 注意:我使用的是Qt,所以如果有人能找到实现QByteArray或其他Qt友好代码的解决方案,我会很高兴的。无论哪种方式,不使用Qt、C或C++的解决方案都是无用的:P

  • FF-源地址 53-数据 70-数据