CRC 32不起作用

时间:2016-06-01 16:49:01

标签: c++

您好我发现了一个C ++实现,但它不起作用。这里:

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];
     crc = crc ^ byte;
    for(j=7; j>=0; j--){
     for(j=0; j>= 0; j--) {
      mask = -(crc & 1);
      crc = (crc >> 1) ^ (0xEDB88320 & mask);
        }
        i = i + 1;
       }

    return ~crc;

 }
}

int main()
{
unsigned char a='a';
crc32(&a);

cout<return 0;

它表示一元运算符应用于无符号类型,结果仍未签名。

当我删除减号时,它不会给我一个真正的CRC代码。

1 个答案:

答案 0 :(得分:1)

  • crc32函数调用以null结尾的消息,因此将指针传递给char变量是不好的。
  • cout<return 0;没有意义。
  • for(j=7; j>=0; j--){for(j=0; j>= 0; j--) {之间存在循环变量冲突。删除内部循环,因为它是一次性循环,它不必是循环。
  • i = i + 1;return ~crc;位置错误。您应该正确格式化代码。
  • 编译器似乎讨厌使用-(crc & 1)来获取0xFFFFFFFF

更正后的代码:

#include <iostream>
using std::cout;

unsigned int crc32(unsigned char* message) {
    int i, j;

    unsigned int byte, crc;

    i = 0;

    crc = 0xFFFFFFFF;
    while(message[i] != 0) {
        byte = message[i];
        crc = crc ^ byte;
        for(j=7; j>=0; j--){
            crc = (crc >> 1) ^ (crc & 1 ? 0xEDB88320 : 0);
        }
        i = i + 1;

    }
    return ~crc;
}

int main()
{
    unsigned char a[] = {'a', 0};
    cout << crc32(a);

    return 0;
}