如何准确使用CRC?

时间:2014-07-08 17:23:58

标签: javascript node.js crc crc32

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

var crc = require('crc');

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

我认为,函数crc32的结果是使用多项式hello的{​​{1}}的校验和。如果我错了,请纠正我。

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

0x04C11DB7

输出

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)

1 个答案:

答案 0 :(得分:2)

是的,crc32函数使用您引用的多项式,但它也是通过获取一个补码进行前置和后置处理的。这消除了附加CRC的消息的(纯)CRC为零的特性。

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