Skip to content

Instantly share code, notes, and snippets.

@zbinlin
Last active August 8, 2016 13:56
Show Gist options
  • Save zbinlin/1f3bc430c04945ad2991aaf4d8e975c3 to your computer and use it in GitHub Desktop.
Save zbinlin/1f3bc430c04945ad2991aaf4d8e975c3 to your computer and use it in GitHub Desktop.
简单的验证和计算
"use strict";
function sum(buffer) {
let checksum = 0x0000;
let parity = buffer.length % 2;
for (let i = 0, len = buffer.length - parity; i < len; i += 2) {
checksum += buffer.readUInt16BE(i);
}
if (parity) {
checksum += buffer.readUInt8(buffer.length - 1) << 8 | 0x00;
}
while (checksum > 0xFFFF) {
let sum = checksum;
checksum = 0x0000;
do {
checksum += sum & 0xFFFF;
sum = sum >>> 16;
} while (sum > 0xFFFF);
}
return checksum;
}
/**
* 验证一个包含校验和的 buffer
* @param {Buffer} buffer
* @return {boolean}
*/
exports.verify = function verify(buffer) {
return sum(buffer) === 0xFFFF;
};
/**
* 根据 buffer 生成校验和,并将其放在前面
* @param {Buffer} buffer
* @return {Buffer} - buffer with checksum
*/
exports.generate = function generate(buffer) {
const checksum = ~sum(buffer) & 0xFFFF;
const ary = [Buffer.from([checksum >>> 8, checksum & 0xFF]), buffer];
return Buffer.concat(ary, 2 + buffer.length);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment