10 Stimmen

Wie verkürze ich eine Zeichenkette beim Konvertieren in Bytes in C#?

Ich möchte einen String in ein Byte-Array einfügen, aber der String könnte zu groß sein, um hineinzupassen. Wenn er zu groß ist, möchte ich so viel wie möglich des Strings in das Array einfügen. Gibt es einen effizienten Weg, um herauszufinden, wie viele Zeichen hineinpassen?

7voto

otsdr Punkte 76

Um zu verhindern, dass ein String in ein UTF8-Byte-Array abgeschnitten wird, ohne mitten in einem Zeichen aufzuteilen, benutze ich dies:

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.

2voto

Sie sollten die Encoding-Klasse verwenden, um Ihre Konvertierung in ein Byte-Array korrekt durchzuführen? Alle Encoding-Objekte haben eine überschriebene Methode GetMaxCharCount, die Ihnen "Die maximale Anzahl von Zeichen gibt, die durch Decodieren der angegebenen Anzahl von Bytes erzeugt werden". Sie sollten in der Lage sein, diesen Wert zu verwenden, um Ihren String zu kürzen und ihn ordnungsgemäß zu codieren.

0 Stimmen

Dies funktioniert nicht, wenn sein Limit die Anzahl der Bytes ist. (Nur wenn das Limit die Anzahl der Zeichen ist)

1voto

skolima Punkte 30692

Der effizienteste Weg wäre herauszufinden, wie viele (pessimistisch) Bytes pro Zeichen benötigt werden mit

Encoding.GetMaxByteCount(1);

dann die Größe Ihres Strings durch das Ergebnis zu teilen und entsprechend 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

Encoding.GetByteCount(string);

aber das ist eine deutlich langsamere Methode.

1voto

Joseph Daigle Punkte 46087

Die Encoding-Klasse in .NET hat eine Methode namens GetByteCount, die einen String oder char[] akzeptieren kann. Wenn Sie einen einzelnen Zeichen übergeben, wird Ihnen mitgeteilt, wie viele Bytes für dieses einzelne Zeichen in der verwendeten Codierung benötigt werden.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X