如何在 ESP32 上计算 Ethernet CRC32 (0x04C11DB7)

ESP32 ROM 提供了计算 CRC8、CRC16 和 CRC32 校验和的功能,但该功能文档记录不足

通过有根据的试错并与 Arduino_CRC32(基于 pyCRC 库实现多项式为 0x04C11DB7 的 Ethernet CRC32 算法)比较,我发现了如何使用 Ethernet 多项式计算 CRC32 校验和。

首先,包含 crc.h

esp32_crc32_example.cpp
#include <esp_rom_crc.h>

现在给定长度为 lengthbuffer,使用此代码:

crc_compute_snippet.cpp
uint32_t romCRC = (~esp_rom_crc32_le((uint32_t)~(0xffffffff), (const uint8_t*)buffer, length))^0xffffffff;

完整示例代码

此 PlatformIO/Arduino 代码通过在串口上打印两个结果来比较 ESP32 ROM CRC32 功能的结果。

esp32_crc32_complete_example.cpp
#include <Arduino.h>
#include <esp_rom_crc.h>
#include <Arduino_CRC32.h>

void setup() {
    Serial.begin(115200);
}

void loop() {
    const char* data = "ABCDEFGHIJ";

    // 使用 ESP32 ROM CRC 库计算
    uint32_t romCRC = (~esp_rom_crc32_le((uint32_t)~(0xffffffff), (const uint8_t*)data, 8))^0xffffffFF;

    // 使用 Arduino_CRC32 库计算(基于 pyCRC)
    Arduino_CRC32 crc32;
    uint32_t libCRC = crc32.calc((uint8_t const *)data, 8);

    // 打印两个值
    char crcBytes[4];
    memcpy(crcBytes, &romCRC, sizeof(uint32_t));
    Serial.printf("ROM CRC: %02X %02X %02X %02X\n", crcBytes[0], crcBytes[1], crcBytes[2], crcBytes[3]);

    memcpy(crcBytes, &libCRC, sizeof(uint32_t));
    Serial.printf("Lib CRC: %02X %02X %02X %02X\n", crcBytes[0], crcBytes[1], crcBytes[2], crcBytes[3]);
    Serial.println("\n");
    delay(500);
}
platformio.ini
[env:esp32dev]
platform = espressif32
platform_packages = framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.2.0
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps =
    arduino-libraries/Arduino_CRC32@^1.0.0

示例输出:

crc_example_output.txt
ROM CRC: 1C B6 DC 68
Lib CRC: 1C B6 DC 68

Check out similar posts by category: Arduino, ESP8266/ESP32