| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388 |
- 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');
- };
|