我已经读过著名的文章A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS,现在我想尝试一下。我正在使用一个nodejs模块node-crc,它看起来很容易使用:

var crc = require('crc');

crc.crc32('hello');
# => "3610a686"


我相信函数crc32的结果是使用多项式hello0x04C11DB7校验和。如果我错了,请纠正我。

因此,下一步是将校验和附加到原始数据。这是我的代码:

var crc = require('crc');

var bf = Buffer("test");

charlist = crc.crc32(bf).toString();
var k = []
for (var i=0; i< 8; i++) {
    k.push(parseInt(charlist[i], 16));
}
console.log(k)
var checksum = Buffer(k);
console.log(crc.crc32(Buffer.concat([bf, checksum])));


输出

[ 13, 8, 7, 15, 7, 14, 0, 12 ]
646b4f9b


我期望第二个输出是0,但不是。
因此,我在这里寻求帮助。什么是正确的方法(附加并检查是否正确接收了邮件)?谢谢。

编辑

所以我知道第二个输出不一定是0。这是最终的解决方案:

var crc = require('crc');

var bf = Buffer("test");

charlist = crc.crc32(bf).toString();
var k = []
for (var i=0; i< 8; i++) {
    k.push(parseInt(charlist[i], 16));
}
var checksum = Buffer(k);

transfer_data = Buffer.concat([bf, checksum]);

////////////////////// Network Transfer /////////////////////////

received_data = transfer_data

checksum = received_data.slice(-8);
charlist = '';
for (var i=0; i<8; i++) {
    charlist += checksum.readUInt8(i).toString(16);
}

// these two should be equal if data received correctly
console.log(crc.crc32(received_data.slice(0, -8)));
console.log(charlist)


输出量

d87f7e0c
d87f7e0c

最佳答案

是的,crc32函数使用您引用的多项式,但是也可以通过使用一个人的补码对其进行预处理和后处理。这就消除了附加了CRC的消息的(纯)CRC为零的属性。

可以扩展到任何形式的校验值的校验CRC的正确方法是,简单地对消息计算指定的校验算法,然后将结果与附加到消息的校验值进行比较。

08-17 13:03
查看更多