Wie trenne ich eine Zeichenfolge während der Konvertierung in Bytes in C #?

8

Ich möchte eine Zeichenfolge in ein Byte-Array einfügen, aber die Zeichenfolge könnte zu groß sein, um zu passen. In dem Fall, in dem es zu groß ist, möchte ich so viel wie möglich in das Array einfügen. Gibt es eine effiziente Möglichkeit herauszufinden, wie viele Zeichen passen?

    
TimK 29.08.2008, 14:51
quelle

5 Antworten

5

Um eine Zeichenfolge in ein UTF8-Byte-Array zu schneiden, ohne in der Mitte eines Zeichens zu teilen, verwende ich dies:

%Vor%

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

    
otsdr 29.08.2008, 15:03
quelle
2

Sie sollten die Encoding-Klasse verwenden, um die Konvertierung in das richtige Byte-Array durchzuführen? Alle Encoding-Objekte verfügen über eine überschriebene Methode GetMaxCharCount, die Ihnen "die maximale Anzahl von Zeichen, die durch das Decodieren der angegebenen Anzahl von Byte erzeugt wird" gibt. Sie sollten diesen Wert verwenden können, um Ihre Zeichenfolge zu trimmen und richtig zu codieren.

    
Jeff Ward 29.08.2008 15:05
quelle
1

Effizient wäre es, herauszufinden, wieviel (pessimistisch) Bytes Sie pro Zeichen mit

benötigen %Vor%

Dann dividiere die String-Größe durch das Ergebnis und konvertiere dann so viele Zeichen mit

%Vor%

Wenn Sie weniger Speicher verwenden möchten, verwenden Sie

%Vor%

aber das ist eine viel langsamere Methode.

    
skolima 29.08.2008 15:07
quelle
1

Die Encoding-Klasse in .NET hat eine Methode namens GetByteCount , die eine Zeichenkette oder char [] aufnehmen kann. Wenn Sie 1 Zeichen übergeben, wird Ihnen angezeigt, wie viele Bytes für dieses 1 Zeichen in welcher Kodierung Sie benötigen.

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.

    
Joseph Daigle 29.08.2008 15:08
quelle
1

Cooke, dein Code tut nicht das, was du anscheinend glaubst. Die Vorbelegung des Byte-Puffers in Ihrem Fall ist reine Verschwendung, da sie nicht verwendet wird. Ihre Zuweisung löscht stattdessen den zugewiesenen Speicher und setzt den Verweis arr so zurück, dass er auf einen anderen Puffer zeigt, weil Encoding.GetBytes ein neues Array zurückgibt.

    
Konrad Rudolph 29.08.2008 15:47
quelle

Tags und Links