Frage

Ich bin Debuggen einige Probleme mit dem Schreiben von Stücken eines Objekts in einer Datei und ich habe bis auf den Basisfall nur die Datei öffnen und Schreiben „TEST“ in es bekommen. Ich tue dies durch so etwas wie:

static FileStream fs;
static BinaryWriter w;
fs = new FileStream(filename, FileMode.Create);
w = new BinaryWriter(fs);

w.Write("test");

w.Close();
fs.Close();

Leider ist dies endet das Voranstellen einer Box auf der Vorderseite der Datei und es sieht so aus:

TEST, mit einer Fun-Box auf der Vorderseite. Warum ist das, und wie kann ich es vermeiden?

Edit: Es scheint nicht die Box hier werden angezeigt wird, aber es ist die Unicode-Zeichen, die wie Kauderwelsch aussieht

.
War es hilfreich?

Lösung

Sie sind nicht Byte-Reihenfolge Marken, sondern ein längen Präfix, nach MSDN :

public virtual void Write(string value);
  

Schreibt eine Länge-Präfix Zeichenfolge   [Der] Strom

Und Sie werden diese Länge-Präfix benötigen, wenn Sie jemals die Zeichenfolge zurück von diesem Punkt lesen möchten. Siehe BinaryReader.ReadString() .

Weitere

Da es scheint, dass Sie tatsächlich eine Datei-Header-checker möchten

  1. Ist es ein Problem? Sie lesen die Länge-Präfix zurück, um eine Typprüfung der Datei es OK funktioniert

  2. Sie können die Zeichenfolge in eine byte [] Array konvertieren, wahrscheinlich Encoding.ASCII verwenden. Aber Henne müssen Sie entweder eine feste (konkludente) Länge oder ... Präfix it yourself. Nach dem Lesen der byte [] Sie es in einen String wieder umwandeln können.

  3. Wenn Sie viel Text hatte man sogar schreiben könnte ein Textwriter auf den gleichen Strom befestigen. Aber seien Sie vorsichtig, wollen die Autoren ihre Ströme schließen. Ich würde dies in der Regel nicht beraten, aber es ist gut zu wissen. Auch hier müssen Sie einen Punkt markieren, wo die anderen Leser übernehmen können (fester Kopf funktioniert OK).

Andere Tipps

Das ist, weil ein Binary die binäre Darstellung des Strings schreibt, einschließlich der Länge der Saite. Wenn Sie gerade Daten schreiben sind (zum Beispiel byte [], etc.) wird es nicht, dass die Länge umfasst.

byte[] text = System.Text.Encoding.Unicode.GetBytes("test");
FileStream fs = new FileStream("C:\\test.txt", FileMode.Create);
BinaryWriter writer = new BinaryWriter(fs);
writer.Write(text);
writer.Close();

Sie werden feststellen, dass es nicht um die Länge enthält. Wenn Sie vorhaben, Textdaten zu schreiben den binären Schriftsteller verwenden, müssen Sie es zuerst konvertieren.

Das Byte zu Beginn der Länge der Zeichenfolge ist, wird es als variabler Länge integer geschrieben.

Wenn die Zeichenfolge 127 Zeichen oder weniger beträgt, wird die Länge als ein Byte gespeichert werden. Wenn die Zeichenfolge 128 Zeichen trifft, wird die Länge als 2 geschrieben, und es wird auch in einigen Längen 3 und 4 zu bewegen.

Das Problem hierbei ist, dass Sie Binary verwenden, welche Daten schreibt, die Binary zurück in später lesen kann. Wenn Sie in einem benutzerdefinierten Format Ihrer eigenen schreiben möchten, müssen Sie entweder schriftlich Zeichenketten wie diese fallen oder fallen ganz mit Binary.

Als Henk wies darauf hin, in diese Antwort , ist dies die Länge der Zeichenfolge (als 32-Bit-int).

Wenn Sie das nicht möchten, können Sie entweder schreiben „TEST“ manuell durch das ASCII-Zeichen als Bytes für jeden Buchstaben zu schreiben, oder könnten Sie verwenden:

System.Text.Encoding.UTF8.GetBytes("TEST")

Und schreiben Sie die resultierende Array (was nicht eine Länge int enthalten)

Was Sie sehen, ist eigentlich ein 7-Bit-codierte ganze Zahl ist, die eine Art von integer Kompression .
Die Binary prepend den Text mit diesem so Leser (das heißt Binary) wird wissen, wie lange die schriftliche Zeichenfolge ist.

Sie können mehr über die Details der Implementierung dieser unter http://dpatrickcaldwell.blogspot.se/2011/09/7-bit-encoding-with-binarywriter-in-net.html .

Sie können es als UTF8 codierte Byte-Array wie folgt speichern:

...

BinaryWriter w = new BinaryWriter(fs);

w.Write(UTF8Encoding.Default.GetBytes("test"));

...

Das ist eine Bytereihenfolgemarkierung, am wahrscheinlichsten. Es ist, weil die Codierung Stream auf Unicode eingestellt ist.

Beachten Sie, dass Java-Strings intern in UTF-16 codiert werden.

Also, "test" ist eigentlich der Bytes 0xff, 0xfe (zusammen die Bytereihenfolgemarkierung) gemacht, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00.

Sie wollen wahrscheinlich mit Bytes anstelle von Strömen von Zeichen arbeiten.

Klingt wie Byte Order Mark.

http://en.wikipedia.org/wiki/Byte-order_mark

Vielleicht möchten Sie die Zeichenfolge als UTF-8 schreiben.

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