Wie schneide ich eine Zeichenfolge beim Konvertieren in Bytes in C# ab?
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?
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.