web-dev-qa-db-ja.com

バイト配列を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;
}

しかし、他の方法で機能を機能させるにはどうすればよいですか?

ありがとう。

シャオ

67
user385579

各オクテットを解析して数値に戻し、その値を使用して次のような文字を取得する必要があります。

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配列に10進数が含まれていることを期待していると思います、次のように書くことができます:

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
71
CMS

単にapplyバイト配列をString.fromCharCodeにします。例えば

String.fromCharCode.apply(null, [102, 111, 111])は 'foo'と等しい。

警告:65535より短い配列で動作します。MDNドキュメント ここ

37
Bogdan D

新しいテキストエンコーディング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);
8
James

そのstring2Binは、ブートするためにmore簡潔に、ループなしで書くことができます!

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

私はこれがより効率的だと思う:

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

文字列からバイト配列:"FooBar".split('').map(c => c.charCodeAt(0));

文字列へのバイト配列:[102, 111, 111, 98, 97, 114].map(c => String.fromCharCode(c)).join('');

1
ZaksBack

これは動作するはずです:

String.fromCharCode(...array);

または

String.fromCodePoint(...array)
1
Rouli Freman

少し遅れたとしても、ES6を使用して行ったワンライナーの実装を共有することは、将来のユーザーにとって興味深いと思いました。

ご使用の環境やデータを使用して何をするかに応じて重要だと思うことの1つは、完全なバイト値を保持することです。たとえば、(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))
1
Balthazar

答えるのが遅すぎますが、入力が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));
}
0
indiaaditya

UTF-8文字で機能するソリューションは見つかりませんでした。 String.fromCharCodeは、2バイト文字に出会うまで有効です。

たとえば、Hüser[0x44,0x61,0x6e,0x69,0x65,0x6c,0x61,0x20,0x48,0xc3,0xbc,0x73,0x65,0x72]になります

ただし、String.fromCharCodeを使用して実行すると、各バイトが個別にcharに変換されるため、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('')
  );
}
0
Soul_man

パディング文字やその他の必要のない暗号化されたバイト配列をいくつか持っていたので、これを行いました(おそらく完璧ではありませんが、限られた用途で機能します)

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