From e491cdb48129752324c4e3764f99bd9203c56dec Mon Sep 17 00:00:00 2001
From: lgq <1015864684@qq.com>
Date: 星期二, 31 三月 2026 09:48:44 +0800
Subject: [PATCH] 1.新增VF205门禁机代码
---
vf205_access/dxmodules/dxCommon.js | 733 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 733 insertions(+), 0 deletions(-)
diff --git a/vf205_access/dxmodules/dxCommon.js b/vf205_access/dxmodules/dxCommon.js
new file mode 100644
index 0000000..f8f645a
--- /dev/null
+++ b/vf205_access/dxmodules/dxCommon.js
@@ -0,0 +1,733 @@
+//build: 20240617
+// 绯荤粺鐨勪竴浜涘熀鏈搷浣溿�佽繕鏈変竴浜涘父鐢ㄧ殑宸ュ叿鍑芥暟锛屽熀鏈笂姣忎釜椤圭洰閮介渶瑕佷緷璧栬繖涓粍浠讹紝鍙﹀dxLogger涔熶緷璧栬繖涓粍浠�
+// 渚濊禆缁勪欢锛歞xDriver锛宒xMap
+import { commonClass } from './libvbar-m-dxcommon.so'
+import dxMap from './dxMap.js'
+import * as std from 'std';
+import * as os from "os"
+
+const commonObj = new commonClass();
+
+const common = {}
+/**
+ * 鑾峰彇绯荤粺鍚姩鐨勮繍琛屾椂闂�(鍗曚綅鏄)
+ * @returns
+ */
+common.getUptime = function () {
+ return commonObj.getUptime();
+}
+
+/**
+ * 鑾峰彇绯荤粺鐨勬�诲唴瀛�(鍗曚綅鏄瓧鑺�)
+ * @returns
+ */
+common.getTotalmem = function () {
+ return commonObj.getTotalmem();
+}
+
+/**
+ * 鑾峰彇绯荤粺鍓╀綑鍐呭瓨(鍗曚綅鏄瓧鑺�)
+ * @returns
+ */
+common.getFreemem = function () {
+ return commonObj.getFreemem();
+}
+
+/**
+ * Deprcated, Please use `common.logMemory` instead.
+ */
+common.logMem = function (logger, interval = 10) {
+ if (logger) {
+ logger.debug("Deprcated, Please use `common.logMemory` instead.")
+ }
+}
+/**
+ * Logs the current memory usage at regular intervals for debugging and monitoring purposes.
+ * @param {object} logger The dxLogger module object.
+ * @param {number} interval The logging interval in seconds, defaulting to 10 seconds.
+ */
+common.logMemory = function (logger, interval = 10) {
+ if (!logger) return;
+
+ let first = new Date().getTime();
+ let min = common.getFreemem() / 1024;
+ let max = min;
+ const _logmemory = () => {
+ try {
+ const now = new Date().getTime();
+ const pass = (now - first) / 1000;
+ const free = common.getFreemem() / 1024;
+
+ min = Math.min(min, free);
+ max = Math.max(max, free);
+
+ // Format time
+ let passStr;
+ if (pass > 1700000000) {
+ first = now;
+ passStr = 'time synced, 0s';
+ } else if (pass >= 3600) {
+ const hours = Math.floor(pass / 3600);
+ const minutes = Math.floor((pass % 3600) / 60);
+ const seconds = Math.floor(pass % 60);
+ passStr = `${hours}h ${minutes}m ${seconds}s`;
+ } else if (pass >= 60) {
+ const minutes = Math.floor(pass / 60);
+ const seconds = Math.floor(pass % 60);
+ passStr = `${minutes}m ${seconds}s`;
+ } else {
+ passStr = `${Math.floor(pass)}s`;
+ }
+ const log = `------ ${passStr} passed, free memory (k): ${free}, min free memory (k): ${min}, max free memory (k): ${max} ------`;
+ logger.info(log);
+ } catch (err) {
+ logger.error('Error in logMemory:', err);
+ } finally {
+ os.setTimeout(_logmemory, interval * 1000);
+ }
+ };
+
+ os.setTimeout(_logmemory, interval * 1000);
+};
+
+/**
+ * The principle of converting asynchronous to synchronous is as follows:
+ * the `request` function periodically checks a designated variable in memory for a value.
+ * If the value is found within the timeout period, the result is returned; otherwise,
+ * it is considered a timeout. The `response` function is responsible for storing the result
+ * in the designated variable once the asynchronous request is completed.
+ */
+common.sync = {
+ /**
+ * Block and wait for data
+ * Usage:
+ common.sync.request(topic, 200)
+ .then((data) => {
+ log.info("Received data:", data);
+ })
+ .catch((err) => {
+ log.error("Request failed:", err.message);
+ });
+ * @param {string} topic The unique identifier for each request
+ * @param {int} timeout waitting timeout(microsecond)锛宒efault is 200 ms
+ * @returns
+ */
+ request: function (topic, timeout = 200) {
+ return new Promise((resolve, reject) => {
+ let map = dxMap.get("SYNC");
+ let startTime = Date.now();
+
+ const checkData = () => {
+ let data = map.get(topic);
+ if (data) {
+ map.del(topic); //del data in map
+ resolve(data); //return data
+ } else if (Date.now() - startTime >= timeout) {
+ map.del(topic); // del data in map with timeout
+ reject(new Error(`Timeout exceeded for topic: ${topic}`));
+ } else {
+ os.setTimeout(checkData, 10); //every 10 ms to check
+ }
+ };
+
+ os.setTimeout(checkData, 10); // first check
+ });
+ },
+
+ /**
+ * notify data to requester
+ * @param {string} topic The unique identifier for each request
+ * @param {*} data
+ * @returns
+ */
+ response: function (topic, data) {
+ let map = dxMap.get("SYNC");
+ map.put(topic, data); // save data in map
+ }
+};
+
+/**
+ * 鑾峰彇绯荤粺鍙敤纾佺洏鎬婚噺(鍗曚綅鏄瓧鑺�)
+ * @param {string} path 涓嶅悓鐨勭鐩樺垎鍖哄悕绉帮紙涓嶆槸鐩綍鍚嶏級锛岄潪蹇呭~锛岀己鐪佹槸'/'
+ */
+common.getTotaldisk = function (path) {
+ return commonObj.getTotaldisk(!path ? "/" : path);
+}
+
+/**
+ * 鑾峰彇绯荤粺纾佺洏鍓╀綑鍙敤閲�(鍗曚綅鏄瓧鑺�)
+ * @param {string} path 涓嶅悓鐨勭鐩樺垎鍖哄悕绉帮紙涓嶆槸鐩綍鍚嶏級锛岄潪蹇呭~锛岀己鐪佹槸'/'
+ * @returns
+ */
+common.getFreedisk = function (path) {
+ return commonObj.getFreedisk(!path ? "/" : path);
+}
+
+/**
+ * 鑾峰彇CPU ID
+ * @param {number} len 闈炲繀濉紝缂虹渷闀垮害鏄�33浣嶉暱
+ * @returns
+ */
+common.getCpuid = function () {
+ return commonObj.getCpuid(33);
+}
+
+/**
+ * 鑾峰彇璁惧uuid锛堝瓧绗︿覆锛�
+ * @returns
+ */
+common.getUuid = function () {
+ return commonObj.getUuid(19);
+}
+
+/**
+ * 鑾峰彇璁惧鍞竴鏍囪瘑
+ * @returns
+ */
+common.getSn = function () {
+ let sn = std.loadFile('/etc/.sn')
+ if (sn) {
+ return sn
+ } else {
+ return commonObj.getUuid(19);
+ }
+}
+
+/**
+ * 鑾峰彇閫氳繃uuid璁$畻鐨刴ac鍦板潃锛岃繖涓彲浠ョ敤鏉ュ垵濮嬪寲缃戝崱鐨勬椂鍊欑敤
+ * @returns 鏍煎紡绫讳技锛歜2:a1:63:3f:99:b6
+ */
+common.getUuid2mac = function () {
+ return commonObj.getUuid2mac(19);
+}
+
+/**
+ * 鑾峰彇cpu鍗犵敤鐜囷紙涓嶅ぇ浜�100鐨勬暟瀛楋級
+ * @returns
+ */
+common.getFreecpu = function () {
+ return commonObj.getFreecpu();
+}
+
+
+/**
+ * RSA 瑙e瘑 锛堢閽ュ姞瀵嗗叕閽ヨВ瀵嗭級
+ * 姣斿鍏挜鏄�
+ * @param {ArrayBuffer} data 瑕佽В瀵嗙殑鏁版嵁锛屽繀濉�
+ * @param {string} publicKey 鍏挜锛屽繀濉�
+ * @returns
+ */
+common.arrayBufferRsaDecrypt = function (data, publicKey) {
+ if (data === undefined || data === null) {
+ throw new Error("dxCommon.arrayBufferRsaDecrypt:'data' parameter should not be null or empty")
+ }
+ if (publicKey === undefined || publicKey === null || publicKey.length < 1) {
+ throw new Error("dxCommon.arrayBufferRsaDecrypt:'publicKey' parameter should not be null or empty")
+ }
+ return commonObj.arrayBufferRsaDecrypt(data, publicKey)
+}
+
+/**
+ * @brief Stirng aes 鍔犲瘑
+ */
+common.aes128EcbEncrypt = function (input, key) {
+ return commonObj.aes128EcbEncrypt(input, key)
+}
+/**
+ * @brief Stirng aes 瑙e瘑
+ */
+common.aes128EcbDecrypt = function (input, key) {
+ return commonObj.aes128EcbDecrypt(input, key)
+}
+
+/**
+ * arraybuffer ecb 128bit Pkcs5Padding aes 鍔犲瘑
+ * @param {ArrayBuffer} input 鏄庢枃
+ * @param {ArrayBuffer} key 瀵嗛挜
+ * @returns ArrayBuffer 瀵嗘枃
+ */
+common.aes128EcbPkcs5PaddingEncode = function (input, key) {
+ return commonObj.aes128Pkcs7PaddingEncode(input, key)
+}
+
+/**
+ * arraybuffer ecb 128bit Pkcs5Padding aes 瑙e瘑
+ *
+ * @param {ArrayBuffer} input 瀵嗘枃
+ * @param {ArrayBuffer} key 瀵嗛挜
+ * @returns ArrayBuffer 鏄庢枃
+ */
+common.aesEcb128Pkcs5PaddingDecode = function (input, key) {
+ return commonObj.aes128Pkcs7PaddingDecode(input, key)
+}
+
+/**
+ * aes ECB Pkcs5Padding 128 鍔犲瘑
+ * 绀轰緥锛歝ommon.aes128EcbPkcs5PaddingEncrypt("stamp=202008鏂�&tic", "1234567890123456")
+ * 缁撴灉锛歟f7c3cff9df57b3bcb0951938c574f969e13ffdcc1eadad298ddbd1fb1a4d2f7
+ * 鍙傝�� https://www.devglan.com/online-tools/aes-encryption-decryption
+ * @param {string} input 鏄庢枃鏁版嵁
+ * @param {string} key 瀵嗛挜 16瀛楄妭瀛楃涓�
+ * @return 瀵嗘枃 16杩涘埗瀛楃涓�
+ */
+common.aes128EcbPkcs5PaddingEncrypt = function (input, key) {
+ let data = common.hexStringToArrayBuffer(common.strToUtf8Hex(input))
+ key = common.hexStringToArrayBuffer(common.strToUtf8Hex(key))
+ // 鍔犲瘑
+ let hex = common.arrayBufferToHexString(common.aes128EcbPkcs5PaddingEncode(data, key))
+ return hex
+}
+/**
+ * aes ECB Pkcs5Padding 128 瑙e瘑
+ * @param {string} input 瀵嗘枃 16杩涘埗瀛楃涓�
+ * @param {string} key 瀵嗛挜 16瀛楄妭瀛楃涓�
+ * @return 鏄庢枃
+ */
+common.aes128EcbPkcs5PaddingDecrypt = function (input, key) {
+ key = common.hexStringToArrayBuffer(common.strToUtf8Hex(key))
+ let res = common.aesEcb128Pkcs5PaddingDecode(common.hexStringToArrayBuffer(input), key)
+ return common.utf8HexToStr(common.arrayBufferToHexString(res))
+}
+
+/**
+ * 鎵ц鎿嶄綔绯荤粺鐨勫懡浠�
+ * @param {*} cmd 鍛戒护
+ * @returns
+ */
+common.system = function (cmd) {
+ return commonObj.system(cmd)
+}
+
+/**
+ * 鎵ц鎿嶄綔绯荤粺鐨勫懡浠�
+ * @param {*} cmd 鍛戒护 鎿嶄綔绯荤粺甯哥敤鎸囦护(linux缁濆ぇ閮ㄥ垎鎸囦护閮芥敮鎸�)锛屽繀濉�
+ * @returns
+ */
+common.systemBrief = function (cmd) {
+ return commonObj.systemBrief(cmd)
+}
+
+/**
+ * 鎵ц鎿嶄綔绯荤粺鐨勫懡浠ゅ苟杩斿洖缁撴灉
+ * @param {*} cmd 鍛戒护 鎿嶄綔绯荤粺甯哥敤鎸囦护(linux缁濆ぇ閮ㄥ垎鎸囦护閮芥敮鎸�)锛屽繀濉�
+ * @param {*} resLen 鎺ユ敹鏁版嵁闀垮害 鏈夋椂鍊欒繑鍥炵殑鏁版嵁寰堝ぇ锛屽彲浠ラ�氳繃杩欎釜鍊兼潵杩斿洖鍥哄畾闀垮害鐨勬暟鎹紝蹇呭~
+ * @returns
+ */
+common.systemWithRes = function (cmd, resLen) {
+ return commonObj.systemWithRes(cmd, resLen)
+}
+
+/**
+ * 鎵ц鎿嶄綔绯荤粺鐨勫懡浠ら樆濉炴墽琛�
+ * @param {*} cmd 鍛戒护 鎿嶄綔绯荤粺甯哥敤鎸囦护(linux缁濆ぇ閮ㄥ垎鎸囦护閮芥敮鎸�)锛屽繀濉�
+ * @returns
+ */
+common.systemBlocked = function (cmd) {
+ return commonObj.systemBlocked(cmd)
+}
+
+/**
+ * 寮傛寤惰繜閲嶅惎
+ * @param {*} delay_s 寤惰繜鏃堕棿
+ * @returns
+ */
+common.asyncReboot = function (delay_s) {
+ return commonObj.asyncReboot(delay_s)
+}
+
+/**
+ * bcc鏍¢獙
+ * @param {array} data eg:[49,50,51,52,53,54]瀵瑰簲鐨勫�兼槸7
+ * @returns 鏍¢獙璁$畻缁撴灉
+ */
+common.calculateBcc = function (data) {
+ return commonObj.calculateBcc(data)
+}
+
+/**
+ * crc鏍¢獙 姣斿瀛楃涓�'123456'鏍¢獙璁$畻鐨勭粨鏋滄槸鏁板瓧 158520161
+ * @param {string} content 瑕佹牎楠岀殑瀛楃涓叉暟鎹紝
+ * @returns
+ */
+common.crc32 = function (content) {
+ if (content === undefined || content === null || typeof (content) != "string" || content.length < 1) {
+ throw new Error("dxCommon.crc32:'content' paramter should not be empty")
+ }
+ return commonObj.crc32(content)
+}
+
+/**
+ * 璁$畻MD5鍝堝笇锛屾瘮濡�'123456'瀵瑰簲鐨勬暟瀛楁暟缁勬槸[49,50,51,52,53,54] 瀵瑰簲鐨刴d5鏄�'e10adc3949ba59abbe56e057f20f883e'锛�
+ * 浣嗘槸杩斿洖鐨勪笉鏄�16杩涘埗瀛楃涓诧紝鏄暟瀛楁暟缁勶紝鍙互浣跨敤arrToHex鍑芥暟杞崲
+ * @param {array} arr 鏁板瓧鏁扮粍
+ * @returns 鏁板瓧鏁扮粍
+ */
+common.md5Hash = function (arr) {
+ return commonObj.md5Hash(arr)
+}
+
+/**
+ * 鏂囦欢璁$畻MD5鍝堝笇,姣斿鏂囦欢閲岀殑鍐呭鏄�'123456'锛屽搴旂殑md5鏄�'e10adc3949ba59abbe56e057f20f883e'
+ * 浣嗘槸杩斿洖鐨勪笉鏄�16杩涘埗瀛楃涓诧紝鏄暟瀛楁暟缁勶紝鍙互浣跨敤arrToHex鍑芥暟杞崲
+ * @param {string} 鏂囦欢璺緞锛岀粷瀵硅矾寰勶紝蹇呭~锛岄�氬父鏄互/app/code寮�澶�
+ * @returns 鏁板瓧鏁扮粍
+ */
+common.md5HashFile = function (filePath) {
+ if (filePath === undefined || filePath === null || typeof (filePath) != "string") {
+ return null
+ }
+ return commonObj.md5HashFile(filePath)
+}
+
+/**
+ * 璁$畻HMAC MD5鍔犲瘑,姣斿鍔犲瘑鐨勬暟鎹槸'123456',瀵嗛挜鏄�'654321'锛屽搴旂殑缁撴灉鏄�'357cbe6d81a8ec770799879dc8629a53'
+ * 浣嗘槸鍙傛暟鍜岃繑鍥炵殑鍊奸兘鏄疉rrayBuffer
+ * @param {ArrayBuffer} data 闇�瑕佸姞瀵嗙殑鍐呭,蹇呭~
+ * @param {ArrayBuffer} key 瀵嗛挜 ,蹇呭~
+ * @returns ArrayBuffer
+ */
+common.hmacMd5Hash = function (data, key) {
+ return commonObj.hmacMd5Hash(data, key)
+}
+
+/**
+ * 璁$畻HMAC MD5鍔犲瘑,姣斿鍔犲瘑鐨勬暟鎹槸'123456',瀵嗛挜鏄�'654321'锛屽搴旂殑缁撴灉鏄�'357cbe6d81a8ec770799879dc8629a53'
+ * @param {string} data 闇�瑕佸姞瀵嗙殑鍐呭,蹇呭~
+ * @param {string} key 瀵嗛挜 ,蹇呭~
+ * @returns ArrayBuffer
+ */
+common.hmac = function (data, key) {
+ return commonObj.hmac(data, key)
+}
+
+/**
+ * 鏂囦欢璁$畻HMAC MD5鍔犲瘑锛屾瘮濡傛枃浠堕噷鐨勫唴瀹规槸'123456'锛屽瘑閽ユ槸'654321'锛屽搴旂殑缁撴灉鏄�'357cbe6d81a8ec770799879dc8629a53'
+ * @param {string} filePath 闇�瑕佸姞瀵嗙殑鍐呭瀛樺偍鐨勬枃浠惰矾寰勶紝缁濆璺緞锛屽繀濉紝閫氬父鏄互/app/code寮�澶�
+ * @param {array} key 瀵嗛挜 ,鏁板瓧鏁扮粍,蹇呭~
+ * @returns 鏁板瓧鏁扮粍
+ */
+common.hmacMd5HashFile = function (filePath, key) {
+ return commonObj.hmacMd5HashFile(filePath, key)
+}
+
+
+/**
+ * base64杞琤in鏂囦欢
+ * @param {string} file_path 鏂囦欢璺緞锛屽繀濉�
+ * @param {string} base64Data base64鏁版嵁锛屽繀濉�
+ * @returns
+ */
+common.base64_2binfile = function (file_path, base64Data) {
+ return commonObj.base64_2binfile(file_path, base64Data);
+}
+
+/**
+ * bin鏂囦欢杞琤ase64
+ * @param {string} file_path 鏂囦欢璺緞锛屽繀濉�
+ * @returns base64Data base64鏁版嵁锛屽繀濉�
+ */
+common.binfile_2base64 = function (file_path) {
+ return commonObj.binfile_2base64(file_path);
+}
+
+/**
+ * 鍒囨崲璁惧妯″紡
+ * @description 妯″紡鍒囨崲鍚庝細閲嶅惎璁惧锛岃繘鍏ユ寚瀹氭ā寮忥紝浣跨敤鏂规硶鏃堕渶瀹屾暣缁存姢鐩镐簰鍒囨崲鐨勯�昏緫锛屽垏鎹负涓氬姟妯″紡鍚庝笉鑳戒娇鐢↖DE鍔熻兘
+ * @param {number} mode 娉ㄦ剰锛氭棫鐗堟湰妯″紡鍒囨崲浣跨敤锛�1銆�2銆�3锛夛紝鏂扮増鏈ā寮忓垏鎹娇鐢紙dev銆乼est銆乸rod銆乻afe锛�
+ * @returns true false
+ */
+common.setMode = function (mode) {
+ // 娉ㄦ剰锛氭棫鐗堟湰妯″紡鍒囨崲浣跨敤锛�1銆�2銆�3锛�
+ if (mode == 1) {
+ //鐢熶骇妯″紡
+ commonObj.systemWithRes(`echo 'app' > /etc/.mode`, 2)
+ // 1.0鐗堟湰鍒囨崲涓哄叾浠栨ā寮忓悗鍒犻櫎宸ュ巶妫�娴嬶紙鍚庣画鐗堟湰鍙兘浼氳皟鏁达級
+ commonObj.systemWithRes(`rm -rf /test`, 2)
+ } else if (mode == 2) {
+ //璋冭瘯妯″紡
+ commonObj.systemWithRes(`echo 'debug' > /etc/.mode`, 2)
+ // 1.0鐗堟湰鍒囨崲涓哄叾浠栨ā寮忓悗鍒犻櫎宸ュ巶妫�娴嬶紙鍚庣画鐗堟湰鍙兘浼氳皟鏁达級
+ commonObj.systemWithRes(`rm -rf /test`, 2)
+ } else if (mode == 3) {
+ //璇曚骇妯″紡
+ commonObj.systemWithRes(`echo 'pp' > /etc/.mode`, 2)
+ }
+
+ // 娉ㄦ剰锛氭柊鐗堟湰妯″紡鍒囨崲浣跨敤锛坉ev銆乼est銆乸rod銆乻afe锛�
+ else if (mode == "dev") {
+ //寮�鍙戞ā寮�
+ commonObj.systemWithRes(`echo 'dev' > /etc/.mode_v1`, 2)
+ } else if (mode == "test") {
+ //娴嬭瘯妯″紡锛堣瘯浜фā寮忥級
+ commonObj.systemWithRes(`echo 'test' > /etc/.mode_v1`, 2)
+ } else if (mode == "prod") {
+ //鐢熶骇妯″紡
+ commonObj.systemWithRes(`echo 'prod' > /etc/.mode_v1`, 2)
+ } else if (mode == "safe") {
+ //瀹夊叏妯″紡
+ commonObj.systemWithRes(`echo 'safe' > /etc/.mode_v1`, 2)
+ } else {
+ return false
+ }
+ commonObj.systemWithRes(`sync`, 2)
+ commonObj.asyncReboot(2)
+ return true
+}
+
+/**
+ * 鏌ヨ璁惧妯″紡
+ * @description 鑾峰彇璁惧褰撳墠妯″紡
+ * @returns 涓氬姟妯″紡锛�1锛屽紑鍙戞ā寮忥細2锛屽伐鍘傛ā寮忥細28锛� 寮傚父妯″紡锛�-1
+ */
+common.getMode = function () {
+ let ret = commonObj.systemWithRes(`test -e "/etc/.mode" && echo "OK" || echo "NO"`, 2)
+ if (ret.includes('NO')) {
+ return 28
+ }
+ let mode = commonObj.systemWithRes(`cat "/etc/.mode"`, 10)
+ if (mode.includes('app')) {
+ return 1
+ } else if (mode.includes('debug')) {
+ return 2
+ } else {
+ return -1
+ }
+}
+/**
+ * 鍗佸叚杩涘埗杞瓧鑺傛暟缁� eg:313233616263->[49,50,51,97,98,99]
+ * @param {string} str 16杩涘埗瀛楃涓� 灏忓啓涓斾腑闂存棤绌洪殧鐨勫崄鍏繘鍒跺瓧绗︿覆
+ * @returns 鏁板瓧鏁板瓧
+ */
+common.hexToArr = function (str) {
+ if (str === undefined || str === null || (typeof str) != 'string' || str.length < 1) {
+ throw new Error("dxCommon.hexToArr:'str' parameter should not be empty")
+ }
+ let regex = /.{2}/g;
+ let arr = str.match(regex);
+ return arr.map(item => parseInt(item, 16));
+}
+/**
+ * 瀛楄妭鏁扮粍杞崄鍏繘鍒� eg:[49,50,51,97,98,99]->313233616263
+ * @param {array}numbers 鏁板瓧鏁扮粍
+ * @returns str 16杩涘埗瀛楃涓� 灏忓啓涓斾腑闂存棤绌洪殧鐨勫崄鍏繘鍒跺瓧绗︿覆
+ */
+common.arrToHex = function (numbers) {
+ const hexArray = numbers.map(num => num.toString(16).padStart(2, '0').toLowerCase());
+ const hexString = hexArray.join('');
+ return hexString;
+}
+/**
+ * 鍗佸叚杩涘埗杞瓧绗︿覆 eg:313233616263->123abc
+ * 娉ㄦ剰濡傛灉16杩涘埗瀛楃涓叉槸鐢变腑鏂囪浆杩囧幓鐨勶紝鍐嶈浆鍥炰腑鏂囧瓧绗︿覆浼氭湁涔辩爜锛屽洜涓烘槸涓�涓竴涓瓧鑺傜殑杞崲
+ * @param {string} str 瑕佽浆鐨�16杩涘埗瀛楃涓�
+ * @returns
+ */
+common.hexToString = function (str) {
+ let regex = /.{2}/g;
+ let arr = str.match(regex);
+ arr = arr.map(item => String.fromCharCode(parseInt(item, 16)));
+ return arr.join("");
+}
+// 灏嗗瓧绗︿覆杞崲涓� UTF-8 缂栫爜鐨�16杩涘埗瀛楃涓�
+common.strToUtf8Hex = function (str) {
+ const bytes = [];
+ for (let i = 0; i < str.length; i++) {
+ let code = str.charCodeAt(i);
+ if (code < 0x80) {
+ bytes.push(code);
+ } else if (code < 0x800) {
+ bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));
+ } else if (code < 0xd800 || code >= 0xe000) {
+ bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
+ } else {
+ // 澶勭悊 Unicode 缂栫爜
+ i++;
+ code = 0x10000 + (((code & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));
+ bytes.push(
+ 0xf0 | (code >> 18),
+ 0x80 | ((code >> 12) & 0x3f),
+ 0x80 | ((code >> 6) & 0x3f),
+ 0x80 | (code & 0x3f)
+ );
+ }
+ }
+ return this.arrToHex(bytes);
+}
+/**
+ * 浼犻�掕繃鏉ョ殑utf-8鐨�16杩涘埗瀛楃涓茶浆鎹㈡垚瀛楃涓�
+ * @param {string} hex
+ * @returns
+ */
+common.utf8HexToStr = function (hex) {
+ let array = this.hexToArr(hex)
+ var out, i, len, c;
+ var char2, char3;
+
+ out = "";
+ len = array.length;
+ i = 0;
+ while (i < len) {
+ c = array[i++];
+ switch (c >> 4) {
+ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
+ // 0xxxxxxx
+ out += String.fromCharCode(c);
+ break;
+ case 12: case 13:
+ // 110x xxxx 10xx xxxx
+ char2 = array[i++];
+ out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
+ break;
+ case 14:
+ // 1110 xxxx 10xx xxxx 10xx xxxx
+ char2 = array[i++];
+ char3 = array[i++];
+ out += String.fromCharCode(((c & 0x0F) << 12) |
+ ((char2 & 0x3F) << 6) |
+ ((char3 & 0x3F) << 0));
+ break;
+ }
+ }
+
+ return out;
+}
+/**
+ * 瀛楃涓茶浆鍗佸叚杩涘埗 eg:123abc->313233616263
+ * @param {string} str 瑕佽浆鐨勫瓧绗︿覆
+ * @returns
+ */
+common.stringToHex = function (str) {
+ if (str === undefined || str === null || typeof (str) != "string") {
+ return null
+ }
+ let val = "";
+ for (let i = 0; i < str.length; i++) {
+ val += str.charCodeAt(i).toString(16)
+ }
+ return val
+}
+
+/**
+ * 灏忕鏍煎紡杞崄杩涘埗鏁� eg:001001->69632
+ * @param {string} hexString 16杩涘埗瀛楃涓� 灏忓啓涓斾腑闂存棤绌洪殧鐨勫崄鍏繘鍒跺瓧绗︿覆
+ * @returns 鏁板瓧
+ */
+common.littleEndianToDecimal = function (hexString) {
+ // 灏嗗皬绔牸寮忕殑鍗佸叚杩涘埗瀛楃涓茶繘琛屽弽杞�
+ let reversedHexString = hexString
+ .match(/.{2}/g) // 姣忎袱涓瓧绗﹀垎闅�
+ .reverse() // 鍙嶈浆鏁扮粍
+ .join(""); // 鍚堝苟涓哄瓧绗︿覆
+
+ // 灏嗗弽杞悗鐨勫崄鍏繘鍒跺瓧绗︿覆杞崲涓哄崄杩涘埗鏁�
+ let decimal = parseInt(reversedHexString, 16);
+ return decimal;
+}
+
+
+/**
+ * 鍗佽繘鍒舵暟杞崲涓�16杩涘埗灏忕鏍煎紡瀛楃涓�
+ * eg:300->2c01
+ * eg:230->e600
+ * @param {number} decimalNumber 鍗佽繘鍒舵暟瀛�,蹇呭~
+ * @param {number} byteSize 鐢熸垚浣嶆暟 瀛楄妭鐨勪釜鏁帮紝濡傛灉瓒呭嚭瀹為檯瀛楄妭涓暟锛屼細鍦ㄥ彸杈硅ˉ0锛屼綆浜庝細鎴彇锛岄潪蹇呭~锛岀己鐪佹槸2
+ * @returns
+ */
+common.decimalToLittleEndianHex = function (decimalNumber, byteSize) {
+ if (decimalNumber === undefined || decimalNumber === null || (typeof decimalNumber) != 'number') {
+ throw new Error("dxCommon.decimalToLittleEndianHex:'decimalNumber' parameter should be number")
+ }
+ if (byteSize === undefined || byteSize === null || (typeof byteSize) != 'number' || byteSize <= 0) {
+ byteSize = 2
+ }
+ const littleEndianBytes = [];
+ for (let i = 0; i < byteSize; i++) {
+ littleEndianBytes.push(decimalNumber & 0xFF);
+ decimalNumber >>= 8;//鐩稿綋浜庨櫎浠�256
+ }
+ const littleEndianHex = littleEndianBytes
+ .map((byte) => byte.toString(16).padStart(2, '0'))
+ .join('');
+ return littleEndianHex;
+}
+
+/**
+ * 灏�16杩涘埗瀛楃涓茶浆鎹负ArrayBuffer
+ * @param {*} hexString 瑕佽浆鎹㈢殑16杩涘埗瀛楃涓�
+ * @returns
+ */
+common.hexStringToArrayBuffer = function (hexString) {
+ return this.hexStringToUint8Array(hexString).buffer;
+}
+
+/**
+ * 灏�16杩涘埗瀛楃涓茶浆鎹负Uint8Array
+ * @param {string} hexString 瑕佽浆鎹㈢殑16杩涘埗瀛楃涓诧紝灏忓啓涓斾腑闂存棤绌洪殧鐨勫崄鍏繘鍒跺瓧绗︿覆
+ * @returns Uint8Array瀵硅薄
+ */
+common.hexStringToUint8Array = function (hexString) {
+ if (hexString === undefined || hexString === null || (typeof hexString) != 'string' || hexString.length <= 0) {
+ throw new Error("dxCommon.hexStringToUint8Array:'hexString' parameter should not be empty")
+ }
+ let byteString = hexString.match(/.{1,2}/g);
+ let byteArray = byteString.map(function (byte) {
+ return parseInt(byte, 16);
+ });
+ let buffer = new Uint8Array(byteArray);
+ return buffer;
+}
+
+/**
+ * 灏� ArrayBuffer 杞崲涓哄崄鍏繘鍒跺瓧绗︿覆鏍煎紡
+ * @param {ArrayBuffer} buffer
+ * @returns 灏忓啓涓斾腑闂存棤绌洪殧鐨勫崄鍏繘鍒跺瓧绗︿覆
+ */
+common.arrayBufferToHexString = function (buffer) {
+ return this.uint8ArrayToHexString(new Uint8Array(buffer))
+}
+/**
+ * 灏� Uint8Array 杞崲涓哄崄鍏繘鍒跺瓧绗︿覆鏍煎紡
+ * @param {Uint8Array} array
+ * @returns 灏忓啓涓斾腑闂存棤绌洪殧鐨勫崄鍏繘鍒跺瓧绗︿覆
+ */
+common.uint8ArrayToHexString = function (array) {
+ let hexString = '';
+ for (let i = 0; i < array.length; i++) {
+ const byte = array[i].toString(16).padStart(2, '0');
+ hexString += byte;
+ }
+ return hexString
+}
+/**
+ * 璁剧疆/鑾峰彇缁勪欢鍙ユ焺id閫氱敤鏂规硶
+ * @param {string} name 缁勪欢鍚嶏紝蹇呭~
+ * @param {string} id 鍙ユ焺id锛岄潪蹇呭~
+ * @param {number} pointer 鍙ユ焺鎸囬拡鏁板瓧锛岄潪蹇呭~
+ * @returns
+ */
+common.handleId = function (name, id, pointer) {
+ // 缁勪欢鍚嶄笉鑳戒负绌�
+ if (name === undefined || name === null || name === "" || typeof name !== 'string') {
+ return
+ }
+ let map = dxMap.get('handleIds')
+ // 鍙ユ焺id
+ if (id === undefined || id === null || id === "" || typeof id !== 'string') {
+ id = "__" + name + "_default"
+ }
+ if (pointer === undefined || pointer === null || typeof pointer !== 'number') {
+ // pointer涓虹┖鍒欎负鑾峰彇
+ return map.get(id)
+ } else {
+ // pointer涓嶄负绌哄垯涓鸿缃�
+ let isExist = map.get(id)
+ if (isExist) {
+ // 鍙ユ焺宸插瓨鍦�
+ return
+ }
+ map.put(id, pointer)
+ }
+}
+
+
+export default common
\ No newline at end of file
--
Gitblit v1.9.3