hex.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. // ArrayBuffer转16进度字符串示例
  2. import {formatZero, isObject, sliceChunk} from "@/utils/util";
  3. export const ab2hex = (buffer, join = '') => {
  4. const hexArr = Array.prototype.map.call(
  5. new Uint8Array(buffer),
  6. function (bit) {
  7. return ('00' + bit.toString(16)).slice(-2).toUpperCase()
  8. }
  9. )
  10. return hexArr.join(join)
  11. }
  12. export const orderToStr = (head, payload = []) => {
  13. payload = payload.join('')
  14. let l = formatZero(((payload.length / 2).toString(16)).toUpperCase(), 2)
  15. return `${head}${l}${payload}`
  16. }
  17. /**
  18. * 获取命令码
  19. * @param str
  20. * @param sNum
  21. * @param eNum
  22. * @returns {*}
  23. */
  24. export const getOrderCode = (str, sNum = 2, eNum = 4) => {
  25. return str.slice(2, 4)
  26. }
  27. /**
  28. * 分割指令
  29. * @param str 指令
  30. * @param endNum 校验位开始位置
  31. * @returns {{data: *[], hex: (*|string)}}
  32. */
  33. export const stringToSplit = (str, endNum) => {
  34. let data = [];
  35. let hex = ''
  36. hex = str.slice(-4) // 校验码
  37. if (endNum) str = str.slice(0, -endNum)
  38. let num = 0
  39. for (let i = 0; i < (str.length / 2); i++) {
  40. let item = str.slice(num, num + 2);
  41. data.push(item)
  42. num += 2
  43. }
  44. return {data, hex}
  45. }
  46. // 16进制转buffer
  47. export const stringToArrayBuffer = (str, type = 1) => {
  48. if (!str) {
  49. return new ArrayBuffer(0);
  50. }
  51. let result = null
  52. switch (type) {
  53. case 2:
  54. result = new ArrayBuffer(str.length * 2);
  55. const view = new Uint8Array(result);
  56. for (let i = 0; i < str.length; i++) {
  57. view[i] = str.charCodeAt(i);
  58. }
  59. break
  60. case 3:
  61. result = new Uint8Array(str).buffer
  62. break
  63. default:
  64. result = new ArrayBuffer(str.length / 2);
  65. let dataView = new DataView(result)
  66. let ind = 0;
  67. for (let i = 0, len = str.length; i < len; i += 2) {
  68. let code = parseInt(str.substr(i, 2), 16)
  69. dataView.setUint8(ind, code)
  70. ind++
  71. }
  72. break
  73. }
  74. return result;
  75. }
  76. /**
  77. * 命令转成数组
  78. * @param str
  79. * @param arr(number) 按指定长度切割 转换16进
  80. * @param arr(array) 按指定长度切割 不转换16进制[ type: 1 不转换10进制; long:长度 ]
  81. * @param arr(array) 按指定长度切割 转换为2进制[ type: 2 转为2进制; long:长度 , places:补0长度 ]
  82. * @param arr(array) 字串从指定位数开始按指定长度分割成数组,不转换进制[ type: 3 按指定长分割 long:长度 ]
  83. * @returns {*[]}
  84. */
  85. export const orderToData = (str, arr, mode = 1) => {
  86. let data = {};
  87. let num = 0;
  88. for (let i = 0; i < arr.length; i++) {
  89. let itemArr = arr[i]
  90. if (typeof itemArr == 'number') {
  91. itemArr = {l: itemArr}
  92. }
  93. let itOp = {
  94. k: itemArr.k || i,
  95. t: itemArr.t || 0,
  96. l: itemArr.l || 2,
  97. c: itemArr.c || [],
  98. d: itemArr.d || ''
  99. }
  100. let item = '';
  101. let save = !0
  102. switch (itOp.t) {
  103. case 1:
  104. item = str.slice(num, num + itOp.l);
  105. if (itOp.c && isObject(itOp.c)) {
  106. if (itOp.c.s) {
  107. data[itOp.c.k] = item.slice(...itOp.c.s)
  108. if ((data[itOp.c.k] == '' || data[itOp.c.k] == null) && itOp.c.d) data[itOp.c.k] = itOp.c.d || ''
  109. }
  110. }
  111. break;
  112. case 2:
  113. save = !1
  114. let itemStr = str.slice(num, num + itOp.l);
  115. if (itOp.c) {
  116. itemStr = formatZero(parseInt(itemStr, 16).toString(2), 8)
  117. itOp.c.forEach((it) => {
  118. data[it.k] = parseInt(itemStr.slice(...it.s), 2)
  119. })
  120. }
  121. break;
  122. case 3:
  123. let content = str.slice(num)
  124. item = sliceChunk(content, itOp.l)
  125. itOp.l = content.length
  126. break;
  127. default:
  128. item = str.slice(num, num + itOp.l);
  129. item = hexToDataHandle(item, mode, itOp.d)
  130. break;
  131. }
  132. if (save) data[itOp.k] = item
  133. num += itOp.l
  134. }
  135. return data
  136. }
  137. /**
  138. * 数据转成16进(低位)
  139. * @param str
  140. * @param len
  141. * @returns {string}
  142. */
  143. export const dataToHexHandle = (str, len = 2) => {
  144. str = formatZero(str.toString(16), len)
  145. let result = [];
  146. for (let i = 0; i < str.length;) {
  147. result.push(str.slice(i, i + 2))
  148. i += 2
  149. }
  150. return result.reverse().join('')
  151. }
  152. /**
  153. * 16进(低位)转成10进数据
  154. * @param str
  155. * @returns {string}
  156. */
  157. export const hexToDataHandle = (str, type = 1, def = '') => {
  158. let result = [];
  159. let strLength = str.length
  160. if (strLength > 2) {
  161. for (let i = 0; i < strLength;) {
  162. result.push(str.slice(i, i + 2))
  163. i += 2
  164. }
  165. } else {
  166. result.push(str)
  167. }
  168. if (type == 1) {
  169. result = result.reverse()
  170. }
  171. let a = parseInt(result.join(''), 16)
  172. return !isNaN(a) ? a : def;
  173. }