如何计算指定参数的CRC8_SAE_J1850及获取带打印功能的实现代码
HITAG256 CRC8_SAE_J1850计算实现方案
实现思路
- 明确CRC8参数:多项式
0x1D(二进制11101),初始值0xFF,待计算数据为4字节:0x00、0x00、0x0C、0x05 - 核心计算逻辑:
- 初始化CRC寄存器为
0xFF - 遍历每个输入字节:
- 将当前字节与CRC寄存器值做异或运算
- 对该字节的每一位(共8位)循环判断:若CRC寄存器最高位为1,则左移一位后与多项式
0x1D异或;否则仅左移一位
- 所有字节处理完成后,CRC寄存器的最终值即为结果,预期输出为
0xC2(二进制11000010)
- 初始化CRC寄存器为
带打印功能的C语言实现
#include <stdio.h> #include <stdint.h> // CRC8_SAE_J1850计算函数,参数:数据指针、数据长度、多项式、初始值 uint8_t crc8_sae_j1850(uint8_t *data, uint8_t length, uint8_t poly, uint8_t init) { uint8_t crc = init; for (uint8_t i = 0; i < length; i++) { crc ^= data[i]; // 处理当前字节的8位 for (uint8_t bit = 0; bit < 8; bit++) { if (crc & 0x80) { // 检查最高位是否为1 crc = (crc << 1) ^ poly; } else { crc <<= 1; } } } return crc; } int main() { // 待计算的4字节数据:00 00 0C 05 uint8_t input_data[] = {0x00, 0x00, 0x0C, 0x05}; uint8_t data_length = sizeof(input_data) / sizeof(input_data[0]); // CRC参数:多项式0x1D,初始值0xFF uint8_t poly = 0x1D; uint8_t init = 0xFF; uint8_t result = crc8_sae_j1850(input_data, data_length, poly, init); printf("计算结果:0x%02X(二进制:%08b)\n", result, result); printf("预期结果:0xC2(二进制:11000010)\n"); return 0; }
运行说明
编译并运行程序后,会输出计算得到的CRC8值,以及预期结果,可直接对比验证。
内容的提问来源于stack exchange,提问作者vas
相关产品推荐
相关产品推荐

