Node CRC16 - (README in English)
MODBUS是一种应用层消息通讯协议, 使得用各种不同类型的总线或网络连接的设备支持C/S通信,被广泛应用于嵌入式应用通讯开发。协议中通信数据包的“CRC循环冗余校验和”的生成与校验, 如MODBUS串行线通信(第42页),Modbus-RTU通信(第75页),都采用了同一种算法。
本模块实现了该算法的 查表法 C++代码实现, Node原生模块的封装, 以及NodeJS模块的封装。
本模块有充分的单元测试和完善的使用文档。
如果你的Node
版本小于v8.x.x
,请使用本模块的v1.x.x
版本,否则请使用v2.x.x
。 在本模块v2.x.x
中,引入了NAPI
来实现原生模块,有更好的兼容性。
温馨提示: 其实最好的方法使用说明, 在源码的注释与单元测试的代码里面 :)
npm install node-crc16
checkSum
接收三个参数,前两个参数 (input, [encoding])
其实是为了生成一个Buffer
crc16.checkSum('一个utf8字符串', 'utf8')
encoding
默认值为hex
var sum = crc16.checkSum('a031ffb7');
sum.should.equal('726d');
第三个参数option
,是对象类型。
option.retType
,返回校验和的格式,取值:- 默认值
hex
,2字节大端字节序hex编码,如726d
array
, 校验和单字节数组,如[114, 109]
int
,校验和16字节整型,如29293
buffer
,校验和以Buffer
类型返回,如<Buffer 72 6d>
- 默认值
var sum = crc16.checkSum('a031ffb7', {retType: 'array'});
sum.should.eql([114, 109]);
verifySum
传参与checkSum
一致,前两个参数都是为了生成一个Buffer
,且Buffer
包含校验和
var stream = 'a031ffb7',
sum = '726d';
var isValid = crc16.verifySum(stream + sum);
isValid.should.equal(true);
# fork 源码,然后克隆到本地
git clone [email protected]:imnemo/crc16.git
cd crc16
├── lib //CRC16算法的C++实现
├── util //工具方法
├── src //Node原生模块的实现
├── test //JS单元测试代码
├── test_cpp //C++单元测试代码
├── index.js //Node模块入口文件
npm install
CRC16生成与校验算法的C++实现是独立的,如有修改该文件,完成后请编写相应的单元测试代码。 C++单元测试请参考的Catch,完成后请执行:
make test
保证全部测试用例通过。
npm test
或者 ./node_modules/.bin/mocha --reporter spec
>>> npm run benchmark
> [email protected] benchmark /Users/nemo/code/imnemo/crc16
> node benchmark/benchmark.js
CEC16#checkSum x 905,071 ops/sec ±2.00% (83 runs sampled)
CRC16#verifySum x 1,540,940 ops/sec ±19.92% (65 runs sampled)
Fastest is CRC16#verifySum
>>> npm run nanobench
> [email protected] nanobench /Users/nemo/code/imnemo/crc16
> node benchmark/nanobench.js
NANOBENCH version 2
> /Users/nemo/.nvm/versions/node/v8.1.2/bin/node benchmark/nanobench.js
# CRC16#checkSum 2,000,000 times
ok ~3.17 s (3 s + 166422442 ns)
# CRC16#verifySum 2,000,000 times
ok ~2.85 s (2 s + 848059820 ns)
all benchmarks completed
ok ~6.01 s (6 s + 14482262 ns)
所有单元测试通过后,您就可以Pull一个Request了 :)
- 增加JS代码lint
- 增加变更日志
- 增加JS代码单元测试
- 增加JS代码测试覆盖率
- 增加C++代码单元测试
- 增加持续集成
- 增加性能测试
- 用NAPI重构Node原生模块部分
- 添加
index.js.d
文件 - 支持全局模块,提供CLI
- 增加打赏入口
twitter: @imoncoding
一个追求专业、规范、极简, 关注技术本质,笃信万物相通的公众号!