var HEX = {}; /** * @param {Object} buffer * ArrayBuffer转16进制字符串 */ HEX.ab2hex = function (buffer) { const hexArr = Array.prototype.map.call( new Uint8Array(buffer), function (bit) { return ('00' + bit.toString(16)).slice(-2) } ) return hexArr.join('') } //int转hex HEX.intTohex = function (data, len) { // console.log(data); len = len * 2; var retVal = data.toString(16); //console.log(retVal); if (retVal.length > len) return retVal; var length = retVal.length; for (var i = 0; i < len - length; i++) { retVal = '0' + retVal; } return retVal; } //需要用到的函数 HEX.InsertString = function (t, c, n) { var r = new Array(); for (var i = 0; i * 2 < t.length; i++) { r.push(t.substr(i * 2, n)); } return r.join(c); } //需要用到的函数 HEX.FillString = function (t, c, n, b) { if ((t == "") || (c.length != 1) || (n <= t.length)) { return t; } var l = t.length; for (var i = 0; i < n - l; i++) { if (b == true) { t = c + t; } else { t += c; } } return t; } //16进制转双精度浮点数 HEX.HexToDouble = function (temp) { let ret = '' for (let i = 0; i < temp.length; i = i + 2) { ret = temp.substr(i, 2) + ret; } temp = ret; let S_Bin = ""; //转化后的二进制字符串 for (let i = 0; i < temp.length; i++) { let temp1 = temp.charAt(i); S_Bin = S_Bin + HEX.charToBin(temp1); } let sign = 0; //符号位 if (S_Bin.charAt(0) == '1') { sign = 1; } let exponent = ""; for (let i = 1; i < 12; i++) { if (S_Bin.charAt(i) == '1') { exponent = exponent + '1'; } else exponent = exponent + '0'; } let exponent_double = 0; //阶码 exponent_double = HEX.stringToDouble(exponent); exponent_double = exponent_double - 1023; let mantissa_temp = ""; for (let i = 12; i < 64; i++) { if (S_Bin.charAt(i) == '1') { mantissa_temp = mantissa_temp + '1'; } else mantissa_temp = mantissa_temp + '0'; } let mantissa = 0; mantissa = HEX.BenToDex(mantissa_temp); mantissa = mantissa + 1.0; let res = 0; let a, c; a = Math.pow((-1), sign); c = Math.pow(2, exponent_double); res = a * mantissa * c; return res; } HEX.charToBin = function (temp) { return HEX.FillString(parseInt(temp, 16).toString(2), '0', 4, true); } HEX.stringToDouble = function (temp) { let res = 0; for (let i = 0; i < temp.length; i++) { res = res * 2 + (temp[i] - '0'); } return res; } HEX.BenToDex = function (temp) { let m = temp.length; let res = 0; for (let i = 0; i < m; i++) { res = res + (temp[i] - '0') * Math.pow(2, -i - 1); } return res; } //16进制转单精度浮点数 HEX.HexToSingle = function (t) { t = t.replace(/\s+/g, ""); if (t == "") { return 0; } if (t == "00000000") { return 0; } if ((t.length > 8) || (isNaN(parseInt(t, 16)))) { return "Error"; } if (t.length < 8) { t = HEX.FillString(t, "0", 8, true); } t = parseInt(t, 16).toString(2); t = HEX.FillString(t, "0", 32, true); var s = t.substring(0, 1); var e = t.substring(1, 9); var m = t.substring(9); e = parseInt(e, 2) - 127; m = "1" + m; if (e >= 0) { m = m.substr(0, e + 1) + "." + m.substring(e + 1) } else { m = "0." + HEX.FillString(m, "0", m.length - e - 1, true) } if (m.indexOf(".") == -1) { m = m + ".0"; } var a = m.split("."); var mi = parseInt(a[0], 2); var mf = 0; for (var i = 0; i < a[1].length; i++) { mf += parseFloat(a[1].charAt(i)) * Math.pow(2, -(i + 1)); } m = parseInt(mi) + parseFloat(mf); if (s == 1) { m = 0 - m; } return m; } //浮点数转16进制 HEX.SingleToHex = function (t) { if (t == "") { return ""; } //console.log(t); t = parseFloat(t); //console.log(t); if (isNaN(t) == true) { return "Error"; } if (t == 0) { return "00000000"; } var s, e, m; if (t > 0) { s = 0; } else { s = 1; t = 0 - t; } m = t.toString(2); if (m >= 1) { if (m.indexOf(".") == -1) { m = m + ".0"; } e = m.indexOf(".") - 1; } else { e = 1 - m.indexOf("1"); } if (e >= 0) { m = m.replace(".", ""); } else { m = m.substring(m.indexOf("1")); } if (m.length > 24) { m = m.substr(0, 24); } else { m = HEX.FillString(m, "0", 24, false) } m = m.substring(1); e = (e + 127).toString(2); e = HEX.FillString(e, "0", 8, true); var r = parseInt(s + e + m, 2).toString(16); r = HEX.FillString(r, "0", 8, true); return HEX.InsertString(r, "", 2).toUpperCase(); } HEX.stringToHex = function (str) { var val = ""; for (var i = 0; i < str.length; i++) { if (val == "") val = str.charCodeAt(i).toString(16); else val += str.charCodeAt(i).toString(16); } return val; } HEX.hexToString = function (hexCharCodeStr) { var trimedStr = hexCharCodeStr.trim(); var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr; var len = rawStr.length; if (len % 2 !== 0) { alert("Illegal Format ASCII Code!"); return ""; } var curCharCode; var resultStr = []; for (var i = 0; i < len; i = i + 2) { if (rawStr.substr(i, 2) == '00') { resultStr.push(''); } else { curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value resultStr.push(String.fromCharCode(curCharCode)); } } return resultStr.join(""); } HEX.add0 = function (m) { return m < 10 ? '0' + m : m } var CRC = {}; CRC.CRC16 = function (data) { var len = data.length; if (len > 0) { var crc = 0xFFFF; for (var i = 0; i < len; i++) { crc = (crc ^ (data[i])); for (var j = 0; j < 8; j++) { crc = (crc & 1) != 0 ? ((crc >> 1) ^ 0xA001) : (crc >> 1); } } var hi = ((crc & 0xFF00) >> 8); //高位置 var lo = (crc & 0x00FF); //低位置 return [hi, lo]; } return [0, 0]; }; CRC.isArray = function (arr) { return Object.prototype.toString.call(arr) === '[object Array]'; }; CRC.ToCRC16 = function (str, isReverse) { return CRC.toString(CRC.CRC16(CRC.isArray(str) ? str : CRC.strToByte(str)), isReverse); }; CRC.ToModbusCRC16 = function (str, isReverse) { return CRC.toString(CRC.CRC16(CRC.isArray(str) ? str : CRC.strToHex(str)), isReverse); }; CRC.strToByte = function (str) { var tmp = str.split(''), arr = []; for (var i = 0, c = tmp.length; i < c; i++) { var j = encodeURI(tmp[i]); if (j.length == 1) { arr.push(j.charCodeAt()); } else { var b = j.split('%'); for (var m = 1; m < b.length; m++) { arr.push(parseInt('0x' + b[m])); } } } return arr; }; CRC.convertChinese = function (str) { var tmp = str.split(''), arr = []; for (var i = 0, c = tmp.length; i < c; i++) { var s = tmp[i].charCodeAt(); if (s <= 0 || s >= 127) { arr.push(s.toString(16)); } else { arr.push(tmp[i]); } } return arr; }; CRC.filterChinese = function (str) { var tmp = str.split(''), arr = []; for (var i = 0, c = tmp.length; i < c; i++) { var s = tmp[i].charCodeAt(); if (s > 0 && s < 127) { arr.push(tmp[i]); } } return arr; }; CRC.strToHex = function (hex, isFilterChinese) { hex = isFilterChinese ? CRC.filterChinese(hex).join('') : CRC.convertChinese(hex).join(''); //清除所有空格 hex = hex.replace(/\s/g, ""); //若字符个数为奇数,补一个0 hex += hex.length % 2 != 0 ? "0" : ""; var c = hex.length / 2, arr = []; for (var i = 0; i < c; i++) { arr.push(parseInt(hex.substr(i * 2, 2), 16)); } return arr; }; CRC.padLeft = function (s, w, pc) { if (pc == undefined) { pc = '0'; } for (var i = 0, c = w - s.length; i < c; i++) { s = pc + s; } return s; }; CRC.toString = function (arr, isReverse) { if (typeof isReverse == 'undefined') { isReverse = true; } var hi = arr[0], lo = arr[1]; return CRC.padLeft((isReverse ? hi + lo * 0x100 : hi * 0x100 + lo).toString(16).toUpperCase(), 4, '0'); };