编辑代码

#include <stdio.h>

typedef unsigned long long int           uint64_t;
typedef unsigned long                    uint32_t;
typedef unsigned short                   uint16_t;
typedef unsigned char                    uint8_t;

uint8_t data[64] = {
0x00,0x9A,0x70,0x28,0x3A,0x08,0x41,0x08,0x40,0x00,0x58,0x3C,0x02,0xFE,0x00,0x00,
0x00,0x00,0x00,0x00,0x14,0x5A,0xC0,0x31,0x82,0xFD,0x08,0xEF,0x21,0xF6,0x0E,0x0C,
0x00,0x9A,0x70,0x28,0x3A,0x08,0x41,0x08,0x40,0x00,0x58,0x3C,0x02,0xFE,0x00,0x00,
0x00,0x00,0x00,0x00,0x14,0x5A,0xC0,0x31,0x82,0xFD,0x08,0xEF,0x77,0x5D,0x10,0x01,
};

uint8_t data_ff[] = {
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};

uint8_t data_00[] = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

uint32_t func_crc32(uint32_t data, uint32_t crc_init) {
    uint32_t crc_poly = 0x04c11db7;
    uint32_t refdata = crc_init;

    for (uint32_t i = 0; i < 32; i++) {
        refdata = (refdata << 1) ^ (((((refdata >> 31) & 0x01) ^
            ((data >> i) & 0x01)) == 0x01) ? 0xffffffff & crc_poly : 0x00000000 & crc_poly);
    }

    return refdata;
}

void sn_id(uint8_t * info, uint32_t size) {
    uint32_t uuid[4] = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
    
    for (uint8_t i = 0; i < (size / 16); i += 16) {
        uuid[0] = func_crc32(*(uint32_t*)&info[0 * 4 + i], uuid[0]);
        uuid[1] = func_crc32(*(uint32_t*)&info[1 * 4 + i], uuid[1]);
        uuid[2] = func_crc32(*(uint32_t*)&info[2 * 4 + i], uuid[2]);
        uuid[3] = func_crc32(*(uint32_t*)&info[3 * 4 + i], uuid[3]);
        printf("|1 UUID: %08X-%08X-%08X-%08X\n", uuid[0], uuid[1], uuid[2], uuid[3]);
    }

    printf("|2 UUID: %08X-%08X-%08X-%08X\n", uuid[0], uuid[1], uuid[2], uuid[3]);
}

int main () {
    uint32_t crc;

    for (uint8_t i = 0; i < sizeof(data); i += 16) {
        for (uint8_t j = 0; j < 16; j++) {
            printf("%02X", data[i+j]);
        }
        printf("\n");
    }

    sn_id(data, sizeof(data));

    // crc = 0xFFFFFFFF;
    // // crc = 0x0000000;
    // for (uint32_t i = 0; i < 0x2000; i++) {
    //     crc = func_crc32(0xFFFFFFFF, crc);
    // }
    // printf("crc ff %08X\n", crc);
    crc = 0xFFFFFFFF;
    for (uint32_t i = 0; i < 0x1000; i++) {
        crc = func_crc32(0x00000000, crc);
    }
    printf("crc 00 %08X\n", crc);
    crc = 0xFFFFFFFF;
    for (uint32_t i = 0; i < 0x2000; i++) {
        crc = func_crc32(0x00000000, crc);
    }
    printf("crc 00 %08X\n", crc);
    crc = 0xFFFFFFFF;
    for (uint32_t i = 0; i < 0x3000; i++) {
        crc = func_crc32(0x00000000, crc);
    }
    printf("crc 00 %08X\n", crc);

    return 0;
}