本文概述
- 测验
- 可读的字符串到二进制
- 二进制到可读字符串
在本文中, 你将学习如何使用Javascript将字符串转换为二进制值, 以及将二进制值转换为人类可读的字符串。
测验在本文中, 我们将与你分享一些将可读字符串转换为二进制表示形式或将二进制字符串转换为可读字符串的方法。为了检查这些方法是否按预期工作, 我们将在以下变量TestBlock中存储的每个对象上测试该方法:
var TestBlock = [{binary: "01010010 01100101 01100001 01101100 00100000 01110000 01110010 01101111 01100111 01110010 01100001 01101101 01110011 00100000 01100100 01101111 01101110 00100111 01110100 00100000 01100101 01100001 01110100 00100000 01100011 01100001 01100011 01101000 01100101 00101110", text: "Real programs don't eat cache."}, {binary: "0100110101101111011100110111010000100000011100000111010101100010011011000110100101100011001000000110010001101111011011010110000101101001011011100010000001110011011011110110011001110100011101110110000101110010011001010010000001101001011100110010000001100110011100100110010101100101001011000010000001100001011101000010000001101100011001010110000101110011011101000010000001100001011101000010000001100110011010010111001001110011011101000010000001100111011011000110000101101110011000110110010100101110", text: "Most public domain software is free, at least at first glance."}, {binary: "01010100011010000110111101110011011001010010000001110111011010000110111100100000011001000110111 1001000000110111 00110111101110100001000000111010101101110011001000110010101110010011100110111010001100001011011100110010000100 000010101010110111001101001011110000010000001100001011100100110010100100000011000110110111101101110011001000110010101101101011011100110010101100100001000000111010001101111001000000111001001100101011010010110111001110110011001010110111001 110100 0010000001101001011101000010110000100000011100000110111101101111011100100110110001111001001011100010000000101101001011010010000001001000011001010110111001110010011110010010000001010011011100000110010101101110011000110110010101110010", text: "Those who do not understand Unix are condemned to reinvent it, poorly. -- Henry Spencer"}, {binary: "01000110010011110101001001010100 0101001001000001010011100010000001101001011100110010000001100110011011110111001000100000011100000110100101110000011001010010000001110011011101000111001001100101011100110111001100100000011001100111001001100101011000010110101101110011001000000110000101101110011001000010000001100011011100 1001111001011100110111010001100001011011000110110001101111011001110111001001100001011100000110100001111001001000000111011101100101011001010110111001101001011001010111001100101110", text: "FORTRAN is for pipe stress freaks and crystallography weenies."}, {binary: "00101111 01100101 01100001 01110010 01110100 01101000 00100000 01101001 01110011 00100000 00111001 00111000 00100101 00100000 01100110 01110101 01101100 01101100 00100000 00101110 00101110 00101110 00100000 01110000 01101100 01100101 01100001 01110011 01100101 00100000 01100100 01100101 01101100 01100101 01110100 01100101 00100000 01100001 0110 1110 01111001 01101111 01101110 01100101 00100000 01111001 01101111 01110101 00100000 01100011 01100001 01101110 00101110", text: "/earth is 98% full ... please delete anyone you can."}];
话虽如此, 让我们开始吧!
可读的字符串到二进制要将人类可读的字符串转换为其二进制值, 请使用以下函数:
/** * Function that converts a string into its binary representation * * @see https://gist.github.com/eyecatchup/6742657 * @author https://github.com/eyecatchup */function stringToBinary(str, spaceSeparatedOctets) {function zeroPad(num) {return "00000000".slice(String(num).length) + num;
}return str.replace(/[\s\S]/g, function(str) {str = zeroPad(str.charCodeAt().toString(2));
return !1 == spaceSeparatedOctets ? str : str + " "});
};
你可以轻松使用它:
// "01001000 01100101 01101100 01101100 01101111 00100000 01000010 01101001 01101110 01100001 01110010 01111001 00100000 01010111 01101111 01110010 01101100 01100100"stringToBinary("Hello Binary World");
但是这段代码如何工作? Providen字符串charCodeAt方法返回字符串中第一个字符的Unicode。 toString()方法解析其第一个参数, 并尝试返回指定基数(基数)的字符串表示形式。对于基数大于10的字母, 字母表示大于9的数字。例如, 对于十六进制数字(基数为16), 使用a至f。
如果将第二个参数(spaceSeparatedOctets)提供为0, 则字符串将不会被” 漂亮地打印” (八位字节将不会被分隔)。下面是对stringToBinary方法的测试(请注意, stringToBinary方法在返回的字符串的末尾添加了一个空字符, 因此建议使用trim方法将其删除):
var testsSuccesfullyExecuted = 0;
var testErrors = [];
TestBlock.forEach(function(item , index){var processedBinaryString = item.binary;
// Removes the spaces from the binary stringprocessedBinaryString = processedBinaryString.replace(/\s+/g, '');
// Pretty (correct) print binary (add a space every 8 characters)processedBinaryString = processedBinaryString.match(/.{1, 8}/g).join(" ");
// Remove spaces at the end of the stringToBinary generated stringif(stringToBinary(item.text).trim() == processedBinaryString){console.log("Test ${"+ index +"} passes");
testsSuccesfullyExecuted++;
}else{testErrors.push(index);
}});
if(testsSuccesfullyExecuted == TestBlock.length){console.log("Test suite succesfully executed with no errors");
}else{console.error("Test failed with : " + JSON.stringify(testErrors));
}
在控制台中提供以下输出:
Test ${0} passesTest ${1} passesTest ${2} passesTest ${3} passesTest ${4} passesTest suite succesfully executed with no errors
在具有以下规格的个人计算机中执行的标准基准测试:
- Windows 10 Pro 64位(10.0, 内部版本14393)-Chrome版本56.0.2924.87(64位)
- Intel(R)CoreTM i7-7700 CPU @ 3.60GHz(8 CPU), ?3.6GHz
- 8192MB内存
二进制到可读字符串要将二进制字符串转换为可读字符串, 可以使用以下两种方法中的任何一种binaryToString或binaryAgent:
选项1
此函数删除字符串的所有空白, 并将其拆分为8个字符的块, 这些块将合并为单个字符串。然后, String.fromCharCode将为你解决问题:
function binaryToString(str) {// Removes the spaces from the binary stringstr = str.replace(/\s+/g, '');
// Pretty (correct) print binary (add a space every 8 characters)str = str.match(/.{1, 8}/g).join(" ");
var newBinary = str.split(" ");
var binaryCode = [];
for (i = 0;
i <
newBinary.length;
i++) {binaryCode.push(String.fromCharCode(parseInt(newBinary[i], 2)));
}return binaryCode.join("");
}
以及用法:
// Both of them return: "Hello Binary World"binaryToString("0100100001100101011011000110110001101111001000000100001001101001011011100110000101110010011110010010000001010111011011110111001001101100011001000010000000100001");
binaryToString("01001000 01100101 01101100 01101100 01101111 00100000 01000010 01101001 01101110 01100001 01110010 01111001 00100000 01010111 01101111 01110010 01101100 01100100 00100000 00100001");
binaryToString的测试代码如下:
var testsSuccesfullyExecuted = 0;
var testErrors = [];
TestBlock.forEach(function(item , index){if(binaryToString(item.binary) == item.text){console.log("Test ${"+ index +"} passes");
testsSuccesfullyExecuted++;
}else{testErrors.push(index);
}});
if(testsSuccesfullyExecuted == TestBlock.length){console.log("Test suite succesfully executed with no errors");
}else{console.error("Test failed with : " + JSON.stringify(testErrors));
}
以下测试将在控制台中输出以下内容:
Test ${0} passesTest ${1} passesTest ${2} passesTest ${3} passesTest ${4} passesTest suite succesfully executed with no errors
选项2
以第一个函数的相同方式, 将删除所有空白区域, 并将字符串分成8个字符的块, 最后进行连接。
function binaryAgent(str) {// Removes the spaces from the binary stringstr = str.replace(/\s+/g, '');
// Pretty (correct) print binary (add a space every 8 characters)str = str.match(/.{1, 8}/g).join(" ");
return str.split(" ").map(function (elem) {return String.fromCharCode(parseInt(elem, 2));
}).join("");
}
以及用法:
// Both of them return: "Hello Binary World"binaryAgent("0100100001100101011011000110110001101111001000000100001001101001011011100110000101110010011110010010000001010111011011110111001001101100011001000010000000100001");
binaryAgent("01001000 01100101 01101100 01101100 01101111 00100000 01000010 01101001 01101110 01100001 01110010 01111001 00100000 01010111 01101111 01110010 01101100 01100100 00100000 00100001");
binaryAgent的测试代码如下:
var testsSuccesfullyExecuted = 0;
var testErrors = [];
TestBlock.forEach(function(item , index){if(binaryAgent(item.binary) == item.text){console.log("Test ${"+ index +"} passes");
testsSuccesfullyExecuted++;
}else{testErrors.push(index);
}});
if(testsSuccesfullyExecuted == TestBlock.length){console.log("Test suite succesfully executed with no errors");
}else{console.error("Test failed with : " + JSON.stringify(testErrors));
}
以下测试将在控制台中输出以下内容:
Test ${0} passesTest ${1} passesTest ${2} passesTest ${3} passesTest ${4} passesTest suite succesfully executed with no errors
基准测试
使用以下规格的个人计算机进行标准基准测试(执行10K次)的结果:
- Windows 10 Pro 64位(10.0, 内部版本14393)-Chrome版本56.0.2924.87(64位)
- Intel(R)CoreTM i7-7700 CPU @ 3.60GHz(8 CPU), ?3.6GHz
- 8192MB内存
方法 | Total time (MS) | 平均时间(MS)/任务 |
binaryToString (Option 1) | 1068.54 | 0.10662899999999208 |
binaryAgent (Option 2) | 1304.80 | 0.13019300000001968 |
编码愉快!
推荐阅读
- 如何使用JavaScript(WebRTC)在浏览器中录制带音频的视频
- 如何区分HTML并使用JavaScript在HTML中生成输出
- 如何使用js-imagediff使用JavaScript区分2张图片
- 如何在局域网连接的设备上使用Artyom.js沙箱
- 如何在浏览器的JavaScript控制台中显示图像
- 如何使用JavaScript检测AdBlock是否已安装在访问者的设备上
- 如何在JavaScript中轻松将数组拆分为相同大小的块
- 如何检查JavaScript承诺是否已实现,拒绝或解决
- cocos2d-x CCArray使用中避免出现野指针问题