我有一个unsigned char数组,想要计算CRC32校验和。
然而,CRC32函数也需要一个unsigned char指针,但它将数组解释为ASCII数组。
这是CRC函数:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
unsigned int crc32(unsigned char *message)
{
int i, j;
unsigned int byte, crc, mask;
i = 0;
crc = 0xFFFFFFFF;
while (message[i] != 0) {
byte = message[i]; // Get next byte.
crc = crc ^ byte;
for (j = 7; j >= 0; j--) { // Do eight times.
mask = -(crc & 1);
crc = (crc >> 1) ^ (0xEDB88320 & mask);
}
i = i + 1;
}
return ~crc;
}
int main(int argc, char **argv)
{
unsigned char *arr;
if ((arr = malloc(64)) == NULL) {
perror("Could not allocate memory");
exit(EXIT_FAILURE);
}
char str[] = "47d46d17e759a1dec810758c08004510002127d90000401152e4c0a8b21fc0a8b2255b9b5b9c000db20caabbccddee00000000000000000000000000";
memcpy(arr, str, strlen(str));
// ...
unsigned int crc = crc32(arr);
printf("CRC: 0x%x\n", crc); // 0xB6BA014A instead of 0xBF6B57A2
return 0;
}
现在,我想计算CRC32,但无符号字符数组必须被解释为十六进制数组。
例如,这是计算CRC的结果:
输入:
"47d46d17e759a1dec810758c08004510002127d90000401152e4c0a8b21fc0a8b2255b9b5b9c000db20caabbccddee00000000000000000000000000"
- 作为ASCII:0xB6BA014A(这是我通常得到的结果,因为它被解释为ASCII)
- 作为十六进制:0xBF6B57A2(这是我想要的校验和)
byte = message[i];
以不使用ASCII值而是使用字节值。请参阅有关如何使用sscanf()
的十六进制字符串问题。 - fdk1342