Uint8Array menjadi string dalam Javascript

122

Saya memiliki beberapa data yang dikodekan UTF-8 yang hidup dalam berbagai elemen Uint8Array dalam Javascript. Apakah ada cara yang efisien untuk memecahkan kode ini ke string javascript biasa (saya yakin Javascript menggunakan Unicode 16 bit)? Saya tidak ingin menambahkan satu karakter pada saat itu karena rangkaian string akan menjadi intensif CPU.

Jack Wester
sumber
Tidak yakin apakah itu akan berhasil, tetapi saya gunakan u8array.toString()saat membaca file dari BrowserFS yang mengekspos objek Uint8Array saat Anda memanggil fs.readFile.
jcubic
1
@jcubic bagi saya, toStringpada Uint8Arraypengembalian nomor dipisahkan koma seperti "91,50,48,49,57,45"(Chrome 79)
Kolen

Jawaban:

171

TextEncoderdan TextDecoderdari standar Encoding , yang di-polyfill oleh pustaka stringencoding , mengkonversi antara string dan ArrayBuffers:

var uint8array = new TextEncoder("utf-8").encode("¢");
var string = new TextDecoder("utf-8").decode(uint8array);
Vincent Scheib
sumber
40
Untuk siapa saja yang malas seperti saya npm install text-encoding,, var textEncoding = require('text-encoding'); var TextDecoder = textEncoding.TextDecoder;. Tidak, terima kasih.
Evan Hu
16
berhati-hatilah dengan pustaka penyandian teks npm, penganalisis paket webpack menunjukkan bahwa pustaka itu BESAR
wayofthefuture
3
@VincentScheib Browser menghapus dukungan untuk format lain kecuali utf-8. Jadi, TextEncoderargumennya tidak perlu!
tripulse
1
nodejs.org/api/string_decoder.html dari contoh: const {StringDecoder} = require ('string_decoder'); decoder const = new StringDecoder ('utf8'); const cent = Buffer.from ([0xC2, 0xA2]); console.log (decoder.write (cent));
curist
4
Perhatikan bahwa Node.js menambahkan TextEncoder/ TextDecoderAPI di v11, jadi tidak perlu menginstal paket tambahan jika Anda hanya menargetkan versi Node saat ini.
Loilo
42

Ini harus bekerja:

// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt

/* utf.js - UTF-8 <=> UTF-16 convertion
 *
 * Copyright (C) 1999 Masanao Izumo <[email protected]>
 * Version: 1.0
 * LastModified: Dec 25 1999
 * This library is free.  You can redistribute it and/or modify it.
 */

function Utf8ArrayToStr(array) {
    var out, i, len, c;
    var char2, char3;

    out = "";
    len = array.length;
    i = 0;
    while(i < len) {
    c = array[i++];
    switch(c >> 4)
    { 
      case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
        // 0xxxxxxx
        out += String.fromCharCode(c);
        break;
      case 12: case 13:
        // 110x xxxx   10xx xxxx
        char2 = array[i++];
        out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
        break;
      case 14:
        // 1110 xxxx  10xx xxxx  10xx xxxx
        char2 = array[i++];
        char3 = array[i++];
        out += String.fromCharCode(((c & 0x0F) << 12) |
                       ((char2 & 0x3F) << 6) |
                       ((char3 & 0x3F) << 0));
        break;
    }
    }

    return out;
}

Ini agak lebih bersih sebagai solusi lain karena tidak menggunakan peretasan atau bergantung pada fungsi JS Browser, misalnya berfungsi juga di lingkungan JS lainnya.

Lihat demo JSFiddle .

Lihat juga pertanyaan terkait: di sini dan di sini

Albert
sumber
6
Ini sepertinya agak lambat. Tapi satu-satunya cuplikan di alam semesta yang saya temukan berhasil. Temuan bagus + adopsi!
Redsandro
6
Saya tidak mengerti mengapa ini tidak memiliki lebih banyak suara positif. Tampaknya sangat masuk akal untuk mengikuti konvensi UTF-8 untuk cuplikan kecil. Async Blob + Filereader berfungsi baik untuk teks besar seperti yang ditunjukkan orang lain.
DanHorner
2
Pertanyaannya adalah bagaimana melakukan ini tanpa penggabungan string
Jack Wester
5
Berfungsi dengan baik, kecuali itu tidak menangani 4+ urutan byte, misalnya fromUTF8Array([240,159,154,133])ternyata kosong (sementara fromUTF8Array([226,152,131])→"☃")
unhammer
1
Mengapa kasus 8, 9, 10 dan 11 dikecualikan? Ada alasan khusus? Dan kasus 15 juga dimungkinkan, bukan? 15 (1111) akan menunjukkan 4 byte digunakan, bukan?
RaR
31

Inilah yang saya gunakan:

var str = String.fromCharCode.apply(null, uint8Arr);
dlchambers.dll
sumber
7
Dari doc , ini sepertinya tidak memecahkan kode UTF8.
Albert
29
Ini akan menghasilkan RangeErrorteks yang lebih besar. "Ukuran tumpukan panggilan maksimum terlampaui"
Redsandro
1
Jika Anda mengonversi Uint8Arrays besar menjadi string biner dan mendapatkan RangeError, lihat fungsi Uint8ToString dari stackoverflow.com/a/12713326/471341 .
yonran
IE 11 melempar SCRIPT28: Out of stack spaceketika saya memberinya 300 + k karakter, atau RangeErroruntuk Chrome 39. Firefox 33 baik-baik saja. 100 + k berjalan baik dengan ketiganya.
Sheepy
Ini tidak memberikan hasil yang benar dari contoh karakter unicode di en.wikipedia.org/wiki/UTF-8 . misalnya String.fromCharCode.apply (null, new Uint8Array ([0xc2, 0xa2])) tidak menghasilkan ¢.
Vincent Scheib
16

Ditemukan di salah satu aplikasi sampel Chrome, meskipun ini dimaksudkan untuk blok data yang lebih besar di mana Anda setuju dengan konversi asinkron.

/**
 * Converts an array buffer to a string
 *
 * @private
 * @param {ArrayBuffer} buf The buffer to convert
 * @param {Function} callback The function to call when conversion is complete
 */
function _arrayBufferToString(buf, callback) {
  var bb = new Blob([new Uint8Array(buf)]);
  var f = new FileReader();
  f.onload = function(e) {
    callback(e.target.result);
  };
  f.readAsText(bb);
}
Will Scott
sumber
2
Seperti yang Anda katakan, ini akan bekerja sangat buruk kecuali buffer yang akan dikonversi benar-benar sangat besar. UTF-8 sinkron ke wchar percakapan dari string sederhana (katakanlah 10-40 byte) diimplementasikan dalam, katakanlah, V8 harus jauh kurang dari satu mikrodetik sedangkan saya akan menebak bahwa kode Anda akan membutuhkan ratusan kali itu. Terima kasih semuanya.
Jack Wester
15

Dalam Node " Bufferinstance juga Uint8Arrayinstance ", jadi buf.toString()berfungsi dalam kasus ini.

kpowz.dll
sumber
Sangat cocok untuk saya. Dan sangat sederhana! Namun ternyata Uint8Array memiliki metode toString ().
malapetaka
Sederhana dan elegan, tidak disadari Bufferjuga Uint8Array. Terima kasih!
LeOn - Han Li
1
@doom Di sisi browser, Uint8Array.toString () tidak akan mengkompilasi utf-8 string, ini akan mencantumkan nilai numerik dalam array. Jadi jika yang Anda miliki adalah Uint8Array dari sumber lain yang bukan merupakan Buffer, Anda perlu membuatnya untuk melakukan keajaiban:Buffer.from(uint8array).toString('utf-8')
Joachim Lous
12

Solusi yang diberikan oleh Albert berfungsi dengan baik selama fungsi yang disediakan jarang dipanggil dan hanya digunakan untuk array berukuran sedang, jika tidak maka akan sangat tidak efisien. Berikut adalah solusi JavaScript vanilla yang disempurnakan yang berfungsi untuk Node dan browser serta memiliki keuntungan sebagai berikut:

• Bekerja secara efisien untuk semua ukuran array oktet

• Tidak menghasilkan string buang perantara

• Mendukung karakter 4-byte pada mesin JS modern (jika tidak, "?" Diganti)

var utf8ArrayToStr = (function () {
    var charCache = new Array(128);  // Preallocate the cache for the common single byte chars
    var charFromCodePt = String.fromCodePoint || String.fromCharCode;
    var result = [];

    return function (array) {
        var codePt, byte1;
        var buffLen = array.length;

        result.length = 0;

        for (var i = 0; i < buffLen;) {
            byte1 = array[i++];

            if (byte1 <= 0x7F) {
                codePt = byte1;
            } else if (byte1 <= 0xDF) {
                codePt = ((byte1 & 0x1F) << 6) | (array[i++] & 0x3F);
            } else if (byte1 <= 0xEF) {
                codePt = ((byte1 & 0x0F) << 12) | ((array[i++] & 0x3F) << 6) | (array[i++] & 0x3F);
            } else if (String.fromCodePoint) {
                codePt = ((byte1 & 0x07) << 18) | ((array[i++] & 0x3F) << 12) | ((array[i++] & 0x3F) << 6) | (array[i++] & 0x3F);
            } else {
                codePt = 63;    // Cannot convert four byte code points, so use "?" instead
                i += 3;
            }

            result.push(charCache[codePt] || (charCache[codePt] = charFromCodePt(codePt)));
        }

        return result.join('');
    };
})();
Bob Arlof
sumber
2
Solusi terbaik di sini, karena juga menangani karakter 4-byte (misalnya emoji) Terima kasih!
Fiffy
1
dan apa kebalikan dari ini?
simbo1905
6

Lakukan apa yang dikatakan @Sudhir, dan kemudian untuk mengeluarkan String dari daftar angka yang dipisahkan koma, gunakan:

for (var i=0; i<unitArr.byteLength; i++) {
            myString += String.fromCharCode(unitArr[i])
        }

Ini akan memberi Anda string yang Anda inginkan, jika masih relevan

shuki
sumber
Maaf, Anda belum memperhatikan perasaan terakhir yang Anda katakan tidak ingin menambah karakter satu per satu. Semoga ini membantu orang lain yang tidak memiliki masalah dengan penggunaan CPU.
shuki
14
Ini tidak melakukan decoding UTF8.
Albert
Bahkan lebih pendek: String.fromCharCode.apply(null, unitArr);. Seperti yang disebutkan, ini tidak menangani pengkodean UTF8, tetapi terkadang ini cukup sederhana jika Anda hanya memerlukan dukungan ASCII tetapi tidak memiliki akses ke TextEncoder / TextDecoder.
Ravenstine
Jawabannya menyebutkan @Sudhir tetapi saya mencari halamannya dan sekarang menemukan jawaban seperti itu. Jadi akan lebih baik sebaris apa pun yang dia katakan
Joakim
Ini akan memiliki kinerja yang buruk pada string yang lebih panjang. Jangan gunakan operator + pada string.
Maks
3

Jika Anda tidak dapat menggunakan TextDecoder API karena tidak didukung di IE :

  1. Anda dapat menggunakan polyfill FastestSmallestTextEncoderDecoder yang direkomendasikan oleh situs web Mozilla Developer Network ;
  2. Anda dapat menggunakan fungsi ini yang juga tersedia di situs web MDN :

function utf8ArrayToString(aBytes) {
    var sView = "";
    
    for (var nPart, nLen = aBytes.length, nIdx = 0; nIdx < nLen; nIdx++) {
        nPart = aBytes[nIdx];
        
        sView += String.fromCharCode(
            nPart > 251 && nPart < 254 && nIdx + 5 < nLen ? /* six bytes */
                /* (nPart - 252 << 30) may be not so safe in ECMAScript! So...: */
                (nPart - 252) * 1073741824 + (aBytes[++nIdx] - 128 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
            : nPart > 247 && nPart < 252 && nIdx + 4 < nLen ? /* five bytes */
                (nPart - 248 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
            : nPart > 239 && nPart < 248 && nIdx + 3 < nLen ? /* four bytes */
                (nPart - 240 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
            : nPart > 223 && nPart < 240 && nIdx + 2 < nLen ? /* three bytes */
                (nPart - 224 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
            : nPart > 191 && nPart < 224 && nIdx + 1 < nLen ? /* two bytes */
                (nPart - 192 << 6) + aBytes[++nIdx] - 128
            : /* nPart < 127 ? */ /* one byte */
                nPart
        );
    }
    
    return sView;
}

let str = utf8ArrayToString([50,72,226,130,130,32,43,32,79,226,130,130,32,226,135,140,32,50,72,226,130,130,79]);

// Must show 2H₂ + O₂ ⇌ 2H₂O
console.log(str);

Rosberg Linhares
sumber
2

Coba fungsi ini,

var JsonToArray = function(json)
{
    var str = JSON.stringify(json, null, 0);
    var ret = new Uint8Array(str.length);
    for (var i = 0; i < str.length; i++) {
        ret[i] = str.charCodeAt(i);
    }
    return ret
};

var binArrayToJson = function(binArray)
{
    var str = "";
    for (var i = 0; i < binArray.length; i++) {
        str += String.fromCharCode(parseInt(binArray[i]));
    }
    return JSON.parse(str)
}

sumber: https://gist.github.com/tomfa/706d10fed78c497731ac , pujian untuk Tomfa

serdarsenay.dll
sumber
2

Saya frustrasi melihat bahwa orang tidak menunjukkan cara melakukan dua arah atau menunjukkan bahwa segala sesuatunya berfungsi pada string UTF8 yang tidak sepele. Saya menemukan posting di codereview.stackexchange.com yang memiliki beberapa kode yang berfungsi dengan baik. Saya menggunakannya untuk mengubah rune kuno menjadi byte, untuk menguji beberapa crypo pada byte, lalu mengubahnya kembali menjadi string. Kode yang berfungsi ada di github di sini . Saya mengganti nama metode untuk kejelasan:

// https://codereview.stackexchange.com/a/3589/75693
function bytesToSring(bytes) {
    var chars = [];
    for(var i = 0, n = bytes.length; i < n;) {
        chars.push(((bytes[i++] & 0xff) << 8) | (bytes[i++] & 0xff));
    }
    return String.fromCharCode.apply(null, chars);
}

// https://codereview.stackexchange.com/a/3589/75693
function stringToBytes(str) {
    var bytes = [];
    for(var i = 0, n = str.length; i < n; i++) {
        var char = str.charCodeAt(i);
        bytes.push(char >>> 8, char & 0xFF);
    }
    return bytes;
}

Pengujian unit menggunakan string UTF-8 ini:

    // http://kermitproject.org/utf8.html
    // From the Anglo-Saxon Rune Poem (Rune version) 
    const secretUtf8 = `ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ
ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾ
ᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ᛬`;

Perhatikan bahwa panjang string hanya 117 karakter tetapi panjang byte, saat dikodekan, adalah 234.

Jika saya menghapus komentar baris console.log, saya dapat melihat bahwa string yang didekodekan adalah string yang sama yang dikodekan (dengan byte yang melewati algoritme berbagi rahasia Shamir!):

uji unit yang mendemonstrasikan encoding dan decoding

simbo1905
sumber
String.fromCharCode.apply(null, chars)akan error jika charsterlalu besar.
Marc J. Schmidt
apakah itu ada di mana-mana atau hanya di beberapa browser dan apakah itu didokumentasikan?
simbo1905
misalnya di sini developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… But beware: by using apply this way, you run the risk of exceeding the JavaScript engine's argument length limit. The consequences of applying a function with too many arguments (that is, more than tens of thousands of arguments) varies across engines. (The JavaScriptCore engine has hard-coded argument limit of 65536.
Marc J. Schmidt
1

Di NodeJS, kami memiliki Buffer yang tersedia, dan konversi string dengannya sangat mudah. Lebih baik, mudah untuk mengubah Uint8Array menjadi Buffer. Coba kode ini, ini berfungsi untuk saya di Node untuk pada dasarnya setiap konversi yang melibatkan Uint8Arrays:

let str = Buffer.from(uint8arr.buffer).toString();

Kami baru saja mengekstrak ArrayBuffer dari Uint8Array dan kemudian mengubahnya menjadi Buffer NodeJS yang tepat. Kemudian kami mengonversi Buffer menjadi string (Anda dapat memasukkan pengkodean hex atau base64 jika Anda mau).

Jika kami ingin mengonversi kembali ke Uint8Array dari string, maka kami akan melakukan ini:

let uint8arr = new Uint8Array(Buffer.from(str));

Ketahuilah bahwa jika Anda mendeklarasikan pengkodean seperti base64 saat mengonversi ke string, Anda harus menggunakan Buffer.from(str, "base64")jika Anda menggunakan base64, atau pengkodean lain apa pun yang Anda gunakan.

Ini tidak akan berfungsi di browser tanpa modul! Buffer NodeJS tidak ada di browser, jadi metode ini tidak akan berfungsi kecuali Anda menambahkan fungsionalitas Buffer ke browser. Itu sebenarnya cukup mudah dilakukan, cukup gunakan modul seperti ini , yang kecil dan cepat!

Arktik_Hen7
sumber
0
class UTF8{
static encode(str:string){return new UTF8().encode(str)}
static decode(data:Uint8Array){return new UTF8().decode(data)}

private EOF_byte:number = -1;
private EOF_code_point:number = -1;
private encoderError(code_point) {
    console.error("UTF8 encoderError",code_point)
}
private decoderError(fatal, opt_code_point?):number {
    if (fatal) console.error("UTF8 decoderError",opt_code_point)
    return opt_code_point || 0xFFFD;
}
private inRange(a:number, min:number, max:number) {
    return min <= a && a <= max;
}
private div(n:number, d:number) {
    return Math.floor(n / d);
}
private stringToCodePoints(string:string) {
    /** @type {Array.<number>} */
    let cps = [];
    // Based on http://www.w3.org/TR/WebIDL/#idl-DOMString
    let i = 0, n = string.length;
    while (i < string.length) {
        let c = string.charCodeAt(i);
        if (!this.inRange(c, 0xD800, 0xDFFF)) {
            cps.push(c);
        } else if (this.inRange(c, 0xDC00, 0xDFFF)) {
            cps.push(0xFFFD);
        } else { // (inRange(c, 0xD800, 0xDBFF))
            if (i == n - 1) {
                cps.push(0xFFFD);
            } else {
                let d = string.charCodeAt(i + 1);
                if (this.inRange(d, 0xDC00, 0xDFFF)) {
                    let a = c & 0x3FF;
                    let b = d & 0x3FF;
                    i += 1;
                    cps.push(0x10000 + (a << 10) + b);
                } else {
                    cps.push(0xFFFD);
                }
            }
        }
        i += 1;
    }
    return cps;
}

private encode(str:string):Uint8Array {
    let pos:number = 0;
    let codePoints = this.stringToCodePoints(str);
    let outputBytes = [];

    while (codePoints.length > pos) {
        let code_point:number = codePoints[pos++];

        if (this.inRange(code_point, 0xD800, 0xDFFF)) {
            this.encoderError(code_point);
        }
        else if (this.inRange(code_point, 0x0000, 0x007f)) {
            outputBytes.push(code_point);
        } else {
            let count = 0, offset = 0;
            if (this.inRange(code_point, 0x0080, 0x07FF)) {
                count = 1;
                offset = 0xC0;
            } else if (this.inRange(code_point, 0x0800, 0xFFFF)) {
                count = 2;
                offset = 0xE0;
            } else if (this.inRange(code_point, 0x10000, 0x10FFFF)) {
                count = 3;
                offset = 0xF0;
            }

            outputBytes.push(this.div(code_point, Math.pow(64, count)) + offset);

            while (count > 0) {
                let temp = this.div(code_point, Math.pow(64, count - 1));
                outputBytes.push(0x80 + (temp % 64));
                count -= 1;
            }
        }
    }
    return new Uint8Array(outputBytes);
}

private decode(data:Uint8Array):string {
    let fatal:boolean = false;
    let pos:number = 0;
    let result:string = "";
    let code_point:number;
    let utf8_code_point = 0;
    let utf8_bytes_needed = 0;
    let utf8_bytes_seen = 0;
    let utf8_lower_boundary = 0;

    while (data.length > pos) {
        let _byte = data[pos++];

        if (_byte == this.EOF_byte) {
            if (utf8_bytes_needed != 0) {
                code_point = this.decoderError(fatal);
            } else {
                code_point = this.EOF_code_point;
            }
        } else {
            if (utf8_bytes_needed == 0) {
                if (this.inRange(_byte, 0x00, 0x7F)) {
                    code_point = _byte;
                } else {
                    if (this.inRange(_byte, 0xC2, 0xDF)) {
                        utf8_bytes_needed = 1;
                        utf8_lower_boundary = 0x80;
                        utf8_code_point = _byte - 0xC0;
                    } else if (this.inRange(_byte, 0xE0, 0xEF)) {
                        utf8_bytes_needed = 2;
                        utf8_lower_boundary = 0x800;
                        utf8_code_point = _byte - 0xE0;
                    } else if (this.inRange(_byte, 0xF0, 0xF4)) {
                        utf8_bytes_needed = 3;
                        utf8_lower_boundary = 0x10000;
                        utf8_code_point = _byte - 0xF0;
                    } else {
                        this.decoderError(fatal);
                    }
                    utf8_code_point = utf8_code_point * Math.pow(64, utf8_bytes_needed);
                    code_point = null;
                }
            } else if (!this.inRange(_byte, 0x80, 0xBF)) {
                utf8_code_point = 0;
                utf8_bytes_needed = 0;
                utf8_bytes_seen = 0;
                utf8_lower_boundary = 0;
                pos--;
                code_point = this.decoderError(fatal, _byte);
            } else {
                utf8_bytes_seen += 1;
                utf8_code_point = utf8_code_point + (_byte - 0x80) * Math.pow(64, utf8_bytes_needed - utf8_bytes_seen);

                if (utf8_bytes_seen !== utf8_bytes_needed) {
                    code_point = null;
                } else {
                    let cp = utf8_code_point;
                    let lower_boundary = utf8_lower_boundary;
                    utf8_code_point = 0;
                    utf8_bytes_needed = 0;
                    utf8_bytes_seen = 0;
                    utf8_lower_boundary = 0;
                    if (this.inRange(cp, lower_boundary, 0x10FFFF) && !this.inRange(cp, 0xD800, 0xDFFF)) {
                        code_point = cp;
                    } else {
                        code_point = this.decoderError(fatal, _byte);
                    }
                }

            }
        }
        //Decode string
        if (code_point !== null && code_point !== this.EOF_code_point) {
            if (code_point <= 0xFFFF) {
                if (code_point > 0)result += String.fromCharCode(code_point);
            } else {
                code_point -= 0x10000;
                result += String.fromCharCode(0xD800 + ((code_point >> 10) & 0x3ff));
                result += String.fromCharCode(0xDC00 + (code_point & 0x3ff));
            }
        }
    }
    return result;
}

`

terran
sumber
Tambahkan beberapa deskripsi untuk menjawab. @terran
Rohit Poudel
-3

Saya menggunakan cuplikan Ketikan ini:

function UInt8ArrayToString(uInt8Array: Uint8Array): string
{
    var s: string = "[";
    for(var i: number = 0; i < uInt8Array.byteLength; i++)
    {
        if( i > 0 )
            s += ", ";
        s += uInt8Array[i];
    }
    s += "]";
    return s;
}

Hapus anotasi jenis jika Anda memerlukan versi JavaScript. Semoga ini membantu!

Bernd Paradies
sumber
3
OP meminta untuk tidak menambahkan karakter satu per satu. Juga, dia tidak ingin menampilkannya sebagai representasi string dari daftar melainkan hanya sebagai string. Juga, ini tidak mengubah karakter menjadi string tetapi menampilkan nomornya.
Albert