使用 JavaScript 将二进制转换为文本
Posted
技术标签:
【中文标题】使用 JavaScript 将二进制转换为文本【英文标题】:Converting Binary to text using JavaScript 【发布时间】:2014-01-25 18:05:53 【问题描述】:如何使用 javascript 将二进制代码转换为文本?我已经让它将文本转换为二进制,但是有没有办法反过来呢?
这是我的代码:
function convertBinary()
var output = document.getElementById("outputBinary");
var input = document.getElementById("inputBinary").value;
output.value = "";
for (i = 0; i < input.length; i++)
var e = input[i].charCodeAt(0);
var s = "";
do
var a = e % 2;
e = (e - a) / 2;
s = a + s;
while (e != 0);
while (s.length < 8)
s = "0" + s;
output.value += s;
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<center>
<div class="container">
<span class="main">Binary Converter</span><br>
<textarea autofocus class="inputBinary" id="inputBinary" onKeyUp="convertBinary()"></textarea>
<textarea class="outputBinary" id="outputBinary" readonly></textarea>
<div class="about">Made by <strong>Omar</strong></div>
</div>
</center>
任何帮助将不胜感激。
谢谢,奥马尔。
【问题讨论】:
【参考方案1】:我最近使用 for 循环完成了一个练习。希望有用:
function binaryAgent(str)
var newBin = str.split(" ");
var binCode = [];
for (i = 0; i < newBin.length; i++)
binCode.push(String.fromCharCode(parseInt(newBin[i], 2)));
return binCode.join("");
binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100');
//translates to "Aren't"
编辑:在学习了更多 JavaScript 之后,我能够缩短解决方案:
function binaryAgent(str)
var binString = '';
str.split(' ').map(function(bin)
binString += String.fromCharCode(parseInt(bin, 2));
);
return binString;
binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100');
//translates to "Aren't"
【讨论】:
您使用.map
就像您使用.forEach
一样。您可以改用const binaryAgent = str => str.split(' ').map(bin => String.fromCharCode(parseInt(bin, 2))).join("");
。
啊,我被困在这个免费的代码训练营练习中了,我看到你也是从那里工作的:)
注意:这可能是 O(n^2);在循环中连接字符串是一个坏习惯......相反,您应该使用 join 方法,正如 Jeffrey James 所演示的那样。【参考方案2】:
使用toString(2)
转换为二进制字符串。例如:
var input = document.getElementById("inputDecimal").value;
document.getElementById("outputBinary").value = parseInt(input).toString(2);
或parseInt(input,10)
,如果您知道输入应该是十进制。否则“0x42”的输入将被解析为十六进制而不是十进制。
编辑:只需重新阅读问题。要从二进制转换为文本,请使用 parseInt(input,2).toString(10)。
以上所有内容仅适用于数字。例如,4
0100
。如果你想要4
十进制52(它的ASCII值),使用String.fromCharCode()
(见this answer)。
编辑 2:根据所有适合的要求,试试这个:
function BinToText()
var input = document.getElementById("inputBinary").value;
document.getElementById("outputText").value = parseInt(input,2).toString(10);
...
<textarea autofocus class="inputBinary" id="inputBinary" onKeyUp="BinToText()"></textarea>
<textarea class="outputBinary" id="outputText" readonly></textarea>
如果您将0100
放入inputBinary
,您应该在outputText
中获得4
(未经测试)。
【讨论】:
编辑显示。进一步的建议:将您的函数命名为“X2Y”而不是“convertX”。使用像“convertBinary”这样的名称,目前尚不清楚它是转换为二进制还是从二进制转换。使用更具描述性的函数和变量名称将帮助其他人更好地理解您的代码,并且当您在一个月后回到它时帮助您更好地理解它:)。【参考方案3】:如果有人仍在寻找此答案,则类似于另一个答案。第一个拆分返回一个字符串列表,每个字符串代表一个binary character。
然后我们在每个字符串上调用 map,例如“11001111”或其他任何字符串,并返回嵌套 parseInt 的元素上的 fromCharCode。然后将 .join() 放在总返回值上,它应该可以工作。
function binaryAgent3(str)
return str.split(" ").map(function(elem)
return String.fromCharCode(parseInt(elem, 2));
).join("")
原问题:http://www.freecodecamp.com/challenges/binary-agents
【讨论】:
喜欢这个解决方案多么简单【参考方案4】:我遇到了同样的事情,我想将二进制转换为文本,这就是我想出的。
function binaryToWords(str)
if(str.match(/[10]8/g))
var wordFromBinary = str.match(/([10]8|\s+)/g).map(function(fromBinary)
return String.fromCharCode(parseInt(fromBinary, 2) );
).join('');
return console.log(wordFromBinary);
binaryToWords('01000011 01101111 01100110 01100110 01100101 01100101 00100000 01101001 01110011 00100000 01100011 01101111 01101100 01100100 ');
【讨论】:
【参考方案5】:这是我编写的将二进制转换为字符串的代码。唯一的区别 - 它更短并且依赖于内置的 JS 函数。
function binarytoString(str)
return str.split(/\s/).map(function (val)
return String.fromCharCode(parseInt(val, 2));
).join("");
【讨论】:
【参考方案6】:我将二进制代码转换为文本的解决方案。没有额外的东西。我认为是最简单的版本。
function binaryAgent(str)
return str.split(" ").map(x => String.fromCharCode(parseInt(x, 2))).join("");
console.log(binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111"));
【讨论】:
【参考方案7】:这个怎么样?
function binaryAgent(str)
var splitStr = str.split(" ");
var newVar = splitStr.map(function(val)
return String.fromCharCode(parseInt(val,2).toString(10));
);
str = newVar.join("");
return str;
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111"); // should return "Aren't bonfires fun!?"
【讨论】:
【参考方案8】:这应该可以,你不需要给它“漂亮”的二进制文件。
function binaryToString(binary)
return binary.replace(/[01]8/g, function(v)
return String.fromCharCode(parseInt(v, 2));
);
【讨论】:
【参考方案9】:如果您正在寻找 1 线解决方案。
function binary(str)
return str.split(/\s/g).map((x) => x = String.fromCharCode(parseInt(x, 2))).join("");
//returns "one line"
binary("01101111 01101110 01100101 00100000 01101100 01101001 01101110 01100101");
【讨论】:
【参考方案10】:如果您知道只传递了二进制文件,您可以使用这个只有 1 行简单的函数:
function binaryAgent(str)
return str.split(" ").map(input => String.fromCharCode(parseInt(input,2).toString(10))).join("");
// Calling the function
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");
【讨论】:
【参考方案11】:短代码
function binaryAgent(str)
let array = str.split(" ");
return array.map(code => String.fromCharCode(parseInt(code, 2))).join("");
console.log(binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111"));
// should return "Aren't bonfires fun!?"
【讨论】:
【参考方案12】:这也是您可以在 String
原型上委派的操作,尽管很少建议更新全局对象类型。
/** Returns a converted binary string to text */
String.prototype.binaryToText = function()
return this
.match(/.1,8/g)
.join(' ')
.split(' ')
.reduce((a, c) => a += String.fromCharCode(parseInt(c, 2)), '');
const result = '01110101011100000010000001110110011011110111010001100101'.binaryToText();
console.log(result);
【讨论】:
【参考方案13】:单线(箭头)函数:
let binToStr = (str) => str.split(' ').map((x) => String.fromCharCode(parseInt(x,2))).join('')
//Output: "Are fun!"
console.log(binToStr("01000001 01110010 01100101 00100000 01100110 01110101 01101110 00100001"));
【讨论】:
【参考方案14】:我的解决方案很像 map,只是我使用了 reduce。将其分解为一个数组,使用reduce转换字符并将它们添加到一个新的数组中,并将新的数组连接在一起。
function binaryAgent(str)
var sentence = str.split(" ").reduce(function(x, y)
x.push(String.fromCharCode(parseInt(y, 2)));
return x;
, []).join('');
return sentence;
【讨论】:
【参考方案15】:如果有人在寻找这个,另一个类似的答案
function binaryAgent(str)
var strArray = str.split(" ");
var text ="";
for(var i = 0 ; i<strArray.length ; i++)
var char = parseInt(strArray[i],2).toString(10);
char = String.fromCharCode(char);
text += char;
return text;
binaryAgent("01101101 01100101 01110110");
【讨论】:
【参考方案16】:我发现每个提供的解决方案的一个问题是,如果二进制字符串不是“漂亮打印”的,它不会将其转换为字符串:
function binaryAgent(str)
var binString = '';
str.split(' ').map(function(bin)
binString += String.fromCharCode(parseInt(bin, 2));
);
return binString;
// This displays "Aren't"
binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100');
//But this not
binaryAgent('010000010111001001100101011011100010011101110100');
一个快速的解决方案是每 8 个字符从字符串中删除所有空格(如果有,否则拆分指令无法正常工作):
function binaryAgent(str)
// Removes the spaces from the binary string
str = str.replace(/\s+/g, '');
// Pretty (correct) print binary (add a space every 8 characters)
str = str.match(/.1,8/g).join(" ");
var binString = '';
str.split(' ').map(function(bin)
binString += String.fromCharCode(parseInt(bin, 2));
);
return binString;
// Both display "Aren't"
binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100');
binaryAgent('010000010111001001100101011011100010011101110100');
【讨论】:
【参考方案17】:对于那些更喜欢 .forEach() 而不是循环的人,以下方法也可以:
function binaryToHuman(str)
// split string into an array so we can loop through it
var newStr=str.split(" ");
// declare a new array to later push "translated" values into
var sArr=[];
// loop through binary array, translate and push translated values into the new array
newStr.forEach(function(item)
sArr.push(String.fromCharCode(parseInt(item,2)));
)
// join the array back into a string
return sArr.join("");
console.log(binaryToHuman("01001001 00100000 01101100 01101111 01110110 01100101 00100001"));
// returns:
// I love!
【讨论】:
【参考方案18】:我的解决方案只是使用正则表达式将字节拆分为数组,循环遍历每个字节,将二进制转换为 ascii 并在末尾将其转换为字符串
function binaryAgent(str)
//Splits into an array
var re = /\s/;
var newArr=str.split(re)
var answerArr =[];
//Decimal Conversion
for (let i=0; i<newArr.length; i++)
answerArr.push(String.fromCharCode(parseInt(newArr[i],2)));
return answerArr.join('');
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");
【讨论】:
【参考方案19】:这是我使用尽可能多的 ES6 语法的解决方案:
const binaryAgent = str =>
let code = str.split(" ")
let s = code.map((d) => parseInt(d,2))
let res = s.map((d) => String.fromCharCode(d))
return res.join("")
binaryAgent("01001001 00100000 01101100 01101111 01110110 01100101 00100000 01000110 01110010 01100101 01100101 01000011 01101111 01100100 01100101 01000011 01100001 01101101 01110000 00100001")
它应该返回I love FreeCodeCamp!
【讨论】:
【参考方案20】:const whoTookTheCarKey = message =>
message.toString().split(',')
.map(message => String.fromCharCode(parseInt(message, 2)))
.join('')enter code here
【讨论】:
欢迎来到 ***。虽然此代码可能会解决问题,但包括解释如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。【参考方案21】:采用 ES6 语法的单线解决方案,使用 split、map 和 join 函数
function convertBinary(binary)
return binary.split(" ").map((x) => x = String.fromCharCode(parseInt(x, 2))).join("");
console.log(convertBinary("01001000 01100101 01101100 01101100 01101111 00100001"));
//This will print Hello!
【讨论】:
【参考方案22】:-
使用
split
方法将二进制数分成一个数组。
使用map
方法迭代数组中的每个二进制数,并使用String对象的fromCharCode
方法将其转换为对应的字母(必须先将二进制数转换为十进制,如下所示: parseInt (bin, 2)
让 fromCharCode
方法正常工作)。
将fromCharCode
方法返回的字母添加到将包含结果的变量中。
function convertBinary(str)
let result = "";
str.split(" ").map(bin =>
result += String.fromCharCode(parseInt(bin, 2))
)
return result;
【讨论】:
【参考方案23】:这是对 JosephD 的“单线(箭头)函数”答案的小调整...
当箭头函数只有一个参数时,可以省略括号()
。您可以在箭头函数和.map
方法中省略它们,如下所示:
let binToStr = str => str.split(' ').map(x => String.fromCharCode(parseInt(x,2))).join('');
【讨论】:
其他答案之一的评论中已经存在类似的建议以上是关于使用 JavaScript 将二进制转换为文本的主要内容,如果未能解决你的问题,请参考以下文章
将二进制 NodeJS 缓冲区转换为 JavaScript ArrayBuffer
JavaScript:需要函数将包含二进制的字符串转换为十六进制,然后再转换回二进制