CRC-512算法输出64字节

1. 逐位计算法(最容易理解)

c 复制代码
#include <stdint.h>
#include <string.h>

// CRC-512 结果 = 64字节
typedef uint8_t crc512_t[64];

// 标准 CRC-512 多项式
static const uint8_t CRC512_POLY[64] = {
    0x02,0xDC,0x76,0x25,0x32,0x83,0x8E,0x69,
    0x84,0x22,0x3E,0xAC,0x3E,0x86,0x91,0x19,
    0x27,0x5C,0x59,0x4C,0xB7,0x61,0x0B,0x74,
    0xA9,0x4B,0x68,0xF4,0xF9,0xAE,0x81,0xA1,
    0x7E,0x16,0x8D,0xE1,0x4A,0x10,0xE8,0x1D,
    0x52,0x5D,0x27,0x9D,0x6B,0xB1,0x7F,0x12,
    0x74,0xFE,0x64,0x00,0x8F,0x3E,0x67,0xF9,
    0xF9,0xB6,0xE5,0x40,0xE1,0x44,0x17,0x05
};

// 工具:512位数左移1位
static void crc512_shift_left_1(uint8_t *crc) {
    int carry = 0;
    for (int i = 63; i >= 0; i--) {
        int new_carry = crc[i] >> 7;
        crc[i] = (crc[i] << 1) | carry;
        carry = new_carry;
    }
}

// 工具:512位异或
static void crc512_xor(uint8_t *a, const uint8_t *b) {
    for (int i = 0; i < 64; i++) a[i] ^= b[i];
}

// ==============================
// CRC-512 逐位计算法
// ==============================
void crc512_bitwise(crc512_t out, const uint8_t *data, size_t len) {
    // 初始化为 0
    memset(out, 0, 64);

    // 逐字节
    for (size_t i = 0; i < len; i++) {
        uint8_t b = data[i];

        // 逐位
        for (int bit = 7; bit >= 0; bit--) {
            int carry = !!(out[0] & 0x80); // 取最高位

            crc512_shift_left_1(out);

            if (b & (1 << bit))
                out[63] |= 1; // 当前位为1,移入CRC

            if (carry)
                crc512_xor(out, CRC512_POLY);
        }
    }
}

2. 查表法(高速工程版)

c 复制代码
// 256项表,每项64字节
static uint8_t crc512_table[256][64];

// 工具:左移8位
static void crc512_shift_left_8(uint8_t *crc) {
    for (int i = 0; i < 63; i++) crc[i] = crc[i+1];
    crc[63] = 0;
}

// 初始化表(必须调用一次)
void crc512_init_table(void) {
    for (int b = 0; b < 256; b++) {
        uint8_t rem[64] = {0};
        rem[0] = b;

        for (int i = 0; i < 8; i++) {
            int carry = !!(rem[0] & 0x80);
            crc512_shift_left_1(rem);
            if (carry) crc512_xor(rem, CRC512_POLY);
        }
        memcpy(crc512_table[b], rem, 64);
    }
}

// ==============================
// CRC-512 查表法(超快)
// ==============================
void crc512_lookup(crc512_t out, const uint8_t *data, size_t len) {
    memset(out, 0, 64);

    for (size_t i = 0; i < len; i++) {
        uint8_t index = out[0] ^ data[i];
        crc512_shift_left_8(out);
        crc512_xor(out, crc512_table[index]);
    }
}

3. 测试代码(验证)

c 复制代码
#include <stdio.h>

int main() {
    uint8_t test[] = "123456789";
    crc512_t result;

    // 方法1:逐位计算
    crc512_bitwise(result, test, 9);

    // 方法2:查表计算(先初始化)
    // crc512_init_table();
    // crc512_lookup(result, test, 9);

    printf("CRC-512 (64字节):\n");
    for (int i = 0; i < 64; i++) {
        printf("%02X ", result[i]);
        if ((i + 1) % 16 == 0) printf("\n");
    }
    return 0;
}
相关推荐
fpcc14 分钟前
数据结构和算法—数学的应用
数据结构·c++·算法
皓月斯语17 分钟前
B4451 [GESP202512 四级] 建造 题解
数据结构·c++·算法·题解
z小猫不吃鱼1 小时前
模型剪枝经典论文精读:DepGraph: Towards Any Structural Pruning
算法·机器学习·剪枝
Ulyanov2 小时前
Python实现6-DOF刚体仿真器(下)——环境扰动与控制闭环
开发语言·python·算法·系统仿真·雷达电子对抗·导引头
牧以南歌〆2 小时前
数据结构<八>链式队列
c语言·数据结构·算法
Reart2 小时前
Leetcode 188.买卖股票的最佳时机4(718)
后端·算法
2601_950760792 小时前
BCMA:急性髓系白血病免疫治疗的新型可行靶点
人工智能·算法·蛋白
Reart2 小时前
Leetcode 123.买卖股票的最佳时期3(内有随心谈,718)
后端·算法
可编程芯片开发3 小时前
基于RMDCFT算法的天基雷达空间机动目标检测方法MATLAB仿真,对比FRFT和DFT算法
算法
noipp3 小时前
推荐题目:洛谷 B2099 矩阵交换行
线性代数·算法·矩阵