C++ CRC计算—逐位—C++;
我需要创建一个程序,从文件计算CRC。这需要一点一点地做 我希望读取文件的方式: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
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;
}