CRC计算 - 一点一点 - C++

CRC calculation - bit by bit - C++

本文关键字:一点 C++ 计算 CRC      更新时间:2023-10-16

我需要创建一个程序,从文件计算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 计算可能会有所不同,但这里的重点是"一点一点地"获取文件内容。

#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;
}

除数不仅仅是称为多项式。这意味着每个位都是多项式(32 次(的系数,因此多项式的计算方式与使用整数有很大不同。您可以使用简单的 XOR 运算添加(和减去,在本例中相同(两个多项式。乘/除/除X意味着移位。向右或向左取决于多项式系数的写入顺序。了解这一点很重要,因为两个方向(从左到右和从右到左(实际上都存在。在0x04C11DB7的情况下,X^0 的系数是位 0,X^31 的系数是位 31。请注意,IEEE802.3 CRC 的流行实现具有相反的位顺序。因此,仅复制以太网CRC的实现是行不通的。

这意味着要处理的下一个位始终是位 31。因此,您必须检查0x80000000。如果设置了位,则对多项式进行 XOR 运算。这意味着,您从工作登记册中减去多项式。无论如何,之后将结果向左移动。然后0位在右侧移入。将其替换为要通过二进制or操作处理的下一个位(C++ 中|(。您以相同的方式获取该位:如果您逐字节读取,则下一个位是10,具体取决于输入中是否设置了0x80。然后将输入内容向左移动。

相关文章: