Как преобразовать двоичную строку в читаемую строку и наоборот с помощью Javascript

Двоичный код — это представление текста, инструкций процессора компьютера или других данных с использованием двухсимвольной системы, часто двоичная система счисления равна 0 и 1. Двоичный код назначает последовательность двоичных цифр (битов) каждому символу, инструкция и т. д. Например, двоичная строка из восьми битов может представлять любое из 256 возможных значений и, следовательно, может представлять множество различных элементов. Хотя с другими языками преобразование строки в ее двоичную запись не так быстро и просто с такими языками, как Python или C ++ (используя bitset), это все еще достижимо с 3 или 4 строками кода.

В этой статье вы узнаете, как преобразовать строку в ее двоичное значение и двоичное значение в удобочитаемую строку, используя 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: "010011010110111101110011011101  0000100000011100000111010101100010011011000110100101100011001000   000110010001101111011011010110000101101001011011100010000001110011011011110110011001110100011101110110000101110010011001010010000001101001011100110010000001100110011100100110010101100101001011000010000001100001011101000010000001101100011001010                         1100001011100110111010000100000011000010111010000100     000011001100110100101110010011100110   11101000010000001100111011011000110000101101110011000110110010100101110",
text: "Most public domain software is free, at least at first glance."
},
{
binary: "010101000110100     00110111101110011011001010010000001110111011010000110111100100000011001000110111 1001000000110111 00110111101110100001000000111010101101110011001000110010101110010011100110111010001100001011011100110010000100 00001010101011011100110100101111000001000000110000101110010011001010010000001100011011011110110111001100100011001010110110101101110011001010110  0100001000000111010001101111001000000111001001100101011010010110111001110110011001010110111001 110100 00100000011010010111010000101100001000000111000001101111011011110111001001101100011110010010111000100000001011010010110100100000010010000110010101101110011100100111100    10010000001010011011100000110010101101110011000110110010101110010",
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 011100    11 00100000 00111001 00111000 00100101 00100000 01100110 01110101 01101100 01101  100 00100000 00101110 00101110 00101110 00100000 01110000 01101100 01100101 01100001 01110011 01100101 00100000 01100100 01100101 01101100 01100101 01110100 01100101 00100000 01100001 0110 1110 011110  01 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");

Но как работает этот код? Предоставленная строка 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 string
processedBinaryString = 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 string
if(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} passes
Test ${1} passes
Test ${2} passes
Test ${3} passes
Test ${4} passes
Test suite succesfully executed with no errors

Со стандартным бенчмарком, выполненным на персональном компьютере, со следующими характеристиками:

  • 64-разрядная версия Windows 10 Pro (10.0, сборка 14393) — версия Chrome 56.0.2924.87 (64-разрядная версия)
  • Процессор Intel (R) Core (TM) i7-7700 @ 3,60 ГГц (8 процессоров), ~ 3,6 ГГц
  • 8192 МБ ОЗУ

Функция stringToBinary потребовалось 1322,53 миллисекунды для выполнения теста 10K раз, а среднее выполнение для задачи 0,13194000000025843 миллисекунд.

Двоично-читаемая строка

Чтобы преобразовать двоичную строку в читаемую строку, вы можете использовать любой из 2 следующих методов binaryToString или же binaryAgent:

Опция 1

Эта функция удаляет все пустые места строки и разбивает ее на блоки по 8 символов, которые будут объединены в одну строку. Тогда String.fromCharCode сделает свое дело для вас:

function binaryToString(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 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} passes
Test ${1} passes
Test ${2} passes
Test ${3} passes
Test ${4} passes
Test suite succesfully executed with no errors

Вариант 2

Таким же образом, как и первая функция, все пустые места будут удалены, а строка будет разделена на блоки по 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(" ");
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} passes
Test ${1} passes
Test ${2} passes
Test ${3} passes
Test ${4} passes
Test suite succesfully executed with no errors

эталонный тест

Результат стандартного теста (выполненного 10K раз) с персональным компьютером со следующими характеристиками:

  • 64-разрядная версия Windows 10 Pro (10.0, сборка 14393) - версия Chrome 56.0.2924.87 (64-разрядная версия)
  • Процессор Intel (R) Core (TM) i7-7700 @ 3,60 ГГц (8 процессоров), ~ 3,6 ГГц
  • 8192 МБ ОЗУ

сгенерировал следующий результат:

методОбщее время (мс)Среднее время (мс) / задача
binaryToString (вариант 1)1068,54+0,10662899999999208
двоичный агент (вариант 2)1304,80+0,13019300000001968

Как видите, первый метод немного быстрее второго.

Ссылка на основную публикацию
Adblock
detector