我需要使用javascript将十六进制转换为二进制文件。
例如: 21 23 00 6A D0 0F 69 4C E1 20
应该导致: 0010000100100011000000000110101011010000000011110110100101001100
有没有人知道我可能用来实现这个的JavaScript库?
哈里特
答案 0 :(得分:10)
您可以使用以下内容创建将十六进制数转换为二进制数的函数:
function hex2bin(hex){
return ("00000000" + (parseInt(hex, 16)).toString(2)).substr(-8);
}
对于格式化,您只需用8 0
填充一个字符串,然后连接您的数字。然后,为了转换,你做的是基本获得一个字符串或数字,使用带有输入数字值的parseInt
函数及其基数(此处为十六进制的16),然后使用{将其打印到基数2 {1}}功能。
最后,您提取最后8个字符以获取格式化的字符串。
由于这个答案仍在阅读中,我想使用ES8(ECMAScript 2017)String.padStart()
方法为函数体提供另一种语法:
toString
使用function hex2bin(hex){
return (parseInt(hex, 16).toString(2)).padStart(8, '0');
}
将填充字符串,直到其长度与第一个参数匹配,第二个参数是填充字符(默认为空格)。
编辑结束
要在像您这样的完整字符串上使用此功能,请使用简单的padStart
:
forEach
输出将是:
00100001001000110000000001101010110100000000111101101001010011001110000100100000
答案 1 :(得分:2)
您可以使用parseInt
和toString
更改号码的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;
}