바이트 배열을 문자열로 어떻게 변환합니까?
나는 그 반대의 기능을 발견했습니다.
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;
}
그러나 어떻게 다른 방식으로 작동하는 기능을 얻을 수 있습니까?
감사.
Shao
답변
각 옥텟을 숫자로 다시 구문 분석하고 해당 값을 사용하여 다음과 같이 문자를 가져와야합니다.
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
답변
단순히 apply
바이트 배열을String.fromCharCode
. 예를 들면
String.fromCharCode.apply(null, [102, 111, 111])
‘foo’와 같습니다.
주의 사항 : 65535보다 짧은 어레이에서 작동합니다. MDN 문서는 여기 .
답변
새로운 Text Encoding 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);
답변
이것은 작동합니다.
String.fromCharCode(...array);
또는
String.fromCodePoint(...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('');
}
답변
내가 조금 늦더라도 ES6를 사용하여 한 줄짜리 구현을 공유하는 것이 미래의 사용자에게 흥미로울 것이라고 생각했습니다.
환경 또는 데이터로 무엇을 할 것인지에 따라 내가 중요하다고 생각하는 한 가지는 전체 바이트 값을 유지하는 것입니다. 예를 들어 (5).toString(2)
는를 제공 101
하지만 완전한 이진 변환은 실제로 이루어집니다 00000101
.leftPad
집니다. 따라서 문자열 바이트를 선행 0으로 채우는 구현을 . 그러나 다른 답변과 마찬가지로 전혀 필요하지 않을 수도 있습니다.
아래 코드 조각을 실행하면 첫 번째 출력이 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))