我读过着名的文章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)
答案 0 :(得分:2)
是的,crc32
函数使用您引用的多项式,但它也是通过获取一个补码进行前置和后置处理的。这消除了附加CRC的消息的(纯)CRC为零的特性。
检查可以扩展到任何检查值方式的CRC的正确方法是简单地计算消息上的指定检查算法,然后将结果与附加到消息的检查值进行比较。