Javascript'te dizeye Uint8Array


122

Javascript'te bir dizi Uint8Array öğesinde yaşayan bazı UTF-8 kodlu verilerim var. Bunları normal bir javascript dizesine dönüştürmenin etkili bir yolu var mı (Javascript'in 16 bit Unicode kullandığına inanıyorum)? Dize bağdaştırması CPU için yoğun hale geleceği için aynı anda bir karakter eklemek istemiyorum.


u8array.toString()Çalışıp çalışmayacağından emin değilim, ancak çağırdığınızda Uint8Array nesnesini ortaya çıkaran BrowserFS'den dosyaları okurken kullanıyorum fs.readFile.
jcubic

1
Benim için @jcubic, toStringüzerinde Uint8Arraygibi döner virgülle ayrılmış numaralar "91,50,48,49,57,45"(Krom 79)
Kolen

Yanıtlar:


172

TextEncoderve TextDecodergelen kodlama standardı ile polyfilled olup, stringencoding kütüphanesi , ipler ve ArrayBuffers arasında dönüştürür:

var uint8array = new TextEncoder("utf-8").encode("¢");
var string = new TextDecoder("utf-8").decode(uint8array);

40
Benim gibi tembel herkes için, npm install text-encoding, var textEncoding = require('text-encoding'); var TextDecoder = textEncoding.TextDecoder;. Hayır teşekkürler.
Evan Hu

16
npm metin kodlama kitaplığına dikkat edin, web paketi paket analizörü kitaplığın BÜYÜK olduğunu gösteriyor
wayofthefuture

3
@VincentScheib Tarayıcılar dışındaki diğer formatlar için desteği kaldırdı utf-8. Yani TextEncoderargüman gereksiz!
2019,

1
örnekten nodejs.org/api/string_decoder.html : const {StringDecoder} = required ('string_decoder'); const kod çözücü = yeni StringDecoder ('utf8'); const cent = Buffer.from ([0xC2, 0xA2]); console.log (decoder.write (yüzde));
curist

4
Node.js'nin TextEncoder/ TextDecoderAPI'leri v11'e eklediğini , dolayısıyla yalnızca mevcut Düğüm sürümlerini hedefliyorsanız fazladan paket yüklemenize gerek olmadığını unutmayın.
Loilo

42

Bu çalışmalı:

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

/* utf.js - UTF-8 <=> UTF-16 convertion
 *
 * Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
 * 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;
}

Diğer çözümler kadar daha temizdir çünkü herhangi bir hack kullanmaz ve Tarayıcı JS işlevlerine bağlıdır, örneğin diğer JS ortamlarında da çalışır.

JSFiddle demosuna göz atın .

Ayrıca ilgili sorulara bakın: burada ve burada


6
Bu biraz yavaş görünüyor. Ama evrendeki işe yaradığını bulduğum tek parça. İyi bul + benimseme!
Redsandro

6
Bunun neden daha fazla olumlu oyu olmadığını anlamıyorum. Küçük parçacıklar için UTF-8 konvansiyonunu geçmek son derece mantıklı görünüyor. Async Blob + Filereader, diğerlerinin de belirttiği gibi büyük metinler için harika çalışıyor.
DanHorner

2
Soru, bunun dizi birleştirme olmadan nasıl yapılacağıydı
Jack Wester

5
4+ bayt dizisini fromUTF8Array([240,159,154,133])fromUTF8Array([226,152,131])→"☃"
işlememesi

1
Neden 8, 9, 10 ve 11. vakalar hariç tutulur? Belirli bir neden var mı? Ve durum 15 de mümkün, değil mi? 15 (1111) 4 bayt kullanıldığını gösterecek, değil mi?
RaR

31

İşte kullandığım şey:

var str = String.fromCharCode.apply(null, uint8Arr);

7
Gönderen doc , bu kod çözme UTF8 görünmüyor.
Albert

29
Bu RangeErrordaha büyük metinler atacak . "Maksimum çağrı yığın boyutu aşıldı"
Redsandro

1
Büyük Uint8Array'leri ikili dizelere dönüştürüyorsanız ve RangeError alıyorsanız, stackoverflow.com/a/12713326/471341 adresinden Uint8ToString işlevine bakın .
yonran

IE 11 SCRIPT28: Out of stack space, 300 + k karakter veya RangeErrorChrome 39 için beslediğimde atıyor . Firefox 33 tamam. 100 + k, üçünde de sorunsuz çalışır.
Sheepy

Bu, en.wikipedia.org/wiki/UTF-8'deki örnek unicode karakterlerinin doğru sonucunu vermez . örneğin String.fromCharCode.apply (null, new Uint8Array ([0xc2, 0xa2])) ¢ üretmez.
Vincent Scheib

16

Chrome örnek uygulamalarından birinde bulunur, ancak bu, eşzamansız bir dönüştürmenin uygun olduğu daha büyük veri blokları içindir.

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

2
Dediğin gibi, dönüştürülecek arabellek gerçekten çok büyük değilse, bu korkunç bir performans gösterir. Örneğin, V8'de uygulanan basit bir dizenin (örneğin 10-40 bayt) eşzamanlı UTF-8'den wchar'a dönüşümü, bir mikrosaniyeden çok daha az olmalıdır, oysa kodunuzun bunun yüzlerce kez gerektireceğini tahmin ediyorum. Hepinize teşekkürler.
Jack Wester

15

Düğümde " Bufferörnekler de Uint8Arrayörneklerdir ", bu nedenle buf.toString()bu durumda çalışır.


Benim için harika çalışıyor. Ve çok basit! Ama aslında Uint8Array'in toString () yöntemi vardır.
doom

Basit ve zarif, BufferUint8Array farkında değildi. Teşekkürler!
LeOn - Han Li

1
@doom Tarayıcı tarafında, Uint8Array.toString () bir utf-8 dizesi derlemez, dizideki sayısal değerleri listeler. Dolayısıyla, sahip olduğunuz şey başka bir kaynaktan bir Uint8Array ise, bu aynı zamanda bir Tampon değildir, sihri yapmak için bir tane oluşturmanız gerekecektir:Buffer.from(uint8array).toString('utf-8')
Joachim Lous

12

Albert tarafından verilen çözüm, sağlanan işlev nadiren çağrıldığı ve yalnızca mütevazı boyuttaki diziler için kullanıldığı sürece iyi çalışır, aksi takdirde son derece verimsizdir. Hem Düğüm hem de tarayıcılar için çalışan ve aşağıdaki avantajlara sahip gelişmiş bir vanilya JavaScript çözümü:

• Tüm sekizli dizi boyutları için verimli çalışır

• Ara atma dizeleri oluşturmaz

• Modern JS motorlarında 4 baytlık karakterleri destekler (aksi takdirde "?" Değiştirilir)

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

2
Burada en iyi çözüm, 4 baytlık karakterleri de işlediğinden (örn. Emojiler) Teşekkürler!
2019

1
ve bunun tersi nedir?
simbo1905

6

@ Sudhir'in dediğini yapın ve ardından virgülle ayrılmış sayılar listesinden bir Dize almak için şunu kullanın:

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

Hala alakalıysa, bu size istediğiniz dizeyi verecektir


Üzgünüz, her seferinde bir karakter eklemek istemediğini söylediğin son cümleyi fark etmedim. Umarım bu, CPU kullanımıyla ilgili bir sorunu olmayanlara yardımcı olur.
shuki

14
Bu UTF8 kod çözme yapmaz.
Albert

Hatta daha kısa: String.fromCharCode.apply(null, unitArr);. Bahsedildiği gibi, UTF8 kodlamasını işlemez, ancak bazen yalnızca ASCII desteğine ihtiyacınız varsa ancak TextEncoder / TextDecoder'a erişiminiz yoksa bu yeterince basittir.
Ravenstine

Cevap bir @Sudhir'den bahsediyor ancak sayfayı aradım ve şimdi böyle bir cevap buldum. Bu yüzden ne söylüyorsa satır içi yapmak daha iyi olur
Joakim

Bu, daha uzun dizelerde korkunç bir performansa sahip olacak. Dizelerde + operatörünü kullanmayın.
Maksimum

3

Eğer kullanamıyorsanız TextDecoder API çünkü o IE üzerinde desteklenmez :

  1. Mozilla Developer Network web sitesi tarafından önerilen FastestSmallestTextEncoderDecoder çoklu dolgusunu kullanabilirsiniz ;
  2. MDN web sitesinde de sağlanan bu işlevi kullanabilirsiniz :

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


2

Bu işlevleri deneyin,

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

kaynak: https://gist.github.com/tomfa/706d10fed78c497731ac , Tomfa'ya tebrikler


2

İnsanların her iki yöne de nasıl gideceklerini göstermediklerini veya işlerin önemsiz UTF8 dizeleri üzerinde çalışmadığını gösterdiklerini görmek beni hayal kırıklığına uğrattı. Codereview.stackexchange.com adresinde iyi çalışan bir kod içeren bir gönderi buldum . Eski runları bayta çevirmek, baytlar üzerinde bazı kriptoları test etmek ve sonra her şeyi tekrar dizgeye dönüştürmek için kullandım. Çalışma kodu burada github üzerindedir . Açıklık sağlamak için yöntemleri yeniden adlandırdım:

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

Birim testi şu UTF-8 dizesini kullanır:

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

Dize uzunluğunun yalnızca 117 karakter olduğunu, ancak kodlandığında bayt uzunluğunun 234 olduğunu unutmayın.

Console.log satırlarının açıklamasını kaldırırsam, kodu çözülen dizenin kodlanan dizeyle aynı olduğunu görebilirim (baytlar Shamir'in gizli paylaşım algoritmasından geçerek!):

kodlama ve kod çözmeyi gösteren birim testi


String.fromCharCode.apply(null, chars)charsçok büyükse hata verecektir .
Marc J. Schmidt

bu her yerde mi yoksa sadece bazı tarayıcılarda mı ve belgeleniyor mu?
simbo1905

örn. burada 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

Teşekkürler. benim durumumda küçük dizeler üzerinden kripto yapıyordum, bu yüzden sorun değil. uzun dizeler için bir fikriniz var mı? :-)
simbo1905

çözüm 64k karakterde toplu işlem yapmaktır.
Marc J. Schmidt

1

NodeJS'de Tamponlarımız var ve bunlarla dize dönüştürme gerçekten çok kolay. Daha da iyisi, bir Uint8Array'i Tampon'a dönüştürmek kolaydır. Bu kodu deneyin, temelde Uint8Arrays içeren herhangi bir dönüşüm için Node'da benim için çalıştı:

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

Sadece ArrayBuffer'ı Uint8Array'den çıkarıyoruz ve ardından bunu uygun bir NodeJS Buffer'a dönüştürüyoruz. Ardından Buffer'ı bir dizeye dönüştürüyoruz (isterseniz bir hex veya base64 kodlaması atabilirsiniz).

Bir dizeden bir Uint8Array'e geri dönüştürmek istersek, şunu yaparız:

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

Bir dizeye dönüştürürken base64 gibi bir kodlama bildirdiyseniz, Buffer.from(str, "base64")base64 veya kullandığınız başka bir kodlamayı kullandıysanız kullanmanız gerekeceğini unutmayın.

Bu, bir modül olmadan tarayıcıda çalışmayacaktır! NodeJS Tamponları tarayıcıda mevcut değildir, bu nedenle tarayıcıya Buffer işlevselliği eklemediğiniz sürece bu yöntem çalışmayacaktır. Gerçi yapmak oldukça kolay aslında, tıpkı bir modülü kullanmak bu küçük ve hızlı hem!


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

'


Cevaplamak için bir açıklama ekleyin. @terran
Rohit Poudel 21

-3

Bu Typescript pasajını kullanıyorum:

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

JavaScript sürümüne ihtiyacınız varsa tür ek açıklamalarını kaldırın. Bu yardımcı olur umarım!


3
OP bir seferde bir karakter eklememeyi istedi. Ayrıca, onu listenin dizgi temsili olarak değil, sadece bir dizge olarak görüntülemek istemez. Ayrıca, bu karakterleri dizeye dönüştürmez, ancak numarasını görüntüler.
Albert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.