WebLib.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. var HEX = {};
  2. /**
  3. * @param {Object} buffer
  4. * ArrayBuffer转16进制字符串
  5. */
  6. HEX.ab2hex = function (buffer) {
  7. const hexArr = Array.prototype.map.call(
  8. new Uint8Array(buffer),
  9. function (bit) {
  10. return ('00' + bit.toString(16)).slice(-2)
  11. }
  12. )
  13. return hexArr.join('')
  14. }
  15. //int转hex
  16. HEX.intTohex = function (data, len) {
  17. // console.log(data);
  18. len = len * 2;
  19. var retVal = data.toString(16);
  20. //console.log(retVal);
  21. if (retVal.length > len) return retVal;
  22. var length = retVal.length;
  23. for (var i = 0; i < len - length; i++) {
  24. retVal = '0' + retVal;
  25. }
  26. return retVal;
  27. }
  28. //需要用到的函数
  29. HEX.InsertString = function (t, c, n) {
  30. var r = new Array();
  31. for (var i = 0; i * 2 < t.length; i++) {
  32. r.push(t.substr(i * 2, n));
  33. }
  34. return r.join(c);
  35. }
  36. //需要用到的函数
  37. HEX.FillString = function (t, c, n, b) {
  38. if ((t == "") || (c.length != 1) || (n <= t.length)) {
  39. return t;
  40. }
  41. var l = t.length;
  42. for (var i = 0; i < n - l; i++) {
  43. if (b == true) {
  44. t = c + t;
  45. } else {
  46. t += c;
  47. }
  48. }
  49. return t;
  50. }
  51. //16进制转双精度浮点数
  52. HEX.HexToDouble = function (temp) {
  53. let ret = ''
  54. for (let i = 0; i < temp.length; i = i + 2) {
  55. ret = temp.substr(i, 2) + ret;
  56. }
  57. temp = ret;
  58. let S_Bin = ""; //转化后的二进制字符串
  59. for (let i = 0; i < temp.length; i++) {
  60. let temp1 = temp.charAt(i);
  61. S_Bin = S_Bin + HEX.charToBin(temp1);
  62. }
  63. let sign = 0; //符号位
  64. if (S_Bin.charAt(0) == '1') {
  65. sign = 1;
  66. }
  67. let exponent = "";
  68. for (let i = 1; i < 12; i++) {
  69. if (S_Bin.charAt(i) == '1') {
  70. exponent = exponent + '1';
  71. } else
  72. exponent = exponent + '0';
  73. }
  74. let exponent_double = 0; //阶码
  75. exponent_double = HEX.stringToDouble(exponent);
  76. exponent_double = exponent_double - 1023;
  77. let mantissa_temp = "";
  78. for (let i = 12; i < 64; i++) {
  79. if (S_Bin.charAt(i) == '1') {
  80. mantissa_temp = mantissa_temp + '1';
  81. } else
  82. mantissa_temp = mantissa_temp + '0';
  83. }
  84. let mantissa = 0;
  85. mantissa = HEX.BenToDex(mantissa_temp);
  86. mantissa = mantissa + 1.0;
  87. let res = 0;
  88. let a, c;
  89. a = Math.pow((-1), sign);
  90. c = Math.pow(2, exponent_double);
  91. res = a * mantissa * c;
  92. return res;
  93. }
  94. HEX.charToBin = function (temp) {
  95. return HEX.FillString(parseInt(temp, 16).toString(2), '0', 4, true);
  96. }
  97. HEX.stringToDouble = function (temp) {
  98. let res = 0;
  99. for (let i = 0; i < temp.length; i++) {
  100. res = res * 2 + (temp[i] - '0');
  101. }
  102. return res;
  103. }
  104. HEX.BenToDex = function (temp) {
  105. let m = temp.length;
  106. let res = 0;
  107. for (let i = 0; i < m; i++) {
  108. res = res + (temp[i] - '0') * Math.pow(2, -i - 1);
  109. }
  110. return res;
  111. }
  112. //16进制转单精度浮点数
  113. HEX.HexToSingle = function (t) {
  114. t = t.replace(/\s+/g, "");
  115. if (t == "") {
  116. return 0;
  117. }
  118. if (t == "00000000") {
  119. return 0;
  120. }
  121. if ((t.length > 8) || (isNaN(parseInt(t, 16)))) {
  122. return "Error";
  123. }
  124. if (t.length < 8) {
  125. t = HEX.FillString(t, "0", 8, true);
  126. }
  127. t = parseInt(t, 16).toString(2);
  128. t = HEX.FillString(t, "0", 32, true);
  129. var s = t.substring(0, 1);
  130. var e = t.substring(1, 9);
  131. var m = t.substring(9);
  132. e = parseInt(e, 2) - 127;
  133. m = "1" + m;
  134. if (e >= 0) {
  135. m = m.substr(0, e + 1) + "." + m.substring(e + 1)
  136. } else {
  137. m = "0." + HEX.FillString(m, "0", m.length - e - 1, true)
  138. }
  139. if (m.indexOf(".") == -1) {
  140. m = m + ".0";
  141. }
  142. var a = m.split(".");
  143. var mi = parseInt(a[0], 2);
  144. var mf = 0;
  145. for (var i = 0; i < a[1].length; i++) {
  146. mf += parseFloat(a[1].charAt(i)) * Math.pow(2, -(i + 1));
  147. }
  148. m = parseInt(mi) + parseFloat(mf);
  149. if (s == 1) {
  150. m = 0 - m;
  151. }
  152. return m;
  153. }
  154. //浮点数转16进制
  155. HEX.SingleToHex = function (t) {
  156. if (t == "") {
  157. return "";
  158. }
  159. //console.log(t);
  160. t = parseFloat(t);
  161. //console.log(t);
  162. if (isNaN(t) == true) {
  163. return "Error";
  164. }
  165. if (t == 0) {
  166. return "00000000";
  167. }
  168. var s,
  169. e,
  170. m;
  171. if (t > 0) {
  172. s = 0;
  173. } else {
  174. s = 1;
  175. t = 0 - t;
  176. }
  177. m = t.toString(2);
  178. if (m >= 1) {
  179. if (m.indexOf(".") == -1) {
  180. m = m + ".0";
  181. }
  182. e = m.indexOf(".") - 1;
  183. } else {
  184. e = 1 - m.indexOf("1");
  185. }
  186. if (e >= 0) {
  187. m = m.replace(".", "");
  188. } else {
  189. m = m.substring(m.indexOf("1"));
  190. }
  191. if (m.length > 24) {
  192. m = m.substr(0, 24);
  193. } else {
  194. m = HEX.FillString(m, "0", 24, false)
  195. }
  196. m = m.substring(1);
  197. e = (e + 127).toString(2);
  198. e = HEX.FillString(e, "0", 8, true);
  199. var r = parseInt(s + e + m, 2).toString(16);
  200. r = HEX.FillString(r, "0", 8, true);
  201. return HEX.InsertString(r, "", 2).toUpperCase();
  202. }
  203. HEX.stringToHex = function (str) {
  204. var val = "";
  205. for (var i = 0; i < str.length; i++) {
  206. if (val == "")
  207. val = str.charCodeAt(i).toString(16);
  208. else
  209. val += str.charCodeAt(i).toString(16);
  210. }
  211. return val;
  212. }
  213. HEX.hexToString = function (hexCharCodeStr) {
  214. var trimedStr = hexCharCodeStr.trim();
  215. var rawStr =
  216. trimedStr.substr(0, 2).toLowerCase() === "0x" ?
  217. trimedStr.substr(2) :
  218. trimedStr;
  219. var len = rawStr.length;
  220. if (len % 2 !== 0) {
  221. alert("Illegal Format ASCII Code!");
  222. return "";
  223. }
  224. var curCharCode;
  225. var resultStr = [];
  226. for (var i = 0; i < len; i = i + 2) {
  227. if (rawStr.substr(i, 2) == '00') {
  228. resultStr.push('');
  229. } else {
  230. curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value
  231. resultStr.push(String.fromCharCode(curCharCode));
  232. }
  233. }
  234. return resultStr.join("");
  235. }
  236. HEX.add0 = function (m) {
  237. return m < 10 ? '0' + m : m
  238. }
  239. var CRC = {};
  240. CRC.CRC16 = function (data) {
  241. var len = data.length;
  242. if (len > 0) {
  243. var crc = 0xFFFF;
  244. for (var i = 0; i < len; i++) {
  245. crc = (crc ^ (data[i]));
  246. for (var j = 0; j < 8; j++) {
  247. crc = (crc & 1) != 0 ? ((crc >> 1) ^ 0xA001) : (crc >> 1);
  248. }
  249. }
  250. var hi = ((crc & 0xFF00) >> 8); //高位置
  251. var lo = (crc & 0x00FF); //低位置
  252. return [hi, lo];
  253. }
  254. return [0, 0];
  255. };
  256. CRC.isArray = function (arr) {
  257. return Object.prototype.toString.call(arr) === '[object Array]';
  258. };
  259. CRC.ToCRC16 = function (str, isReverse) {
  260. return CRC.toString(CRC.CRC16(CRC.isArray(str) ? str : CRC.strToByte(str)), isReverse);
  261. };
  262. CRC.ToModbusCRC16 = function (str, isReverse) {
  263. return CRC.toString(CRC.CRC16(CRC.isArray(str) ? str : CRC.strToHex(str)), isReverse);
  264. };
  265. CRC.strToByte = function (str) {
  266. var tmp = str.split(''), arr = [];
  267. for (var i = 0, c = tmp.length; i < c; i++) {
  268. var j = encodeURI(tmp[i]);
  269. if (j.length == 1) {
  270. arr.push(j.charCodeAt());
  271. } else {
  272. var b = j.split('%');
  273. for (var m = 1; m < b.length; m++) {
  274. arr.push(parseInt('0x' + b[m]));
  275. }
  276. }
  277. }
  278. return arr;
  279. };
  280. CRC.convertChinese = function (str) {
  281. var tmp = str.split(''), arr = [];
  282. for (var i = 0, c = tmp.length; i < c; i++) {
  283. var s = tmp[i].charCodeAt();
  284. if (s <= 0 || s >= 127) {
  285. arr.push(s.toString(16));
  286. }
  287. else {
  288. arr.push(tmp[i]);
  289. }
  290. }
  291. return arr;
  292. };
  293. CRC.filterChinese = function (str) {
  294. var tmp = str.split(''), arr = [];
  295. for (var i = 0, c = tmp.length; i < c; i++) {
  296. var s = tmp[i].charCodeAt();
  297. if (s > 0 && s < 127) {
  298. arr.push(tmp[i]);
  299. }
  300. }
  301. return arr;
  302. };
  303. CRC.strToHex = function (hex, isFilterChinese) {
  304. hex = isFilterChinese ? CRC.filterChinese(hex).join('') : CRC.convertChinese(hex).join('');
  305. //清除所有空格
  306. hex = hex.replace(/\s/g, "");
  307. //若字符个数为奇数,补一个0
  308. hex += hex.length % 2 != 0 ? "0" : "";
  309. var c = hex.length / 2, arr = [];
  310. for (var i = 0; i < c; i++) {
  311. arr.push(parseInt(hex.substr(i * 2, 2), 16));
  312. }
  313. return arr;
  314. };
  315. CRC.padLeft = function (s, w, pc) {
  316. if (pc == undefined) {
  317. pc = '0';
  318. }
  319. for (var i = 0, c = w - s.length; i < c; i++) {
  320. s = pc + s;
  321. }
  322. return s;
  323. };
  324. CRC.toString = function (arr, isReverse) {
  325. if (typeof isReverse == 'undefined') {
  326. isReverse = true;
  327. }
  328. var hi = arr[0], lo = arr[1];
  329. return CRC.padLeft((isReverse ? hi + lo * 0x100 : hi * 0x100 + lo).toString(16).toUpperCase(), 4, '0');
  330. };