hex.js 5.2 KB

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