Frage

Ich möchte eine Zeichenfolge in ein Byte-Array einfügen, aber die Zeichenfolge ist möglicherweise zu groß, um hineinzupassen.Für den Fall, dass es zu groß ist, möchte ich so viel wie möglich von der Zeichenfolge in das Array einfügen.Gibt es eine effiziente Möglichkeit herauszufinden, wie viele Zeichen hineinpassen?

War es hilfreich?

Lösung

Um eine Zeichenfolge auf ein UTF8-Byte-Array zu kürzen, ohne sie in der Mitte eines Zeichens zu teilen, verwende ich Folgendes:

static string Truncate(string s, int maxLength) {
    if (Encoding.UTF8.GetByteCount(s) <= maxLength)
        return s;
    var cs = s.ToCharArray();
    int length = 0;
    int i = 0;
    while (i < cs.Length){
        int charSize = 1;
        if (i < (cs.Length - 1) && char.IsSurrogate(cs[i]))
            charSize = 2;
        int byteSize = Encoding.UTF8.GetByteCount(cs, i, charSize);
        if ((byteSize + length) <= maxLength){
            i = i + charSize;
            length += byteSize;
        }
        else
            break;
    }
    return s.Substring(0, i);
}

Der zurückgegebene String kann dann sicher in ein Byte-Array der Länge maxLength übertragen werden.

Andere Tipps

Sollten Sie die Encoding-Klasse verwenden, um Ihre Konvertierung in ein Byte-Array richtig durchzuführen?Alle Codierungsobjekte haben eine überschriebene Methode GetMaxCharCount, mit der Sie "die maximale Anzahl der Zeichen erzeugt werden, die durch Dekodieren der angegebenen Anzahl von Bytes erzeugt werden". Sie sollten in der Lage sein, diesen Wert zu verwenden, um Ihre Zeichenfolge zu schneiden und ihn richtig zu codieren.

Ein effizienter Weg wäre herauszufinden, wie viele (pessimistische) Bytes Sie pro Zeichen benötigen

Encoding.GetMaxByteCount(1);

Teilen Sie dann Ihre Zeichenfolgengröße durch das Ergebnis und konvertieren Sie dann so viele Zeichen mit

public virtual int Encoding.GetBytes (
 string s,
 int charIndex,
 int charCount,
 byte[] bytes,
 int byteIndex
)

Wenn Sie weniger Speicher verwenden möchten, verwenden Sie ihn

Encoding.GetByteCount(string);

aber das ist eine viel langsamere Methode.

Die Encoding-Klasse in .NET verfügt über eine Methode namens GetByteCount die einen String oder ein Zeichen[] aufnehmen kann.Wenn Sie ein Zeichen übergeben, erfahren Sie, wie viele Bytes für dieses Zeichen in der von Ihnen verwendeten Codierung benötigt werden.

Die Methode GetMaxByteCount ist schneller, führt jedoch eine Worst-Case-Berechnung durch, die eine höhere Zahl zurückgeben könnte, als tatsächlich benötigt wird.

Cookey, Ihr Code macht nicht das, was Sie anscheinend denken.Die Vorabzuweisung des Bytepuffers ist in Ihrem Fall reine Verschwendung, da er nicht verwendet wird.Vielmehr löscht Ihre Zuweisung den zugewiesenen Speicher und setzt den zurück arr Referenz, um auf einen anderen Puffer zu verweisen, weil Encoding.GetBytes gibt ein neues Array zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top