Подтвердить что ты не робот

Преобразование байтового массива в строку в javascript

Как преобразовать массив байтов в строку?

Я нашел эти функции, которые делают обратное:

function string2Bin(s) {
    var b = new Array();
    var last = s.length;

    for (var i = 0; i < last; i++) {
        var d = s.charCodeAt(i);
        if (d < 128)
            b[i] = dec2Bin(d);
        else {
            var c = s.charAt(i);
            alert(c + ' is NOT an ASCII character');
            b[i] = -1;
        }
    }
    return b;
}

function dec2Bin(d) {
    var b = '';

    for (var i = 0; i < 8; i++) {
        b = (d%2) + b;
        d = Math.floor(d/2);
    }

    return b;
}

Но как мне заставить работать другие функции?

Спасибо.

Шао

4b9b3361

Ответ 1

Вам нужно разобрать каждый октет обратно на номер и использовать это значение для получения символа, например:

function bin2String(array) {
  var result = "";
  for (var i = 0; i < array.length; i++) {
    result += String.fromCharCode(parseInt(array[i], 2));
  }
  return result;
}

bin2String(["01100110", "01101111", "01101111"]); // "foo"

// Using your string2Bin function to test:
bin2String(string2Bin("hello world")) === "hello world";

Изменить: Да, ваш текущий string2Bin можно записать более коротко:

function string2Bin(str) {
  var result = [];
  for (var i = 0; i < str.length; i++) {
    result.push(str.charCodeAt(i).toString(2));
  }
  return result;
}

Но, посмотрев на связанную с документацией, я думаю, что метод setBytesParameter ожидает, что массив blob содержит десятичные числа, а не битовую строку, поэтому вы можете написать что-то вроде этого:

function string2Bin(str) {
  var result = [];
  for (var i = 0; i < str.length; i++) {
    result.push(str.charCodeAt(i));
  }
  return result;
}

function bin2String(array) {
  return String.fromCharCode.apply(String, array);
}

string2Bin('foo'); // [102, 111, 111]
bin2String(string2Bin('foo')) === 'foo'; // true

Ответ 2

Просто apply ваш массив байтов до String.fromCharCode. Например

String.fromCharCode.apply(null, [102, 111, 111])  равно 'foo'.

Предостережение: работает для массивов короче 65535. MDN docs здесь.

Ответ 3

Эта строка2Bin может быть написана еще более лаконично и без каких-либо циклов для загрузки!

function string2Bin ( str ) {
    return str.split("").map( function( val ) { 
        return val.charCodeAt( 0 ); 
    } );
}

Ответ 4

Я думаю, что это было бы более эффективно:

function toBinString (arr) {
    var uarr = new Uint8Array(arr.map(function(x){return parseInt(x,2)}));
    var strings = [], chunksize = 0xffff;
    // There is a maximum stack size. We cannot call String.fromCharCode with as many arguments as we want
    for (var i=0; i*chunksize < uarr.length; i++){
        strings.push(String.fromCharCode.apply(null, uarr.subarray(i*chunksize, (i+1)*chunksize)));
    }
    return strings.join('');
}

Ответ 5

Попробуйте новый API кодирования текста:

// create an array view of some valid bytes
let bytesView = new Uint8Array([104, 101, 108, 108, 111]);

console.log(bytesView);

// convert bytes to string
// encoding can be specfied, defaults to utf-8 which is ascii.
let str = new TextDecoder().decode(bytesView); 

console.log(str);

// convert string to bytes
// encoding can be specfied, defaults to utf-8 which is ascii.
let bytes2 = new TextEncoder().encode(str);

// look, they're the same!
console.log(bytes2);
console.log(bytesView);

Ответ 6

Даже если я немного опоздал, я подумал, что будущим пользователям было бы интересно поделиться некоторыми реализациями с одной строкой, которые я использовал с ES6.

Одна вещь, которую я считаю важной в зависимости от вашей среды и/или того, что вы будете делать с данными, - это сохранение полного байтового значения. Например, (5).toString(2) предоставит вам 101, но полное бинарное преобразование на самом деле 00000101, и поэтому вам может понадобиться создать реализацию leftPad, чтобы заполнить строковый байт ведущими нулями. Но вам это может вообще не понадобиться, как показали другие ответы.

Если вы запустите приведенный ниже фрагмент кода, вы увидите, что первый вывод представляет собой преобразование строки abc в массив байтов и сразу после этого повторное преобразование указанного массива в соответствующую строку.

// For each byte in our array, retrieve the char code value of the binary value
const binArrayToString = array => array.map(byte => String.fromCharCode(parseInt(byte, 2))).join('')

// Basic left pad implementation to ensure string is on 8 bits
const leftPad = str => str.length < 8 ? (Array(8).join('0') + str).slice(-8) : str

// For each char of the string, get the int code and convert it to binary. Ensure 8 bits.
const stringToBinArray = str => str.split('').map(c => leftPad(c.charCodeAt().toString(2)))

const array = stringToBinArray('abc')

console.log(array)
console.log(binArrayToString(array))

Ответ 7

Строка в байтовый массив: "FooBar".split('').map(c => c.charCodeAt(0));

Массив байтов в строку: [102, 111, 111, 98, 97, 114].map(c => String.fromCharCode(c)).join('');

Ответ 8

Не найдено ни одного решения, которое бы работало с символами UTF-8. String.fromCharCode хорош, пока вы не встретите 2-байтовый символ.

Например, Hüser будет выглядеть как [0x44,0x61,0x6e,0x69,0x65,0x6c,0x61,0x20,0x48,0xc3,0xbc,0x73,0x65,0x72]

Но если вы String.fromCharCode через String.fromCharCode вас будет Hüser, поскольку каждый байт будет преобразован в символ отдельно.

Решение

В настоящее время я использую следующее решение:

function pad(n) { return (n.length < 2 ? '0' + n : n); }
function decodeUtf8(data) {
  return decodeURIComponent(
    data.map(byte => ('%' + pad(byte.toString(16)))).join('')
  );
}

Ответ 9

У меня были некоторые расшифрованные массивы байтов с символами заполнения и другие вещи, которые мне не нужны, поэтому я сделал это (вероятно, не идеально, но это работает для моего ограниченного использования)

var junk = String.fromCharCode.apply(null, res).split('').map(char => char.charCodeAt(0) <= 127 && char.charCodeAt(0) >= 32 ? char : '').join('');

Ответ 10

Слишком поздно, чтобы ответить, но если ваш ввод в виде байтов ASCII, то вы можете попробовать это решение:

function convertArrToString(rArr){
 //Step 1: Convert each element to character
 let tmpArr = new Array();
 rArr.forEach(function(element,index){
    tmpArr.push(String.fromCharCode(element));
});
//Step 2: Return the string by joining the elements
return(tmpArr.join(""));
}

function convertArrToHexNumber(rArr){
  return(parseInt(convertArrToString(rArr),16));
}