// 异或和校验 function xor_verify(data){ if (data.length < 2){ return false; } var xor_sum = xor(data, 1, data.length - 2); if (xor_sum == data[data.length - 1]){ return true; } return false; } // 获取异或和 function xor(data, start, end){ var xor_sum = data[start]; for (var i = start + 1; i < end + 1; i++){ xor_sum ^= data[i]; } return xor_sum; } // crc校验 function crc(bytes) { // CRC寄存器全为1 var CRC = 0x0000ffff; // 多项式校验值 var POLYNOMIAL = 0x0000a001; for (var i = 0; i < bytes.length; i++) { CRC ^= bytes[i] & 0x000000ff; for (var j = 0; j < 8; j++) { if (CRC & 0x00000001 != 0) { CRC >>= 1; CRC ^= POLYNOMIAL; } else { CRC >>= 1; } } } return CRC; } function crc_verify(data){ var verifyBytes = ConvertToUint8Array(data, 1, data.length - 2); var crcBytes = ConvertToUint8Array(data, data.length - 2, data.length); var thisCrc = crc(verifyBytes); var thatCrc = new DataView(crcBytes.buffer).getUint16(0, true); if (thisCrc == thatCrc){ return true; } return false; } // 字节数组 function ArrayToHexString(data,start,end){ start = start?start:0; end = end?end:data.length; var Hex = ''; for (var i =start; i < end; i++) { var s = data[i].toString(16); if (s.length == 1) { s = "0"+s; } Hex += s; } return Hex.toUpperCase(); } function ConvertToUint8Array(rawData, start, end) { start = start?start:0; end = end?end:rawData.length; var uint8Array = new Uint8Array(end - start); for (var i = start; i < end; i++) { uint8Array[i-start] = rawData[i] & 0xff; } return uint8Array; } // 合并字节数组 function concat(array1, array2) { var uint8Array = new Uint8Array(array1.length + array2.length); for (var i = 0; i < array1.length; i++) { uint8Array[i] = array1[i] & 0xff; } for (var j = 0; j < array2.length; j++) { uint8Array[j + array1.length] = array2[j] & 0xff; } return uint8Array; } // 判断数组中是否包含某个元素 function includes(array, item) { for (var i = 0; i < array.length; i++){ if (array[i] == item){ return true; } } return false; }