hex.js 5.1 KB

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