Я создал программу JavaScript для преобразования строки в двоичный файл.
Input: StackOverflow
Output: 1010011 1110100 1100001 1100011 1101011
1001111 1110110 1100101 1110010 1100110
1101100 1101111 1110111
Теперь я хочу преобразовать этот двоичный файл обратно в строку, как показано ниже. Есть ли способ сделать это?
Input: 1010011 1110100 1100001 1100011 1101011
1001111 1110110 1100101 1110010 1100110
1101100 1101111 1110111
Output StackOverflow
Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте String.fromCharCode() и parseInt( , 2) следующим образом:
const binary = `1010011 1110100 1100001 1100011 1101011
1001111 1110110 1100101 1110010 1100110
1101100 1101111 1110111`;
const outputStr = binary
// split string into an array of base 2 (binary) UTF-16 chars
.split(' ')
// map every binary char to a UTF-16 number of base 10
// and then get the string representation of that UTF-16 number
.map(bin => String.fromCharCode(parseInt(bin, 2)))
// join the array back to a single string
.join('');
console.info(outputStr);String.fromCharCode(number) вернет строку из символьного кода UTF-16.parseInt(binary , 2) преобразует строку количество с основанием 2 в число с основанием 10.Поскольку функция String.fromCharCode() принимает несколько символов в качестве параметров, вы также можете использовать Оператор спреда (...) следующим образом:
const binary = `1010011 1110100 1100001 1100011 1101011
1001111 1110110 1100101 1110010 1100110
1101100 1101111 1110111`;
const outputStr = String.fromCharCode(
...binary.split(' ').map(bin => parseInt(bin, 2))
)
console.info(outputStr);Поскольку этот ответ со временем получает больше трафика, я также собираюсь добавить решение, чтобы сделать это и наоборот... на всякий случай:
const str = `StackOverflow`;
const outputStr = str.split('') // split in single chars
.map(c => c.charCodeAt(0) // get the UTF-16 code (10 base)
.toString(2)) // transform it back to a string (2 base)
.join(' ') // make single string from array
console.info(outputStr);Хорошо, братан, все понял, но что означает кодовая корзина, которая используется в первом примере?
@SubhaJeetSikdar bin — это имя параметра функции, которую вы передаете на карту. Карта функций принимает стрелочную функцию с одним параметром, которому вы можете дать любое имя. bin по сути тоже можно назвать someVariable. Сама переменная представляет один элемент из массива. Функция карты выполняет итерацию по всем элементам массива и применяет функцию стрелки (varName => parseInt(varName , 2)) к каждому из них.
Бро, что означает знак `?
Они называются Литералы шаблонов. Проверьте их, они действительно полезны в JavaScript. @SubhaJeetSikdar
NB: если вы поместите символы Unicode через это, вы увидите двоичные числа длиной до 16 бит.
const binary = `1010011 1110100 1100001 1100011 1101011
1001111 1110110 1100101 1110010 1100110
1101100 1101111 1110111`;
const inputStr = binary.split(' ');
const output = [];
inputStr.forEach(item => {output.push(String.fromCharCode(parseInt(item, 2)))});
console.info(output.join(''));минус за использование forEach() с push вместо .map . Вы скопировали принятый ответ и сделали его хуже.
@Alnitak просто альтернатива. Имеет смысл использовать карту, хотя
использование foreach/push вместо карты — это антишаблон. Для этого нет веской причины, и это было бы минусом в любом обзоре кода.
str = "01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111"
function binaryAgent(str) {
return str.split(' ').map(letter=>String.fromCharCode(parseInt(letter, 2))).join('')
}
console.info(binaryAgent(str))Сначала мы используем метод .split() для преобразования строки в массив с использованием ' ' (символ пробела)
После этого мы используем метод цикла высокого порядка .map() для перебора каждой буквы двоичного кода.
Для каждой буквы двоичного кода мы используем String.fromCharCode() для parseInt('каждая буква',2)=>, которая преобразует двоичную строку в число. Второй аргумент «2» вызываемого метода parseInt (основание счисления) определяет, какую систему счисления мы хотим использовать.
Наконец, мы можем снова соединить управляемый массив, вызвав метод join(''), но на этот раз мы не используем пробел между
=======
Пожалуйста, добавьте пояснения к вашему ответу, чтобы аудитория могла понять работу кода.
а также объясните, как он улучшает принятый ответ (подсказка: это не так, потому что, кроме включения в функцию, код идентичен, за исключением имен переменных).
Вы можете проверить решение здесь: Скрыть двоичный файл в текст с помощью javascript