js 各種進制轉換,轉ascll碼等

因爲近期做小程序,藍牙連接硬件,需要根據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);
}

 

十六進制轉二進制(需要借用到hex_dec,也就是需要先轉換成十進制再轉成二進制)
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();
}

 

十六進制轉Buffer
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;
}

 

Bufer轉十六進制
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("");
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章