以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- crc16验证 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=107676) |
||||
-- 作者:fubblyc -- 发布时间:2017/10/7 16:52:00 -- crc16验证 各位老师好,有一个关于 crc16验证的问题: 手机通过ble蓝牙连接扫码枪后,得到数据后,要通过如下的crc16 js 进行验证。 ble通信文档 传输命令格式:
1、OP定义如下: NORMAL_PACKET 0X37 END_PACKET 0X38 一个长条码可能会分成多帧进行传输,一次最多传输250个字节的条码内容。 如果发送的不是最后一个包,OP填入NORMAL_PACKET。 如果发送的是最后一个包,OP填入END_PACKET。
2、Len定义如下: 是指Data域里面的数据长度,不包括CRC16的长度。
3、CRC16 Data域里面所有数据的校验和。校验方式为自定义校验方式,不是标准的CRC16.
4、Data定义如下: Data为扫码枪扫到的数据,如果条码过长会分多个报文进行传输。 js代码: function crcCheck(msg, len) { var crc = Number(0); var current = Number(0); for (var i = 0; i < len; i++) { current = (msg[i] & 0x000000FF) << 8; for (var j = 0; j < 8; j++) { if ((crc ^ current) & 0x8000) { crc = (crc << 1) ^ 0x1021; } else { crc <<= 1; } crc &= 0x0000FFFF; current <<= 1; } } return crc; }; 问题在这里,扫入的条码怎么变成这个 buffer的格式呢。。。 var buf = new Buffer([0xEA, 0xAE, 0x01, 0x02,0x59,0xAE]); //填BLE的条码数据(扫码枪扫入的条码)+秘钥(我这边已设置的8位数) 总长度14+8 =22 var crc16 = crcCheck(buf, buf.length); console.log("crc16[%j]=%j",buf.length,crc16.toString(16) ); [此贴子已经被作者于2017/10/7 16:51:53编辑过]
|
||||
-- 作者:有点甜 -- 发布时间:2017/10/7 17:03:00 -- 1、你扫描枪扫描的内容是什么?
2、Buffer就是一个数组,你把扫描的内容转换成一个数组即可。 |
||||
-- 作者:fubblyc -- 发布时间:2017/10/7 17:09:00 -- 哦哦,谢谢有点甜老师, 扫码枪的内容:(扫码枪扫入的条码14位数字)+秘钥(我这边已设置的8位数) 如:6949907605380 abc12345 (有一个空格) 甜老师,怎么转换成数组呢。。。
[此贴子已经被作者于2017/10/7 17:09:40编辑过]
|
||||
-- 作者:有点甜 -- 发布时间:2017/10/7 17:17:00 -- 你扫描的字符要如何转换成数组?两个字符分割?规则是什么? |
||||
-- 作者:fubblyc -- 发布时间:2017/10/7 17:25:00 -- 我也不知道用不用数组,只是这个js的代码示例是这样。 var buf = new Buffer([0xEA, 0xAE, 0x01, 0x02,0x59,0xAE]); 那如果不用的话,我就直接把6949907605380 abc12345 填入就可以哈。 var buf = new Buffer("6949907605380 abc12345") 这样符合 buffer的写法吗? [此贴子已经被作者于2017/10/7 17:25:37编辑过]
|
||||
-- 作者:有点甜 -- 发布时间:2017/10/7 17:29:00 -- 你直接填入扫描的内容,能否运算得到结果?
或者说,你如何填入数据后可以运算得到结果? |
||||
-- 作者:fubblyc -- 发布时间:2017/10/7 17:36:00 -- 恩恩,甜老师,我测试一下,之前一直在找 new Buffer([0xEA, 0xAE, 0x01, 0x02,0x59,0xAE]);怎么写,没想到可以直接用字符进去。 |
||||
-- 作者:有点甜 -- 发布时间:2017/10/7 17:41:00 -- 一般是把你扫描到的字符分拆成数组然后校验的,关键是看规则是怎么分拆,比如一个字符、两个字符。 |
||||
-- 作者:fubblyc -- 发布时间:2017/10/7 18:05:00 -- 这是他们给的示例代码: var buf = new Buffer([0xEA, 0xAE, 0x01, 0x02,0x59,0xAE]); //填BLE的条码数据(扫码枪扫入的条码13位和回车)+秘钥(我这边已设置的8位数) 总长度14+8 =22 能看出规则吗?
|
||||
-- 作者:有点甜 -- 发布时间:2017/10/7 18:12:00 -- 试试
var buf = "6949907605380abc12345"; var crc16 = crcCheck(buf, buf.length);
|