在javascript中将十六进制转换为二进制

时间:2017-07-12 09:22:49

标签: javascript

我需要使用javascript将十六进制转换为二进制文件。

例如: 21 23 00 6A D0 0F 69 4C E1 20

应该导致: 0010000100100011000000000110101011010000000011110110100101001100

有没有人知道我可能用来实现这个的JavaScript库?

哈里特

7 个答案:

答案 0 :(得分:10)

您可以使用以下内容创建将十六进制数转换为二进制数的函数:

function hex2bin(hex){
    return ("00000000" + (parseInt(hex, 16)).toString(2)).substr(-8);
}

对于格式化,您只需用8 0填充一个字符串,然后连接您的数字。然后,为了转换,你做的是基本获得一个字符串或数字,使用带有输入数字值的parseInt函数及其基数(此处为十六进制的16),然后使用{将其打印到基数2 {1}}功能。 最后,您提取最后8个字符以获取格式化的字符串。

2018编辑:

由于这个答案仍在阅读中,我想使用ES8(ECMAScript 2017)String.padStart()方法为函数体提供另一种语法:

toString

使用function hex2bin(hex){ return (parseInt(hex, 16).toString(2)).padStart(8, '0'); } 将填充字符串,直到其长度与第一个参数匹配,第二个参数是填充字符(默认为空格)。

编辑结束

要在像您这样的完整字符串上使用此功能,请使用简单的padStart

forEach

输出将是:

  

00100001001000110000000001101010110100000000111101101001010011001110000100100000

答案 1 :(得分:2)

您可以使用parseInttoString更改号码的radix



function convertNumber(n, fromBase, toBase) {
  if (fromBase === void 0) {
    fromBase = 10;
  }
  if (toBase === void 0) {
    toBase = 10;
  }
  return parseInt(n.toString(), fromBase).toString(toBase);
}
console.log(
  convertNumber("f", 16, 10),
  convertNumber("f", 16, 2),
  convertNumber("1111", 2, 10),
  convertNumber("1111", 2, 16)
);




答案 2 :(得分:2)

不幸的是,以前的答案似乎不适用于很大的值(例如,在密码学中很常见的512位)。这种解决方案可能会慢一些,但是可以保证处理任意长度的输入。

function hex2bin(hex){
    hex = hex.replace("0x", "").toLowerCase();
    var out = "";
    for(var c of hex) {
        switch(c) {
            case '0': out += "0000"; break;
            case '1': out += "0001"; break;
            case '2': out += "0010"; break;
            case '3': out += "0011"; break;
            case '4': out += "0100"; break;
            case '5': out += "0101"; break;
            case '6': out += "0110"; break;
            case '7': out += "0111"; break;
            case '8': out += "1000"; break;
            case '9': out += "1001"; break;
            case 'a': out += "1010"; break;
            case 'b': out += "1011"; break;
            case 'c': out += "1100"; break;
            case 'd': out += "1101"; break;
            case 'e': out += "1110"; break;
            case 'f': out += "1111"; break;
            default: return "";
        }
    }

    return out;
}

答案 3 :(得分:1)

最简单的实现

const getArray = (str) => {
  const idxStart = str.indexOf('[') + 1
  const idxEnd = str.indexOf(']')
  arr = str.slice(idxStart, idxEnd)
  return arr.split(',')

答案 4 :(得分:0)

这对我有用。

function hex2bin(hexSource) {
    var bin = '';
    for (var i=0;i<hexSource.length;i=i+2) {
        bin += String.fromCharCode(hexdec(hexSource.substr(i,2)));
    }
    return bin;
}

function hexdec(hexString) {
    hexString = (hexString + '').replace(/[^a-f0-9]/gi, '')
    return parseInt(hexString, 16)
}

答案 5 :(得分:0)

这可能是更快的方法,概念是考虑整数的容量,我们可以将十六进制字符串分成 8 个字符而不是 1 个字符的块:

function hexToBinary(hex) {
    var binary = "";
    var remainingSize = hex.length;
    for (var p = 0; p < hex.length/8; p++) {
        //In case remaining hex length (or initial) is not multiple of 8
        var blockSize = remainingSize < 8 ? remainingSize  : 8;

        binary += parseInt(hex.substr(p * 8, blockSize), 16).toString(2).padStart(blockSize*4,"0");

        remainingSize -= blockSize;
    }
    return binary;
}

答案 6 :(得分:0)

我同意十六进制到二进制的逐个字符不是最快或最有效的,但我认为很难做到这一点并且仍然有可读的代码。我认为对于不太熟悉的人来说,这两个是很好的起点。

function hex2bin(hex) {
  let bin = "";
  let bitsInHex = 4;

  Array.from(hex).forEach(
    function (char) {
      let currentBin = parseInt(char, 16).toString(2);

      if (currentBin.length < bitsInHex) {
        let padding = "0".repeat(bitsInHex-currentBin.length);
        currentBin = padding + currentBin;
      }

      bin += currentBin;
    }
  );

  return bin;
}

function bin2hex(bin) {
  let hex = "";
  let bitsInHex = 4;

  for (let i = 0; i < bin.length; i = i + bitsInHex) {
    let eightBits = bin.substr(i, bitsInHex);
    let currentHex = (parseInt(eightBits, 2)).toString(16).toUpperCase();
    hex += currentHex;
  }

  return hex;
}