CRC计算 - 逐位 - C ++

时间:2018-06-07 20:02:25

标签: 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) 
    break;  
}

但是,我不知道如何一点一点地阅读它。

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

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

2 个答案:

答案 0 :(得分:0)

你的意思是这些吗? CRC计算可能会有所不同,但这里的重点是获取文件内容"逐位"。

var x = document.getElementsByClassName("btn");
        var i;
        for (i = 0; i < x.length; i++) {
            (<HTMLElement>x[i]).setAttribute("disabled", "disabled");
        }

答案 1 :(得分:0)

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

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

相关问题