Crc32的C语言实现-无法正常工作

5

我在网上找到了这个CRC32实现方式,稍微修改了一下,但是我无法使它正常工作。我初始化并且每次从输入中获取一个字节时都会更新它,但是我得到的哈希值不是应该得到的结果...

typedef struct {
    unsigned short xor;
} xor_context;
void crc32_init(crc32_context *context) {
    context->crc = 0xFFFFFFFF;
}
void crc32_update(crc32_context *context, unsigned char byte) {
    uint32_t crc, mask;

    crc = context->crc;
    crc = crc ^ byte;
    for (int j = 7; j >= 0; j--) {    // Do eight times.
        mask = -(crc & 1);
        crc = (crc >> 1) ^ (0xEDB88320 & mask);
    }
    context->crc = ~crc;
}

这是原始的文本

unsigned int crc32b(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;
}

那么改回来吗? - Persixty
不会起作用的,我尝试过了。 - kiro135
你确定这个多项式是正确的吗? - fuz
3
请将原始代码和期望输入输出一并发布(即列出程序输出结果和你期望的输出结果)。如果你试图实现这个网站上的代码:http://www.hackersdelight.org/hdcodetxt/crc.c.txt,那么我注意到Hacker's delight代码在消息末尾执行not(~)操作,但是你在每个字符中应用了它“context->crc = ~crc”。 - Persixty
1个回答

2
//typedef struct {
//    unsigned short xor;
//} xor_context;//--> Not sure what part this plays in the code!

void crc32_init(crc32_context *context) {
    context->crc = 0xFFFFFFFF;
}

void crc32_update(crc32_context *context, unsigned char byte) {
    uint32_t crc, mask;

    crc = context->crc;
    crc = crc ^ byte;
    for (int j = 7; j >= 0; j--) {    // Do eight times.
        mask = -(crc & 1);
        crc = (crc >> 1) ^ (0xEDB88320 & mask);
    }
    //context->crc = ~crc; //<-- Don't perform for every byte.
    context->crc = crc; //EDIT: Forgot this!
}

//Completes the check.
uint32_t crc32_complete(crc32_context *context){
    return ~context->crc;
}

@kiro135,你看到我的修改了吗?我在去掉“not”时有点过于粗暴了。请参考上面的内容。 - Persixty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接