strUtils.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. /**
  2. * ArrayBuffer转16进制字符串
  3. */
  4. function arrayBuffer2HexString(buf) {
  5. var out = "";
  6. var u8a = new Uint8Array(buf);
  7. var single;
  8. for (
  9. var i = 0; i < u8a.length; i++) {
  10. single = u8a[i].toString(16)
  11. while (single.length < 2) single = "0".concat(single);
  12. out += single;
  13. }
  14. return out;
  15. }
  16. /**
  17. * 1、字符串转换为十六进制
  18. * 主要使用 charCodeAt()方法,此方法返回一个字符的 Unicode 值,该字符位于指定索引位置。
  19. */
  20. function stringToHex(str) {
  21. var val =
  22. "";
  23. for (
  24. var i =
  25. 0; i < str.length; i++) {
  26. val += str.charCodeAt(i).toString(
  27. 16);
  28. }
  29. return val;
  30. }
  31. function filterChinese(str) {
  32. var tmp = str.split(
  33. ''),
  34. arr = [];
  35. for (
  36. var i =
  37. 0, c = tmp.length; i < c; i++) {
  38. var s = tmp[i].charCodeAt();
  39. if (s >
  40. 0 && s <
  41. 127) {
  42. arr.push(tmp[i]);
  43. }
  44. }
  45. return arr;
  46. };
  47. // function strToHex(hex, isFilterChinese) {
  48. // hex = isFilterChinese ? filterChinese(hex).join(
  49. // '') : convertChinese(hex).join(
  50. // '');
  51. // //清除所有空格
  52. // hex = hex.replace(/\s/g,
  53. // "");
  54. // //若字符个数为奇数,补一个空格
  55. // hex += hex.length % 2 != 0 ? " " : "";
  56. // var c = hex.length / 2,
  57. // arr = [];
  58. // for (
  59. // var i = 0; i < c; i++) {
  60. // arr.push(parseInt(hex.substr(i * 2, 2), 16));
  61. // }
  62. // return arr;
  63. // };
  64. /**
  65. * 16进制字符串转ArrayBuffer
  66. */
  67. function hexString2ArrayBuffer(hexStr) {
  68. var count = hexStr.length / 2;
  69. let buffer = new ArrayBuffer(count);
  70. let dataView = new DataView(buffer);
  71. for (
  72. var i = 0; i < count; i++) {
  73. var curCharCode = parseInt(hexStr.substr(i * 2, 2), 16);
  74. dataView.setUint8(i, curCharCode);
  75. }
  76. return buffer;
  77. }
  78. /**
  79. * 字符串转为ArrayBuffer对象,参数为字符串
  80. */
  81. function string2ArrayBuffer(str) {
  82. var buf = new ArrayBuffer(str.length * 2);
  83. // 每个字符占用2个字节
  84. var bufView = new Uint8Array(buf);
  85. for (var i = 0, strLen = str.length; i < strLen; i++) {
  86. bufView[i] = str.charCodeAt(i);
  87. }
  88. return buf;
  89. }
  90. function isArray(arr) {
  91. return Object.prototype.toString.call(arr) === '[object Array]';
  92. };
  93. function strToByte(str) {
  94. var tmp = str.split(''),
  95. arr = [];
  96. for (var i = 0, c = tmp.length; i < c; i++) {
  97. var j = encodeURI(tmp[i]);
  98. if (j.length == 1) {
  99. arr.push(j.charCodeAt());
  100. } else {
  101. var b = j.split('%');
  102. for (var m = 1; m < b.length; m++) {
  103. arr.push(parseInt('0x' + b[m]));
  104. }
  105. }
  106. }
  107. return arr;
  108. };
  109. function convertChinese(str) {
  110. var tmp = str.split(''),
  111. arr = [];
  112. for (var i = 0, c = tmp.length; i < c; i++) {
  113. var s = tmp[i].charCodeAt();
  114. if (s <= 0 || s >= 127) {
  115. arr.push(s.toString(16));
  116. } else {
  117. arr.push(tmp[i]);
  118. }
  119. }
  120. return arr;
  121. };
  122. // function filterChinese(str) {
  123. // var tmp = str.split(''),
  124. // arr = [];
  125. // for (
  126. // var i = 0, c = tmp.length; i < c; i++) {
  127. // var s = tmp[i].charCodeAt();
  128. // if (s > 0 && s < 127) {
  129. // arr.push(tmp[i]);
  130. // }
  131. // }
  132. // return arr;
  133. // };
  134. // function strToHex(hex, isFilterChinese) {
  135. // hex = isFilterChinese ? filterChinese(hex).join('') : convertChinese(hex).join('');
  136. // //清除所有空格
  137. // hex = hex.replace(/\s/g, "");
  138. // //若字符个数为奇数,补一个空格
  139. // hex += hex.length % 2 != 0 ? " " : "";
  140. // var c = hex.length / 2,
  141. // arr = [];
  142. // for (var i = 0; i < c; i++) {
  143. // arr.push(parseInt(hex.substr(i * 2, 2), 16));
  144. // }
  145. // return arr;
  146. // };
  147. function padLeft(s, w, pc) {
  148. if (pc == undefined) {
  149. pc = '0';
  150. }
  151. for (
  152. var i = 0, c = w - s.length; i < c; i++) {
  153. s = pc + s;
  154. }
  155. return s;
  156. };
  157. function toString(arr, isReverse) {
  158. if (typeof isReverse == 'undefined') {
  159. isReverse = true;
  160. }
  161. var hi = arr[0],
  162. lo = arr[1];
  163. return padLeft((isReverse ? hi + lo * 0x100 : hi * 0x100 + lo).toString(16).toUpperCase(), 4, '0');
  164. };
  165. /**
  166. * 16进制字符串异或处理
  167. *
  168. * @param str1
  169. * @param str2
  170. * @return
  171. */
  172. function stringXor(str1, str2) {
  173. if (!str1 && !str2) {
  174. return "";
  175. }
  176. if (!str1 && str2) {
  177. return str2;
  178. }
  179. if (str1 && !str2) {
  180. return str1;
  181. }
  182. var longStr;
  183. var shortStr;
  184. if (str1.length >= str2.length) {
  185. longStr = str1;
  186. shortStr = str2;
  187. } else {
  188. longStr = str2;
  189. shortStr = str1;
  190. }
  191. var count = parseInt(shortStr.length /
  192. 2);
  193. var leftCount = longStr.length - shortStr.length;
  194. var resultStr = "";
  195. if (leftCount > 0) {
  196. resultStr += longStr.substr(0, leftCount);
  197. }
  198. for (
  199. var i = 0; i < count; i++) {
  200. var shortCharCode = parseInt(shortStr.substr(i * 2, 2), 16);
  201. var longCharCode = parseInt(longStr.substr(leftCount + i * 2, 2), 16);
  202. var resultCode = shortCharCode ^ longCharCode;
  203. var single = resultCode.toString(
  204. 16);
  205. while (single.length <
  206. 2) single =
  207. "0".concat(single);
  208. resultStr += single;
  209. }
  210. return resultStr.toUpperCase();
  211. }
  212. /**
  213. * 指令两个16进制字符串异或处理
  214. *
  215. * @param command
  216. * @param secretKey
  217. * @return
  218. */
  219. function getSecretEncoding(command, secretKey) {
  220. if (!command || !secretKey) {
  221. return "";
  222. }
  223. var secretLength = secretKey.length;
  224. var length = parseInt(command.length / secretLength);
  225. console.log(`command(${command.length })/secretLength(${secretLength }) = ${length }`);
  226. var resultCmd = "";
  227. console.log(`secretKey(${secretKey.length }):${secretKey }`);
  228. for (
  229. var i = 0; i < length; i++) {
  230. var part = command.substr(i * secretLength, secretLength);
  231. resultCmd += stringXor(part, secretKey);
  232. console.log(`part${i }:${stringXor(part, secretKey) }`);
  233. }
  234. var lastLen = command.length % secretLength;
  235. if (lastLen > 0) {
  236. console.log(`lastCMD:${command.substr(command.length - lastLen, lastLen) }`);
  237. console.log(`lastSecretKey:${secretKey.substr( 0, lastLen) }`);
  238. var lastPart = command.substr(command.length - lastLen, lastLen);
  239. var lastCmd = stringXor(lastPart, secretKey.substr(0, lastLen));
  240. resultCmd += lastCmd;
  241. console.log(`lastPart:${lastCmd }`);
  242. }
  243. return resultCmd;
  244. }
  245. /**
  246. * 2、十六进制转换为字符串
  247. *主要使用 fromCharCode()方法,此方法将 Unicode 码转换为与之对应的字符。
  248. */
  249. function hexToString(str) {
  250. var val = "";
  251. var arr = str.split(",");
  252. for (var i = 0; i < arr.length; i++) {
  253. val += arr[i].fromCharCode(i);
  254. }
  255. return val;
  256. }
  257. /**
  258. * 获取随机长度16进制字符串
  259. */
  260. function getRamNumber(length) {
  261. var result = '';
  262. for (
  263. var i = 0; i < length; i++) {
  264. result += Math.floor(Math.random() * 16).toString(16);
  265. //获取0-15并通过toString转16进制
  266. }
  267. //默认字母小写,手动转大写
  268. return result.toUpperCase();
  269. //另toLowerCase()转小写
  270. }
  271. /**
  272. * 得到BCD码时间字符串
  273. *
  274. * @param datetime
  275. * @return
  276. */
  277. function getBCDTime(datetime, needWeek) {
  278. if (typeof datetime == 'undefined') {
  279. datetime = new Date();
  280. }
  281. if (typeof needWeek == 'undefined') {
  282. needWeek = true;
  283. }
  284. var year = datetime.getFullYear() - 2000;
  285. //获取年份,从2000年开始计算
  286. if (year < 0) year = 0;
  287. // 不允许小于2000年的年份出现
  288. var month = datetime.getMonth() + 1;
  289. //获取月份 0-11 所以需要加1
  290. var day = datetime.getDate();
  291. //获取日
  292. var hour = datetime.getHours();
  293. //小时
  294. var minute = datetime.getMinutes();
  295. //分
  296. var second = datetime.getSeconds();
  297. //秒
  298. if (needWeek) {
  299. var dayOfWeek = datetime.getDay();
  300. //一周的第几天 0-6
  301. return formatNumber(year) + formatNumber(month) + formatNumber(day) + formatNumber(dayOfWeek)
  302. +
  303. formatNumber(hour) + formatNumber(minute) + formatNumber(second);
  304. // 得到BCD码的时间字符串
  305. } else {
  306. return formatNumber(year) + formatNumber(month) + formatNumber(day)
  307. +
  308. formatNumber(hour) + formatNumber(minute) + formatNumber(second);
  309. // 得到BCD码的时间字符串
  310. }
  311. }
  312. function formatNumber(n) {
  313. n = n.toString()
  314. return (n[1] ? n : '0' + n) + "";
  315. }
  316. /**
  317. * 判断一个字符串是否包含子串
  318. */
  319. function isContains(str, substr) {
  320. var strUp = str.toUpperCase();
  321. var substrUp = substr.toUpperCase()
  322. return
  323. new RegExp(substrUp).test(strUp);
  324. }
  325. /**
  326. * 去除字符串中特定的字符
  327. */
  328. function removeBytes(str, substr) {
  329. var items = str.split(substr)
  330. // 会得到一个数组,数组中包括利用o分割后的多个字符串(不包括o)
  331. var newStr = items.join("");
  332. return newStr
  333. // }
  334. }
  335. module.exports = {
  336. hexString2ArrayBuffer: hexString2ArrayBuffer,
  337. arrayBuffer2HexString: arrayBuffer2HexString,
  338. // getCRCCmd: getCRCCmd,
  339. getBCDTime: getBCDTime,
  340. stringToHex: stringToHex,
  341. stringXor: stringXor,
  342. getSecretEncoding: getSecretEncoding,
  343. hexToString: hexToString,
  344. getRamNumber: getRamNumber,
  345. isContains: isContains,
  346. removeBytes: removeBytes
  347. }