You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. "use strict";
  2. import { findVarint } from './protoBuffer.js';
  3. var iPackageLen, _kcUtils = require("./kcUtils.js"), _kcUtils2 = _interopRequireDefault(_kcUtils);
  4. function _interopRequireDefault(t) {
  5. return t && t.__esModule ? t : {
  6. default: t
  7. }
  8. }
  9. var bleCount, rxCount = 0, strTemData = "", strRxBuffer = "", isPagFinish = true;
  10. function decode_GB(t) {
  11. var e = 0
  12. , a = {}
  13. , t = _kcUtils2.default.byteArray2hexStr(t)
  14. , r = (_kcUtils2.default.showLog("kc当前接受包的数据:", t),
  15. _kcUtils2.default.hexStr2byteArray(t));
  16. if (1 < r.byteLength && 80 == r[0] && 1 == isPagFinish ? (isPagFinish = !1,
  17. iPackageLen = r[3],
  18. strTemData = t) : strTemData += t,
  19. strTemData.length / 2 >= iPackageLen + 5) {
  20. rxCount += 1,
  21. isPagFinish = !0;
  22. var s = _kcUtils2.default.hexStr2byteArray(strTemData);
  23. _kcUtils2.default.showLog("接受完第", rxCount, "包数据,内容 ", strTemData);
  24. for (var i = 0; i < iPackageLen + 4; i++)
  25. e ^= s[i];
  26. if (s[strTemData.length / 2 - 1] != e)
  27. return _kcUtils2.default.showError("kc第", rxCount, " 包校验bcc:Error!"),
  28. a.serviceCode = -1,
  29. a.serviceInfo = "校验错误。。。",
  30. a;
  31. 128 == (128 & s[1]) && (bleCount = ((127 & s[1]) << 8) + s[2],
  32. _kcUtils2.default.showLog("总共:", bleCount, "大包")),
  33. _kcUtils2.default.showLog("kc第", rxCount, " 包校验bcc:ok!"),
  34. strRxBuffer += strTemData.substring(8, strTemData.length - 2)
  35. }
  36. return bleCount <= rxCount ? (a.serviceCode = 0,
  37. a.serviceInfo = "数据接收完成!",
  38. a.serviceData = {},
  39. a.serviceData.strData = strRxBuffer) : (a.serviceCode = 1,
  40. a.serviceInfo = "数据接收中。。。"),
  41. a
  42. }
  43. function decode_WX(inputData) {
  44. // 初始化变量
  45. var checksum = 0; // 校验变量
  46. var result = {}; // 返回的结果对象
  47. var hexString = _kcUtils2.default.byteArray2hexStr(inputData); // 将输入数据转换为16进制字符串
  48. var byteArray = _kcUtils2.default.hexStr2byteArray(hexString); // 转换为字节数组
  49. // 打印接收到的数据
  50. _kcUtils2.default.showLog("kc当前接受包的数据:", hexString);
  51. // 判断是否是大包开始
  52. if (
  53. byteArray.byteLength > 1 &&
  54. byteArray[0] === 254 && // 包头标识
  55. byteArray[1] === 1 && // 版本号
  56. isPagFinish === true // 是否为分页结束
  57. ) {
  58. isPagFinish = false; // 标记分页未完成
  59. iPackageLen = ((255 & byteArray[2]) << 8) + (255 & byteArray[3]); // 计算大包总长度
  60. strTemData = hexString; // 保存当前数据
  61. } else {
  62. // 如果是数据的续传部分
  63. strTemData += hexString; // 累加数据
  64. }
  65. // 如果接收的数据长度已达到或超过大包长度
  66. if (strTemData.length / 2 >= iPackageLen) {
  67. console.log("大包长度:", iPackageLen, strTemData.length);
  68. isPagFinish = true; // 标记分页完成
  69. rxCount += 1; // 接收到的包计数+1
  70. // 解析接收到的完整数据
  71. const completeData = _kcUtils2.default.hexStr2byteArray(strTemData);
  72. // 初始化解析对象
  73. let parsedData = {};
  74. let index = 0;
  75. // 解析固定头部
  76. const headFields = [
  77. // 魔数
  78. { key: "MagicNumber", size: 1 },
  79. // 版本号
  80. { key: "Ver", size: 1 },
  81. // 长度
  82. { key: "Len", size: 2 },
  83. // 命令ID
  84. { key: "CmdId", size: 2 },
  85. // 序列号
  86. { key: "Seq", size: 2 }
  87. ];
  88. // 解析固定头部
  89. parsedData.FixHead = {};
  90. headFields.forEach(field => {
  91. if (field.size === 1) {
  92. parsedData.FixHead[field.key] = completeData[index];
  93. index += 1;
  94. } else {
  95. parsedData.FixHead[field.key] = (completeData[index] << 8) + completeData[index + 1];
  96. index += 2;
  97. }
  98. });
  99. // 解析 ProtoBuf 数据
  100. parsedData.ProtoBuf = {};
  101. parsedData.ProtoBuf.BaseRequest = {};
  102. parsedData.ProtoBuf.BaseRequest.Mark = strTemData.substr(2 * index, 2); // BaseRequest标记
  103. index++;
  104. // 解码 BaseRequest 数据长度
  105. var length = 0, shift = 0;
  106. while ((128 & completeData[index]) === 128) {
  107. length += (127 & completeData[index]) << (7 * shift);
  108. index++;
  109. shift++;
  110. }
  111. length += (127 & completeData[index]) << (7 * shift);
  112. index++;
  113. // 提取 BaseRequest 数据
  114. parsedData.ProtoBuf.BaseRequest.Data = strTemData.substr(2 * index, 2 * length);
  115. index += length;
  116. // 解析 Data 部分
  117. parsedData.ProtoBuf.Data = {};
  118. parsedData.ProtoBuf.Data.Mark = strTemData.substr(2 * index, 2); // Data标记
  119. index++;
  120. // 解码 Data 数据长度
  121. length = 0;
  122. shift = 0;
  123. const veLength = findVarint(completeData.slice(index, completeData.length));
  124. let tempLength = decodeVarint(veLength.varint);
  125. console.log("解码 Data 前:", completeData[index]);
  126. console.log("解码 Data index 前:", index);
  127. // 检查 length 是否超出范围
  128. if (index + tempLength > completeData.length) {
  129. veLength.endPos -= 1;
  130. veLength.varint = veLength.varint.slice(0, veLength.endPos);
  131. let tempVarint = encodeVarint(veLength.varint);
  132. length = decodeVarint(tempVarint);
  133. index += veLength.endPos;
  134. } else {
  135. while ((128 & completeData[index]) === 128) {
  136. length += (127 & completeData[index]) << (7 * shift);
  137. index++;
  138. shift++;
  139. }
  140. length += (127 & completeData[index]) << (7 * shift);
  141. index++;
  142. }
  143. console.log("解码 Data 后:", completeData[index]);
  144. console.log("解码 Data index 后:", index);
  145. // 提取 Data 数据
  146. parsedData.ProtoBuf.Data.Data = strTemData.substr(2 * index, 2 * length);
  147. index += length;
  148. // 解析 DataType 部分
  149. parsedData.ProtoBuf.DataType = {};
  150. parsedData.ProtoBuf.DataType.Mark = strTemData.substr(2 * index, 2); // DataType标记
  151. index++;
  152. // 解码 DataType 数据长度
  153. length = 0;
  154. shift = 0;
  155. while ((128 & completeData[index]) === 128) {
  156. length += (127 & completeData[index]) << (7 * shift);
  157. index++;
  158. shift++;
  159. }
  160. length += (127 & completeData[index]) << (7 * shift);
  161. index++;
  162. // 提取 Varint 数据
  163. parsedData.ProtoBuf.DataType.Varint = length;
  164. // 校验数据完整性
  165. var dataContent = _kcUtils2.default.hexStr2byteArray(parsedData.ProtoBuf.Data.Data);
  166. for (var i = 1; i < dataContent.byteLength - 1; i++) {
  167. checksum ^= dataContent[i]; // 计算校验和
  168. }
  169. if (dataContent[dataContent.byteLength - 1] !== checksum) {
  170. // 如果校验失败
  171. _kcUtils2.default.showError("kc第", rxCount, " 包校验bcc:Error!");
  172. result.serviceCode = -1;
  173. result.serviceInfo = "bcc 校验错误。。。";
  174. return result;
  175. }
  176. // 如果校验成功,解析大包信息
  177. if ((128 & dataContent[2]) === 128) {
  178. bleCount = 1 + (127 & dataContent[2]); // 总包数
  179. _kcUtils2.default.showLog("总共:", bleCount, "大包");
  180. }
  181. // 累加接收到的有效数据
  182. strRxBuffer += parsedData.ProtoBuf.Data.Data.substr(8, 2 * dataContent[3]);
  183. console.log("kc第", rxCount, " 包校验bcc:ok!");
  184. _kcUtils2.default.showLog("接受完第", rxCount, "大包数据,内容 ", strTemData);
  185. }
  186. // 判断是否所有包接收完成
  187. if (bleCount <= rxCount) {
  188. result.serviceCode = 0; // 数据接收完成
  189. result.serviceInfo = "数据接收完成!";
  190. result.serviceData = { strData: strRxBuffer }; // 返回接收的数据
  191. } else {
  192. result.serviceCode = 1; // 数据接收中
  193. result.serviceInfo = "数据接收中。。。";
  194. }
  195. return result;
  196. }
  197. function init() {
  198. rxCount = iPackageLen = 0,
  199. isPagFinish = !(strRxBuffer = strTemData = "")
  200. }
  201. /**
  202. * 对单个数值进行 Varint 编码
  203. * @param {number} val - 要编码的值
  204. * @returns {number[]} - 编码后的字节数组
  205. */
  206. function encodeSingleValue(val) {
  207. const bytes = [];
  208. while (val >= 0x80) {
  209. // 提取低 7 位,加上最高位 1
  210. bytes.push((val & 0x7F) | 0x80);
  211. val >>= 7; // 右移 7 位
  212. }
  213. // 添加最后一个字节,最高位为 0
  214. bytes.push(val & 0x7F);
  215. return bytes;
  216. }
  217. /**
  218. * 对单个值或 Uint8Array 进行 Varint 编码
  219. * @param {number|Uint8Array} value - 要编码的值,可以是单个数值或 Uint8Array
  220. * @returns {Uint8Array} - 编码后的字节流
  221. */
  222. function encodeVarint(value) {
  223. // 如果是 Uint8Array 类型
  224. if (value instanceof Uint8Array) {
  225. const result = [];
  226. for (const v of value) {
  227. result.push(...encodeSingleValue(v)); // 对每个字节进行编码
  228. }
  229. return new Uint8Array(result); // 返回 Uint8Array 类型的结果
  230. }
  231. // 如果是单个值,直接编码
  232. if (typeof value === 'number') {
  233. return new Uint8Array(encodeSingleValue(value));
  234. }
  235. // 其他类型不支持,抛出错误
  236. throw new TypeError("Input must be a number or a Uint8Array.");
  237. }
  238. function encodeVarint1(value) {
  239. const bytes = [];
  240. while (value >= 0x80) {
  241. // 提取低 7 位,加上最高位 1
  242. bytes.push((value & 0x7F) | 0x80);
  243. value >>= 7; // 右移 7 位
  244. }
  245. // 添加最后一个字节,最高位为 0
  246. bytes.push(value & 0x7F);
  247. return bytes;
  248. }
  249. function decodeVarint(bytes) {
  250. let result = 0;
  251. let shift = 0;
  252. for (let i = 0; i < bytes.length; i++) {
  253. const byte = bytes[i];
  254. // 提取低 7 位并合成结果
  255. result |= (byte & 0x7F) << shift;
  256. // 如果最高位是 0,结束解码
  257. if ((byte & 0x80) === 0) {
  258. break;
  259. }
  260. shift += 7;
  261. }
  262. return result;
  263. }
  264. module.exports = {
  265. decode_GB: decode_GB,
  266. decode_WX: decode_WX,
  267. init: init
  268. };