因爲近期做小程序,藍牙連接硬件,需要根據module bus通信協議解析數據,用到了很多標題的算法轉換,藉此總結一下。
function hex_dec(hex) { var len = hex.length, a = new Array(len), code; for (var i = 0; i < len; i++) { code = hex.charCodeAt(i); if (48 <= code && code < 58) { code -= 48; } else { code = (code & 0xdf) - 65 + 10; } a[i] = code; } return a.reduce(function (acc, c) { acc = 16 * acc + c; return acc; }, 0); }
function hex_bin(hex, len) { var res = hex_dec(hex).toString(2); return (Array(len).join(0) + res).slice(-len); }
function int2Hex(num, len) { var res = num.toString(16).toUpperCase(); return (Array(len).join(0) + res).slice(-len).toUpperCase(); }
function hex_buf(hexStr) { var count = hexStr.length / 2; let buffer = new ArrayBuffer(count); let dataView = new DataView(buffer); for (var i = 0; i < count; i++) { var curCharCode = parseInt(hexStr.substr(i * 2, 2), 16); dataView.setUint8(i, curCharCode); } return buffer; }
function buf_hex(buffer) { // buffer is an ArrayBuffer return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join(''); }
十六進制轉ASCII碼
function hex_ascll(hexCharCodeStr) { var trimedStr = hexCharCodeStr.trim(); var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr; var len = rawStr.length; if (len % 2 !== 0) { alert("存在非法字符!"); return ""; } var curCharCode; var resultStr = []; for (var i = 0; i < len; i = i + 2) { curCharCode = parseInt(rawStr.substr(i, 2), 16); resultStr.push(String.fromCharCode(curCharCode)); } return resultStr.join(""); }