[英]Validating CRC32 checksum
I am able to successfully generate a CRC32 that matches the expected output.我能够成功生成与预期的 output 匹配的 CRC32。 However, when I try to plug the message M with checksum C (generated by the CRC32 function) back into that same CRC32 generator, I'm not able to get the expected output of 0x00000000.
但是,当我尝试将带有校验和 C(由 CRC32 函数生成)的消息 M 插入同一个 CRC32 生成器时,我无法获得预期的 output 0x00000000。
My CRC32 generator is basically just the code here ( https://lxp32.github.io/docs/a-simple-example-crc32-calculation/ ), with an additional function argument for the checksum, since the message and checksum in my case are in separate memory locations upon receipt. My CRC32 generator is basically just the code here ( https://lxp32.github.io/docs/a-simple-example-crc32-calculation/ ), with an additional function argument for the checksum, since the message and checksum in my箱子在收到时位于单独的 memory 位置。
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 Input 1: 0x61 0x62 0x63 0x64 0x00 0x00 0x00 0x00 CRC32 输入 1:0x61 0x62 0x63 0x64 0x00 0x00 0x00 0x00
CRC32 Output 1: 0x 87988EF9 CRC32 Output 1:0x 87988EF9
CRC32 Input 2: 0x61 0x62 0x63 0x64 0x87 0x98 0x8E 0xF9 CRC32 输入 2:0x61 0x62 0x63 0x64 0x87 0x98 0x8E 0xF9
CRC32 Output 2: 0x5D19F7CF CRC32 Output 2:0x5D19F7CF
I feel like I'm not understanding something right here...我觉得我在这里没有理解一些东西......
0x2144df1c
.0x2144df1c
。 (It's not zero because there is a final exclusive-or with a non-zero value.)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.