Conversione di array di byte in stringa in javascript

Come posso convertire un array di byte in una stringa?

Ho trovato queste funzioni che fanno il contrario:

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

Ma come faccio a far funzionare le funzioni in senso contrario?

Grazie.

Shao

Hai bisogno di analizzare ogni ottetto tornando al numero, e usa quel valore per ottenere un personaggio, qualcosa del genere:

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

Modifica: Sì, il tuo string2Bin corrente può essere scritto più brevemente:

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

Ma guardando la documentazione che hai collegato, penso che il metodo setBytesParameter aspetta che l'array blob contenga i numeri decimali, non una stringa di bit , quindi potresti scrivere qualcosa come questo:

 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 

Basta apply tuo array di byte a String.fromCharCode . Per esempio

String.fromCharCode.apply(null, [102, 111, 111]) uguale a “foo”.

Avvertenza: funziona per array più brevi di 65535. MDN docs qui .

Quella stringa2Bin può essere scritta anche più succintamente, e senza loop, per l’avvio!

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

Penso che questo sarebbe più efficiente:

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

Anche se sono un po ‘in ritardo, ho pensato che sarebbe stato interessante per gli utenti futuri condividere alcune implementazioni one-liner che ho fatto usando ES6.

Una cosa che considero importante in base al proprio ambiente o / e a cosa farai con i dati è di preservare il valore dell’intero byte. Ad esempio, (5).toString(2) ti darà 101 , ma la conversione binaria completa è in realtà 00000101 , ed è per questo che potresti dover creare un’implementazione leftPad per riempire il byte della stringa con gli zeri leftPad . Ma potresti non averne affatto bisogno, come hanno dimostrato altre risposte.

Se si esegue lo snippet di codice seguente, vedrete il primo output come la conversione della stringa abc in una matrice di byte e subito dopo la ri-trasformazione di detta matrice nella sua stringa corrispondente.

 // 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)) 

Prova la nuova API di codifica del testo:

 // 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);