Преобразование массива байтов в строку в 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;
}


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



спасибо.



Шао

1001   6  

6 ответов:

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

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";

Edit: Да, ваш нынешний 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

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

String.fromCharCode.apply(null, [102, 111, 111]) равно "фу".

предостережение: работает для массивов короче, чем 65535. МДН документы здесь.

что string2Bin можно записать даже больше лаконично, и без каких-либо петель, чтобы загрузить!

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

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

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('');
}

даже если я немного опоздал, я подумал, что было бы интересно для будущих пользователей поделиться некоторыми однострочными реализациями, которые я сделал с помощью 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))

попробуйте новый 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);

Comments

    Ничего не найдено.