我已经读过著名的文章A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS,现在我想尝试一下。我正在使用一个nodejs模块node-crc,它看起来很容易使用:
var crc = require('crc');
crc.crc32('hello');
# => "3610a686"
我相信函数
crc32
的结果是使用多项式hello
的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)
输出量
d87f7e0c
d87f7e0c
最佳答案
是的,crc32
函数使用您引用的多项式,但是也可以通过使用一个人的补码对其进行预处理和后处理。这就消除了附加了CRC的消息的(纯)CRC为零的属性。
可以扩展到任何形式的校验值的校验CRC的正确方法是,简单地对消息计算指定的校验算法,然后将结果与附加到消息的校验值进行比较。