[Javascript] 자바 스크립트에서 바이트 배열을 문자열로 변환


Answers

각 옥텟을 number로 다시 파싱하고 그 값을 사용하여 다음과 같이 문자를 가져와야합니다.

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
Question

바이트 배열을 문자열로 변환하려면 어떻게해야합니까?

나는 역순으로 이러한 기능을 찾았습니다 :

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

하지만 어떻게하면 함수가 다른 방식으로 작동합니까?

감사.

샤오




String.fromCharCode 바이트 배열을 apply 하기 만하면 apply . 예를 들어

String.fromCharCode.apply(null, [102, 111, 111]) 'foo'와 같습니다.

주의 사항 : 배열 65535 미만의 작품. MDN 워드 프로세서 여기 .




조금 늦었음에도 불구하고 ES6을 사용하여 구현 한 일부 라이너 구현을 향후 사용자가 공유하는 것이 흥미로울 것이라고 생각했습니다.

환경에 따라 중요한 것으로 생각하거나 데이터로 수행 할 작업은 전체 바이트 값을 보존하는 것입니다. 예를 들어, (5).toString(2)101 을 제공하지만 완전한 이진 변환은 실제로 00000101 입니다. 따라서 바이트 앞에 0을 채우려면 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))




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