C++ CRC计算—逐位—C++;

C++ CRC计算—逐位—C++;,c++,crc,crc32,C++,Crc,Crc32,我需要创建一个程序,从文件计算CRC。这需要一点一点地做 我希望读取文件的方式: unsigned char byte; ifstream file; bool result; int number; file.open("test.txt", ios::binary); while(true) { byte = file.get(); number = (int)byte; result = file.good(); if(!result) br

我需要创建一个程序,从文件计算CRC。这需要一点一点地做

我希望读取文件的方式:

unsigned char byte;
ifstream file;
bool result;
int number;

file.open("test.txt", ios::binary);

while(true)
{
    byte = file.get();
    number = (int)byte;

    result = file.good();
    if(!result) 
    break;  
}
然而,我不知道如何一点一点地阅读它

我的CRC除数(称为“多项式”)是0x04C11DB7,每次计算缓冲区时,我需要从文件中导入1个新位


我的想法是将前4个字节添加到变量中(比如说“1234”,它将是0x31323334),然后删除最后一位(通过将数字1位移到左侧),但我不知道如何从下一个字符中添加新位

你的意思是类似于这些的东西吗? CRC计算可能会有所不同,但这里的重点是“逐位”获取文件内容

#包括
#包括
int main(int argc,char*argv[])
{
无符号字符next;
无符号长crc=0;
如果(argc<2)
返回-1;
std::fstream fs(argv[1],std::fstream::in);
而(!fs.bad()&&!fs.eof())
{
fs>>下一步;
对于(int i=0;i<8;i++)
{
crc+=next&1;
下一步>>=1;
}
}
除数不仅仅被称为多项式。它意味着每一位都是多项式的一个系数(32次),因此用多项式计算的方式与用整数计算的方式明显不同。你可以加(和减,在这种情况下是一样的)两个具有简单异或运算的多项式。与X相乘/除意味着移位。向右或向左取决于多项式系数的写入顺序。这一点很重要,因为两个方向(从左到右和从右到左)实际上存在。在
0x04C11DB7
的情况下,X^0的系数是位0,X^31的系数是位31。请注意,IEEE802.3 CRC的流行实现具有相反的位顺序。因此,仅复制以太网CRC的实现将不起作用


这意味着下一个要处理的位始终是位31。因此,必须检查
0x8000000
。如果该位已设置,则对多项式进行异或运算。这意味着,从工作寄存器中减去多项式。在任何情况下,之后将结果向左移动。然后在右侧移动
0
位。将其替换为下一个通过二进制
操作(
|
在C++中)处理的位。以相同的方式获取该位:如果逐字节读取,则下一位是
1
0
,具体取决于输入中是否设置了
0x80
。然后将输入向左移动。

读取一个字节,然后逐个处理字节中的每一位。考虑到您的编辑,我认为您正在询问如何移动4字节“窗口”通过数据流,一次一位。这是你的问题吗?你不能一次读取一位。一次读取一个字节(或更多),然后逐位处理这些字节。这个链接的示例有点残酷。大多数CRC都是在字节级别或更高级别上完成的。要获得所需内容,您必须对字节进行一些位屏蔽。例如:
val&0x80
,然后
val&0x40
,然后
val&0x20
,等等。您正在沿着一个位一次进行检查e boost似乎是当今所有问题的普遍答案。。。
#include <iostream>
#include <fstream>

int main(int argc, char* argv[])
{
    unsigned char next;
    unsigned long crc = 0;
    if (argc < 2)
        return -1;
    std::fstream fs(argv[1], std::fstream::in);
    while (!fs.bad() && !fs.eof())
    {
        fs >> next;
        for (int i = 0; i < 8; i++)
        {
            crc += next & 1;
            next >>= 1;
        }
    }
    std::cout << "CRC " << crc << std::endl;
    return 0;
}