js中实现对数据的crc校验
程序员文章站
2022-03-03 13:43:18
...
对于读取一些标签数据,需要对数据的正确性进行校验,经过多次测试,终于实现了在js中对数据的校验,参考如下代码:
//把字符串转换为byte数组 function stringToBytes( str ) { var ch, st, re = []; for (var i = 0; i < str.length; i++ ) { ch = str.charCodeAt(i); st = []; do { st.push( ch & 0xFF ); ch = ch >> 8; } while ( ch ); re = re.concat( st.reverse() ); } return re; } //crc16校验,传入要校验的字符串,返回计算的crc16结果 function crc16(str) { var data = stringToBytes(str); var CRCStr=""; var i, j; var current_crc_value = 0xFFFF; for (i = 0; i <data.length ; i++) { current_crc_value = current_crc_value ^ (data[i] & 0xFF); for (j = 0; j < 8; j++) { if ((current_crc_value & 0x01) != 0) current_crc_value = (current_crc_value >> 1) ^ 0x8408; else current_crc_value = (current_crc_value >> 1); } } var temp = (current_crc_value & 0xFF).toString(16); if(temp.length==1)temp="0"+temp; CRCStr +=temp; temp = ((current_crc_value >> 8) & 0xFF).toString(16); if(temp.length==1)temp="0"+temp; CRCStr +=temp; return CRCStr.toUpperCase(); }
获取设备上传的数据为:E280689100000001ED539CA9,1:D664,冒号后面的“D664“为校验码,需要校验前面的”E280689100000001ED539CA9,1“计算的结果是否为D664,如果结果相等,则表示数据正确。
调用方式:
console.log(crc16("E280689100000001ED539CA9,1"));