各位老师好,有一个关于 crc16验证的问题:
手机通过ble蓝牙连接扫码枪后,得到数据后,要通过如下的crc16 js 进行验证。
ble通信文档
传输命令格式:
OP (1 BYTE)
|
Len(1 BYTE)
|
CRC16(2 BYTE)
|
Data(0~250BYTE)
|
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编辑过]