CRC计算 - 一点一点 - C++
CRC calculation - bit by bit - C++
我需要创建一个程序,从文件计算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++ 中|
(。您以相同的方式获取该位:如果您逐字节读取,则下一个位是1
或0
,具体取决于输入中是否设置了0x80
。然后将输入内容向左移动。
相关文章:
- 为什么布尔值不能比作最后一点?
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 我无法理解这一点,有人可以帮我解释一下吗?
- 结构本身就包含在内.如何理解这一点?
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 尝试使用 indexOf 创建一个 if 语句来检查字符串是否包含字符.有一点麻烦
- 我可以直接为指针分配地址吗?如果是,如何做到这一点
- 检查是否至少设置了一点而不跳跃
- 请证明这一点的合理性 C++.
- CRC计算 - 一点一点 - C++
- 为什么要按值传递string_view?为什么Visual Studio不能优化这一点?
- [expr.unary.op]/9 似乎暗示"运算符!()' 不能应用于下面的类型 A.但编译器不同意这一点
- 为什么我有一个无限循环,我如何以不同的方式做到这一点
- 我想使用 CMake 生成和编译 Visual Studio projet,我需要从构建中排除单元测试文件。有没有办法做到这一点?
- 所有版本的 GCC 都与默认成员初始值设定项作斗争,该初始值设定项捕获了这一点,并结合了继承的构造函数
- 如果有条件使用String.length()的条件,为什么不一致地评估这一点
- 对随机序列进行降采样会降低随机性吗?有没有原理/定理来证明这一点?
- 我正在制作一个二十一点程序。我目前有两个问题
- 在C++有没有更好的方法可以做到这一点?检查哪些数字满足条件 [A*B*C = A! + B! + C!]
- 4.5年应该是4年零178年,我如何在C 中做到这一点