2010-07-07 47 views
45

Làm cách nào để chuyển đổi mảng byte thành chuỗi?Chuyển mảng byte thành chuỗi trong javascript

tôi đã tìm thấy những chức năng mà làm ngược lại:

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

Nhưng làm thế nào để tôi có được chức năng làm việc theo cách khác?

Cảm ơn.

Shao

+0

Bạn có muốn chuyển đổi một mảng byte thành một chuỗi, hoặc một mảng của các bit thành một chuỗi? – mcandre

Trả lời

53

Bạn cần phải phân tích mỗi octet trở về con số, và sử dụng giá trị đó để có được một nhân vật, một cái gì đó như thế này:

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: Vâng, hiện tại của bạn string2Bin có thể viết nhanh hơn:

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

Nhưng bằng cách xem tài liệu bạn đã liên kết, tôi nghĩ rằng setBytesParameter phương pháp hy vọng rằng các mảng blob chứa các số thập phân, không phải là một chuỗi chút, vì vậy bạn có thể viết một cái gì đó như thế này:

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 
+0

Cảm ơn phản ứng cực nhanh. Một vài câu hỏi ... 1) Chức năng bin2String của bạn thật ấn tượng - chỉ có 5 dòng mã. Có thể thay đổi hàm string2bin để sử dụng nhiều hàm Javascript hơn để rút ngắn hàm và hàm phụ không? ..... – user385579

+1

2) Lý do tôi cần các chuyển đổi này là vì tôi đang ký một chữ ký và tôi phải chuyển đổi nó để điền vào trường BLOB trong cơ sở dữ liệu. Vấn đề là, trong khi 2 chức năng này hoạt động, có điều gì đó không ổn. Điều chính là khi tôi lấy một BLOB từ cơ sở dữ liệu nó đi vào một đối tượng mảng byte. Tuy nhiên, khi tôi viết BLOB vào cơ sở dữ liệu sau khi chạy nó thông qua hàm ban đầu, nó không phải là một đối tượng mảng byte. Điều này có thể là nguyên nhân gây ra sự cố. Bất kỳ ý tưởng? – user385579

+0

http://dcx.sybase.com/index.html#1101en/ulmbus_en11/ag-apiref-setbytesparameter.html Đây là cú pháp tôi sử dụng để đặt dữ liệu. – user385579

7

Đó string2Bin có thể được viết thậm chí hơn ngắn gọn, và không có bất kỳ vòng lặp, để khởi động!

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

Sẽ tò mò muốn xem liệu có thêm hay không chức năng cuộc gọi làm chậm điều này xuống. – jocull

+24

Nó vẫn có một vòng lặp, nó chỉ ẩn trong bản đồ(). –

3

Tôi nghĩ rằng đây sẽ hiệu quả hơn:

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

Đơn giản chỉ cần apply mảng byte của bạn để String.fromCharCode. Ví dụ:

String.fromCharCode.apply(null, [102, 111, 111]) bằng 'foo'.

Lưu ý: hoạt động đối với mảng ngắn hơn 65535. Tài liệu MDN here.

+0

Điều này đã được chứng minh bằng câu trả lời được chấp nhận 6 năm trước. –

+1

aah, thực sự, tôi đã bỏ lỡ dòng đó. Về cơ bản tôi đang tìm kiếm một lớp lót ngắn và tôi đã loại bỏ câu trả lời dài và chỉnh sửa đó (có thể quá vội vàng). –

+0

Oh okay có ý nghĩa :) –

1

Thậm chí nếu tôi trễ một chút, tôi nghĩ rằng sẽ rất thú vị cho những người dùng trong tương lai chia sẻ một số triển khai một lớp mà tôi đã sử dụng ES6.

Một điều tôi coi là quan trọng tùy thuộc vào môi trường của bạn hoặc/và những gì bạn sẽ làm với dữ liệu là bảo toàn giá trị byte đầy đủ. Ví dụ: (5).toString(2) sẽ cung cấp cho bạn 101, nhưng chuyển đổi nhị phân hoàn chỉnh nằm trong thực tế 00000101 và đó là lý do tại sao bạn có thể cần phải thực hiện triển khai leftPad để lấp đầy chuỗi byte với số 0 đứng đầu. Nhưng bạn có thể không cần nó chút nào, giống như những câu trả lời khác được chứng minh.

Nếu bạn chạy đoạn mã bên dưới, bạn sẽ thấy đầu ra đầu tiên là chuyển đổi chuỗi abc thành mảng byte và ngay sau đó chuyển đổi lại mảng đã nói thành chuỗi tương ứng.

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

Các vấn đề liên quan