Frage

Ich schreibe Text in eine binäre Datei in C # und einen Unterschied in der Menge zwischen dem Schreiben einen String und ein Zeichen-Array geschrieben sehen. Ich verwende System.IO.BinaryWriter und beobachtete BinaryWriter.BaseStream.Length wie die Schreibvorgänge auftreten. Das sind meine Ergebnisse:

using(BinaryWriter bw = new BinaryWriter(File.Open(“data.dat”), Encoding.ASCII))
{
  string value = “Foo”;

  // Writes 4 bytes
  bw.Write(value);

  // Writes 3 bytes 
  bw.Write(value.ToCharArray());
}

Ich verstehe nicht, warum die Zeichenfolge Überlastung 4 Bytes schreibt, wenn ich nur drei ASCII-Zeichen hier schreibe. Kann das jemand erklären?

War es hilfreich?

Lösung

Die Dokumentation für BinaryWriter.Write(string) besagt, dass es sich um eine Länge voran schreibt String in diesem Strom. Die Überlastung für Write(char[]) hat keine solche Vorfixierung.

Es scheint mir, dass die zusätzlichen Daten die Länge ist.

EDIT:

Nur ein bisschen mehr explizit zu sein, verwenden Reflektor. Sie werden sehen, dass es dieses Stück Code hat dort als Teil der Write(string) Methode:

this.Write7BitEncodedInt(byteCount);

Es ist eine Möglichkeit, eine ganze Zahl mit der geringsten möglichen Anzahl von Bytes zu codieren. kurze Strings (die wir Tag für Tag benutzen würde, die weniger als 128 Zeichen), kann sie dargestellt mit einem Byte werden. Für längere Strings, beginnt es mehr Bytes zu verwenden.

Hier ist der Code für diese Funktion nur, wenn Sie daran interessiert sind:

protected void Write7BitEncodedInt(int value)
{
    uint num = (uint) value;
    while (num >= 0x80)
    {
        this.Write((byte) (num | 0x80));
        num = num >> 7;
    }
    this.Write((byte) num);
}

die die Länge mit dieser Codierung Nach prefixing, schreibt er die Bytes für die Zeichen in der gewünschten Codierung.

Andere Tipps

Von den BinaryWriter.Write(string) docs :

Schreibt einen längen Präfix Zeichenfolge zu diesem Strom in der aktuellen Codierung des Binary, und die aktuelle Position des Stroms in Übereinstimmung mit der Kodierung verwendet, und den spezifischen Zeichen in den Stream geschrieben .

Dieses Verhalten ist wahrscheinlich so, dass beim Lesen der Datei wieder ein BinaryReader in Verwendung die Zeichenfolge identifiziert werden kann. (Z 3Foo3Bar6Foobar in die Zeichenfolge „Foo“ analysiert werden, „Bar“ und „Foobar“ aber FooBarFoobar konnte nicht sein.) In der Tat, BinaryReader.ReadString verwendet genau diese Informationen ein string aus einer Binärdatei zu lesen.

Von den BinaryWriter.Write(char[]) docs :

Schreibt ein Zeichenfeld auf den aktuellen Strom und die aktuelle Position des Stroms in Übereinstimmung mit der Kodierung verwendet, und den spezifischen Zeichen in den Stream geschrieben werden.

Es ist schwer zu überschätzen, wie umfangreich und nützlich die Dokumentation auf MSDN sind. überprüfen Sie sie immer an erster Stelle.

Wie bereits erwähnt, BinaryWriter.Write (String) schreibt die Länge der Zeichenfolge an den Strom, bevor die Zeichenfolge selbst zu schreiben.

Dies ermöglicht es der BinaryReader.ReadString () zu wissen, wie lange die Zeichenfolge ist.

using (BinaryReader br = new BinaryReader(File.OpenRead("data.dat")))
{
    string foo1 = br.ReadString();
    char[] foo2 = br.ReadChars(3);
}

Hast du dich an, was tatsächlich geschrieben wurde? Ich habe gerne einen Nullabschluss erraten.

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