超过 26 字节的 CRC 计算
CRC calculation over 26 bytes
我正在实施简单的协议,我需要根据以下结构计算 CRC:
type (1 byte, unsigned)
address (1 byte, unsigned)
dataID (4 bytes, unsigned, little-endian)
data (4 bytes, unsigned, little-endian)
data (4 bytes, unsigned, little-endian)
data (4 bytes, unsigned, little-endian)
data (4 bytes, unsigned, little-endian)
data (4 bytes, unsigned, little-endian)
-----------------
= (26 bytes)
你可以把它想象成简单的JavaScript对象:
var message = {
type: 0x11,
address: 0x01,
dataID: 0xFFFFFFFF,
data: [
0xFFFFFFFF,
0xFFFFFFFF,
0xFFFFFFFF,
0xFFFFFFFF,
0xFFFFFFFF
]
}
我需要根据这个对象计算 CRC。不幸的是,手册中只有 CRC calculation includes Message type, Slave Address Data-ID's and data values. CRC calculation is performed over 26 bytes.
所以我不确定我应该怎么做。
CRC 是使用 CRC16-CCIT 函数计算的。所以我从 NPM 下载了 crc package,它已经实现了这个功能。
如果你 post 我编写代码就太好了,因为我不知道该怎么做(你可以使用未声明的 crc
函数,它等同于 this)。
你可以从这个开始:
var crc16ccitt = require('crc').crc16ccitt;
function checksum(message) {
var buf = new Buffer(26);
buf.writeUInt8(message.type, 0);
buf.writeUInt8(message.address, 1);
buf.writeUInt32LE(message.dataID, 2);
for (var i = 0; i < 5; i++) {
buf.writeUInt32LE(message.data[i], 6 + i * 4);
}
return crc16ccitt(buf);
}
我正在实施简单的协议,我需要根据以下结构计算 CRC:
type (1 byte, unsigned)
address (1 byte, unsigned)
dataID (4 bytes, unsigned, little-endian)
data (4 bytes, unsigned, little-endian)
data (4 bytes, unsigned, little-endian)
data (4 bytes, unsigned, little-endian)
data (4 bytes, unsigned, little-endian)
data (4 bytes, unsigned, little-endian)
-----------------
= (26 bytes)
你可以把它想象成简单的JavaScript对象:
var message = {
type: 0x11,
address: 0x01,
dataID: 0xFFFFFFFF,
data: [
0xFFFFFFFF,
0xFFFFFFFF,
0xFFFFFFFF,
0xFFFFFFFF,
0xFFFFFFFF
]
}
我需要根据这个对象计算 CRC。不幸的是,手册中只有 CRC calculation includes Message type, Slave Address Data-ID's and data values. CRC calculation is performed over 26 bytes.
所以我不确定我应该怎么做。
CRC 是使用 CRC16-CCIT 函数计算的。所以我从 NPM 下载了 crc package,它已经实现了这个功能。
如果你 post 我编写代码就太好了,因为我不知道该怎么做(你可以使用未声明的 crc
函数,它等同于 this)。
你可以从这个开始:
var crc16ccitt = require('crc').crc16ccitt;
function checksum(message) {
var buf = new Buffer(26);
buf.writeUInt8(message.type, 0);
buf.writeUInt8(message.address, 1);
buf.writeUInt32LE(message.dataID, 2);
for (var i = 0; i < 5; i++) {
buf.writeUInt32LE(message.data[i], 6 + i * 4);
}
return crc16ccitt(buf);
}