Uint8Array zum String in Javascript

121

Ich habe einige UTF-8-codierte Daten, die in einer Reihe von Uint8Array-Elementen in Javascript leben. Gibt es eine effiziente Möglichkeit, diese in eine reguläre Javascript-Zeichenfolge zu dekodieren (ich glaube, Javascript verwendet 16-Bit-Unicode)? Ich möchte nicht jeweils ein Zeichen hinzufügen, da die String-Konzentration zu CPU-intensiv werden würde.

Jack Wester
quelle
Ich bin mir nicht sicher, ob es funktionieren wird, aber ich verwende es u8array.toString()beim Lesen von Dateien aus BrowserFS, die das Uint8Array-Objekt beim Aufrufen verfügbar machen fs.readFile.
Jcubic
1
@jcubic für mich, toStringbei Uint8ArrayRückgabe durch Kommas getrennte Zahlen wie "91,50,48,49,57,45"(Chrome 79)
kolen

Antworten:

170

TextEncoderund TextDecoderaus dem Encoding-Standard , der von der Stringencoding-Bibliothek mehrfach ausgefüllt wird, wird zwischen Strings und ArrayBuffers konvertiert:

var uint8array = new TextEncoder("utf-8").encode("¢");
var string = new TextDecoder("utf-8").decode(uint8array);
Vincent Scheib
quelle
39
Für alle , faul wie ich, npm install text-encoding, var textEncoding = require('text-encoding'); var TextDecoder = textEncoding.TextDecoder;. Nein Danke.
Evan Hu
16
Vorsicht vor der npm-Textcodierungsbibliothek. Der Webpack Bundle Analyzer zeigt, dass die Bibliothek RIESIG ist
Weg zum zukünftigen
3
@ VincentScheib-Browser haben die Unterstützung für alle anderen Formate außer entfernt utf-8. Das TextEncoderArgument ist also unnötig!
Tripulse
1
nodejs.org/api/string_decoder.html aus dem Beispiel: const {StringDecoder} = require ('string_decoder'); const decoder = neuer StringDecoder ('utf8'); const cent = Buffer.from ([0xC2, 0xA2]); console.log (decoder.write (cent));
Kurist
4
Beachten Sie, dass Node.js die TextEncoder/ TextDecoderAPIs in Version 11 hinzugefügt hat, sodass keine zusätzlichen Pakete installiert werden müssen, wenn Sie nur auf aktuelle Node-Versionen abzielen.
Loilo
42

Das sollte funktionieren:

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

Es ist etwas sauberer als die anderen Lösungen, da es keine Hacks verwendet oder von Browser-JS-Funktionen abhängt, z. B. auch in anderen JS-Umgebungen.

Schauen Sie sich die JSFiddle-Demo an .

Siehe auch die entsprechenden Fragen: hier und hier

Albert
quelle
6
Das scheint ein bisschen langsam zu sein. Aber der einzige Ausschnitt im Universum, den ich gefunden habe, funktioniert. Guter Fund + Adoption!
Redsandro
6
Ich verstehe nicht, warum dies nicht mehr positive Stimmen hat. Es erscheint äußerst sinnvoll, die UTF-8-Konvention für kleine Schnipsel durchzuarbeiten. Async Blob + Filereader eignet sich hervorragend für große Texte, wie andere angegeben haben.
DanHorner
2
Die Frage war, wie man dies ohne Verkettung von Strings macht
Jack Wester
5
Funktioniert hervorragend, außer dass es keine 4+ Byte-Sequenzen verarbeitet, z. B. fromUTF8Array([240,159,154,133])leer (während fromUTF8Array([226,152,131])→"☃")
Unhammer
1
Warum sind die Fälle 8, 9, 10 und 11 ausgeschlossen? Irgend ein bestimmter Grund? Und Fall 15 ist auch möglich, oder? 15 (1111) bedeutet, dass 4 Bytes verwendet werden, nicht wahr?
RaR
31

Folgendes verwende ich:

var str = String.fromCharCode.apply(null, uint8Arr);
Dlchambers
quelle
7
Aus dem Dokument scheint dies UTF8 nicht zu dekodieren.
Albert
29
Dies wirft RangeErrorgrößere Texte auf. "Maximale Call-Stack-Größe überschritten"
Redsandro
1
Wenn Sie große Uint8Arrays in Binärzeichenfolgen konvertieren und RangeError erhalten, lesen Sie die Uint8ToString-Funktion unter stackoverflow.com/a/12713326/471341 .
Yonran
IE 11 wirft, SCRIPT28: Out of stack spacewenn ich es 300 + k Zeichen füttere, oder RangeErrorfür Chrome 39. Firefox 33 ist in Ordnung. 100 + k läuft mit allen drei in Ordnung.
Sheepy
Dies führt nicht zum korrekten Ergebnis der Beispiel-Unicode-Zeichen auf en.wikipedia.org/wiki/UTF-8 . zB String.fromCharCode.apply (null, neues Uint8Array ([0xc2, 0xa2])) erzeugt kein ¢.
Vincent Scheib
16

Gefunden in einer der Chrome-Beispielanwendungen, obwohl dies für größere Datenblöcke gedacht ist, bei denen Sie mit einer asynchronen Konvertierung einverstanden sind.

/**
 * 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
quelle
2
Wie Sie sagten, würde dies eine schreckliche Leistung erbringen, wenn der zu konvertierende Puffer nicht wirklich sehr groß wäre. Die synchrone Konvertierung von UTF-8 in wchar einer einfachen Zeichenfolge (z. B. 10-40 Byte), die beispielsweise in V8 implementiert ist, sollte viel weniger als eine Mikrosekunde betragen, während ich davon ausgehen würde, dass Ihr Code das Hundertfache erfordern würde. Trotzdem danke.
Jack Wester
15

In Node " BufferInstanzen sind auch Uint8ArrayInstanzen ", buf.toString()funktioniert also in diesem Fall.

kpowz
quelle
Funktioniert super für mich. Und so einfach! Tatsächlich hat Uint8Array die Methode toString ().
Untergang
Einfach und elegant, war sich nicht bewusst, Bufferist auch Uint8Array. Vielen Dank!
LeOn - Han Li
1
@doom Auf der Browserseite kompiliert Uint8Array.toString () keine utf-8-Zeichenfolge, sondern listet die numerischen Werte im Array auf. Wenn Sie also ein Uint8Array aus einer anderen Quelle haben, das nicht zufällig auch ein Puffer ist, müssen Sie eines erstellen, um die Magie auszuführen:Buffer.from(uint8array).toString('utf-8')
Joachim Lous
12

Die von Albert angegebene Lösung funktioniert gut, solange die bereitgestellte Funktion nur selten aufgerufen wird und nur für Arrays mit bescheidener Größe verwendet wird. Andernfalls ist sie äußerst ineffizient. Hier ist eine erweiterte Vanille-JavaScript-Lösung, die sowohl für Knoten als auch für Browser funktioniert und die folgenden Vorteile bietet:

• Funktioniert effizient für alle Oktett-Array-Größen

• Erzeugt keine wegwerfbaren Zwischenzeichenfolgen

• Unterstützt 4-Byte-Zeichen in modernen JS-Engines (andernfalls wird "?" Ersetzt)

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
quelle
2
Beste Lösung hier, da es auch 4-Byte-Zeichen (zB Emojis) verarbeitet. Danke!
fiffy
1
und was ist das Gegenteil davon?
simbo1905
6

Tun Sie, was @Sudhir gesagt hat, und verwenden Sie dann Folgendes, um einen String aus der durch Kommas getrennten Liste von Zahlen zu entfernen:

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

Dadurch erhalten Sie die gewünschte Zeichenfolge, sofern diese noch relevant ist

Shuki
quelle
Entschuldigung, ich habe den letzten Satz nicht bemerkt, in dem Sie gesagt haben, dass Sie nicht jeweils einen Charakter hinzufügen möchten. Ich hoffe, dies hilft anderen, die jedoch kein Problem mit der CPU-Auslastung haben.
Shuki
14
Dies führt keine UTF8-Decodierung durch.
Albert
Noch kürzer : String.fromCharCode.apply(null, unitArr);. Wie bereits erwähnt, wird die UTF8-Codierung nicht verarbeitet. Manchmal ist dies jedoch einfach genug, wenn Sie nur ASCII-Unterstützung benötigen, aber keinen Zugriff auf TextEncoder / TextDecoder haben.
Ravenstine
Die Antwort erwähnt ein @Sudhir, aber ich habe die Seite durchsucht und jetzt eine solche Antwort gefunden. Also wäre es besser, inline zu schreiben, was er sagte
Joakim
Dies wird eine schreckliche Leistung auf längeren Saiten haben. Verwenden Sie den Operator + nicht für Zeichenfolgen.
Max
3

Wenn Sie die TextDecoder-API nicht verwenden können, weil sie im IE nicht unterstützt wird :

  1. Sie können die von der Mozilla Developer Network-Website empfohlene Polyfill FastestSmallestTextEncoderDecoder verwenden .
  2. Sie können diese Funktion auch auf der MDN-Website verwenden :

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
quelle
2

Probieren Sie diese Funktionen aus,

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

Quelle: https://gist.github.com/tomfa/706d10fed78c497731ac , ein großes Lob an Tomfa

Serdarsenay
quelle
2

Ich war frustriert zu sehen, dass die Leute nicht zeigten, wie man in beide Richtungen geht oder dass die Dinge mit keinen trivialen UTF8-Strings funktionieren. Ich habe auf codereview.stackexchange.com einen Beitrag gefunden , der Code enthält, der gut funktioniert. Ich habe es benutzt, um alte Runen in Bytes umzuwandeln, um Krypo auf den Bytes zu testen und dann Dinge wieder in einen String umzuwandeln. Der Arbeitscode ist hier auf Github . Ich habe die Methoden aus Gründen der Klarheit umbenannt:

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

Der Komponententest verwendet diese UTF-8-Zeichenfolge:

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

Beachten Sie, dass die Zeichenfolgenlänge nur 117 Zeichen beträgt, die Bytelänge bei Codierung jedoch 234.

Wenn ich die Konsolen.log-Zeilen auskommentiere, kann ich sehen, dass die Zeichenfolge, die dekodiert wird, dieselbe Zeichenfolge ist, die codiert wurde (wobei die Bytes durch Shamirs geheimen Freigabealgorithmus geleitet werden!):

Unit Test, dass Demos Codierung und Decodierung

simbo1905
quelle
String.fromCharCode.apply(null, chars)wird Fehler, wenn charszu groß ist.
Marc J. Schmidt vor
1

In NodeJS stehen Puffer zur Verfügung, und die Konvertierung von Zeichenfolgen mit ihnen ist wirklich einfach. Besser, es ist einfach, ein Uint8Array in einen Puffer zu konvertieren. Probieren Sie diesen Code aus, er funktioniert in Node für jede Konvertierung mit Uint8Arrays:

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

Wir extrahieren nur den ArrayBuffer aus dem Uint8Array und konvertieren ihn dann in einen richtigen NodeJS-Puffer. Dann konvertieren wir den Puffer in eine Zeichenfolge (Sie können eine Hex- oder Base64-Codierung eingeben, wenn Sie möchten).

Wenn wir von einem String zurück in ein Uint8Array konvertieren möchten, würden wir dies tun:

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

Beachten Sie, dass Sie, wenn Sie beim Konvertieren in eine Zeichenfolge eine Codierung wie base64 deklariert haben, diese verwenden müssen, Buffer.from(str, "base64")wenn Sie base64 oder eine andere von Ihnen verwendete Codierung verwendet haben.

Dies funktioniert im Browser ohne Modul nicht! NodeJS-Puffer sind im Browser einfach nicht vorhanden, daher funktioniert diese Methode nur, wenn Sie dem Browser Pufferfunktionen hinzufügen. Das ist eigentlich ziemlich einfach, benutze einfach ein Modul wie dieses , das sowohl klein als auch schnell ist!

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

`

Terraner
quelle
Fügen Sie eine Beschreibung hinzu, um zu antworten. @terran
Rohit Poudel
-3

Ich verwende dieses Typescript-Snippet:

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

Entfernen Sie die Typanmerkungen, wenn Sie die JavaScript-Version benötigen. Hoffe das hilft!

Bernd Paradies
quelle
3
Das OP bat darum, nicht jeweils ein Zeichen hinzuzufügen. Außerdem möchte er es nicht als Zeichenfolgendarstellung der Liste anzeigen, sondern nur als Zeichenfolge. Außerdem werden die Zeichen nicht in Zeichenfolgen konvertiert, sondern die Nummer angezeigt.
Albert