Verwendung von C #, was ist das effizienteste Verfahren zur Herstellung einer Zeichenfolge enthält binäre Daten in ein Array von Bytes Umwandeln

StackOverflow https://stackoverflow.com/questions/72176

  •  09-06-2019
  •  | 
  •  

Frage

Zwar gibt es 100 Möglichkeiten, um die Umwandlung Problem zu lösen, ich auf der Leistung bin konzentriert.

Geben Sie, dass die Zeichenfolge nur binäre Daten enthalten, was die schnellste Methode ist, in Bezug auf Leistung, die diese Daten in einem Byte Umwandlung [] (nicht char []) unter C #?

Zur Verdeutlichung: Dies ist nicht ASCII-Daten, sondern binäre Daten, die in einem String sein geschehen

.
War es hilfreich?

Lösung

Ich bin nicht sicher ASCIIEncoding.GetBytes geht, es zu tun, weil es nur die Bereich 0x0000 bis 0x007F .

Sie sagen, die Zeichenfolge nur Bytes enthält. Aber ein .NET-String ist ein Array von Zeichen, und 1 Zeichen 2 Bytes (da ein .NET speichern Zeichenfolge als UTF16). So können Sie entweder zwei Situationen für die Bytes speichern 0x42 und 0x98:

  1. Die Zeichenfolge war ein ANSI-String und enthielt Bytes und ist mit einem Unicode-String umgewandelt, so wird das Byte 0x00 0x42 0x00 0x98 sein. (Die Zeichenfolge wird gespeichert als 0x0042 und 0x0098)
  2. Die Zeichenfolge war nur ein Byte-Array, das Sie typecasted oder nur zu einem String empfangen und wurde damit die folgenden Bytes 0x42 0x98. (Der String wird als 0x9842 gespeichert)

In der ersten Situation auf das Ergebnis wäre 0x42 und 0x3F (ascii für "B?"). Die zweite Situation würde in 0x3F (ascii für "?") Zur Folge hat. Dies ist logisch, da die Zeichen außerhalb des gültigen ASCII-Bereichs sind und der Geber nicht weiß, was mit diesen Werten zu tun.

Also ich frage mich, warum es ein String mit Bytes?

  • Vielleicht enthält es ein Byte als String codiert (zum Beispiel Base64 )?
  • Vielleicht sollten Sie mit einem char-Array oder einem Byte-Array starten?

Wenn Sie wirklich tun haben Situation 2 und Sie die Bytes aus ihm heraus sollten Sie die UnicodeEncoding.GetBytes Anruf. Denn das wird wieder 0x42 und 0x98.

Wenn Sie von einer char-Array gehen mögen, dass Array Byte, der schnellste Weg, Marshalling wäre .. Aber das ist nicht wirklich schön, und verwendet doppelten Speicher.

public Byte[] ConvertToBytes(Char[] source)
{
    Byte[] result = new Byte[source.Length * sizeof(Char)];
    IntPtr tempBuffer = Marshal.AllocHGlobal(result.Length);
    try
    {
        Marshal.Copy(source, 0, tempBuffer, source.Length);
        Marshal.Copy(tempBuffer, result, 0, result.Length);
    }
    finally
    {
        Marshal.FreeHGlobal(tempBuffer);
    }
    return result;
}

Andere Tipps

Es ist nicht so etwas als ASCII-String in C #! Strings immer enthalten UTF-16. Nicht ahnend, dies zu vielen Problemen führt. Das heißt, die vor der Arbeit genannten Methoden, weil sie den String als UTF-16 codiert und verwandeln die Zeichen ASCII-Zeichen betrachten.

/ EDIT in Reaktion auf die Klärung: Wie haben die Binärdaten in der Zeichenfolge bekommen? Strings sollen nicht Binärdaten (Verwendung byte[] dafür) enthalten.

Wenn Sie von einer Zeichenkette in binären Daten gehen wollen, Sie müssen wissen, welche Codierung verwendet wurde, um die binären Daten in einen String in erster Linie zu konvertieren . Andernfalls könnten Sie nicht mit den richtigen binären Daten landen. So ist der effizienteste Weg ist wahrscheinlich GetBytes () auf einer Encoding Unterklasse (wie UTF8Encoding), aber Sie müssen sicher die Codierung wissen.

Der Kommentar von Kent Boogaart auf die ursprüngliche Frage fasst es ziemlich gut. ;]

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