我需要创建一个程序,从文件中计算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位) ,但我不知道如何从下一个字符添加新位。
答案 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 ++中的|
)进行处理。您以相同的方式获得该位:如果您逐字节读取,则下一位是1
或0
,具体取决于您的输入中是否设置了0x80
。然后将输入移到左侧。