我能够成功地生成与预期输出相匹配的CRC32。但是,当我试图将带有校验和C(由CRC32函数生成)的消息M插入到同一个CRC32生成器中时,我无法获得预期的0x00000000输出。
我的CRC32生成器基本上就是这里的代码(https://lxp32.github.io/docs/a-simple-example-crc32-calculation/),带有一个用于校验和的附加函数参数,因为在我的示例中,消息和校验和在收到时位于不同的内存位置。
uint32_t crc32(const char* s, size_t n, uint32_t checksum) {
uint32_t crc = 0xFFFFFFFF;
size_t i; size_t j;
for (i = 0; i < n; i++) {
char ch = s[i];
uint32_t t = (ch ^ crc) & 0xFF;
crc = (crc >> 8) ^ crc32_table[t];
}
if (i & 1) { // if i ended odd, write a 0x00 pad bit
uint32_t t = (0x00 ^ crc) & 0xFF;
crc = (crc >> 8) ^ crc32_table[t];
}
// include checksum bits if not 0
if (checksum) {
for (j = 0; j < 4; j++) {
char ch = (checksum & 0xFF);
uint32_t t = (ch ^ crc) & 0xFF;
crc = (crc >> 8) ^ crc32_table[t];
checksum >>= 8;
}
}
else {
// append 32-bits of 0's
for (j = 0; j < 4; j++) {
uint32_t t = (0x00 ^ crc) & 0xFF;
crc = (crc >> 8) ^ crc32_table[t];
}
}
return ~crc;
}
bool validate_crc32(const char* msg, size_t n, uint32_t checksum) {
uint32_t res = crc32(msg, n, checksum);
return res == 0;
}CRC32输入1: 0x61 0x62 0x63 0x64 0x00 0x00 0x00
CRC32输出1: 0x87988EF9
CRC32输入2: 0x61 0x62 0x63 0x64 0x87 0x98 0x8E 0xF9
CRC32输出2: 0x5D19F7CF
我觉得我在这里不明白什么.
发布于 2020-07-29 03:01:23
,
0x2144df1c。(它不是零,因为有最终的排他性或非零值。),
https://stackoverflow.com/questions/63144948
复制相似问题