Warum BinaryWriter voranstellen Kauderwelsch zu Beginn von einem stream??? Wie vermeiden Sie es?
Ich bin Debuggen einiger Probleme mit dem schreiben von Stücken von einem Objekt in eine Datei, und ich habe, bis auf die Basis bei nur öffnen der Datei und das schreiben von "TEST". Ich bin dabei so was 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, endet dies voranstellen von einem Kästchen vor der Datei, und es sieht so aus:
TEST, mit einer fun-box auf der Vorderseite. Warum ist das so und wie kann ich Sie vermeiden?
Edit: Es scheint sich nicht um die Anzeige der box hier, aber es ist das unicode-Zeichen, das sieht aus wie Kauderwelsch.
Ich werde darauf drängen den Inhalt vieler Dateien in diese Datei werden später gelesen. Allerdings möchte ich überprüfen, dass die Datei beginnt mit "TEST", ansonsten werde ich nicht die Datei Lesen.
Um tatsächlich Ihre Frage zu beantworten: der binäre Autor schreibt aus einer binären Zeichenfolge, indem Sie es mit der Länge der Zeichenfolge. So werden die binary - reader weiß, wie viel string-Daten es als Nächstes kommen wird.
Wenn das, was Sie tun möchten, schreiben Sie die Zeichenfolge als ein array von Zeichen, und nicht als string, dann versuchen Sie w.Write("test".ToCharArray()); zwingen der Schriftsteller zu schreiben Sie das Zeichen als array und nicht als ein Länge-Präfix-string.
Es gibt viele Möglichkeiten, um es. Sie können schreiben, ein char-array, können Sie schreiben, die ein byte-array, können Sie aus vier einzelnen bytes, die Sie tun können, was Sie wollen. Sie Steuern das format der Binär-Datei, wenn Sie nicht wie die Standard-string-handling, gehen Sie voran und setzen Sie Ihre eigene.
Alternativ, Sie können Ihre reader-Programm prüfen Sie, dass die ersten FÜNF bytes 04 74 65 73 74.
Um tatsächlich Ihre Frage zu beantworten: der binäre Autor schreibt aus einer binären Zeichenfolge, indem Sie es mit der Länge der Zeichenfolge. So werden die binary - reader weiß, wie viel string-Daten es als Nächstes kommen wird.
Wenn das, was Sie tun möchten, schreiben Sie die Zeichenfolge als ein array von Zeichen, und nicht als string, dann versuchen Sie w.Write("test".ToCharArray()); zwingen der Schriftsteller zu schreiben Sie das Zeichen als array und nicht als ein Länge-Präfix-string.
Es gibt viele Möglichkeiten, um es. Sie können schreiben, ein char-array, können Sie schreiben, die ein byte-array, können Sie aus vier einzelnen bytes, die Sie tun können, was Sie wollen. Sie Steuern das format der Binär-Datei, wenn Sie nicht wie die Standard-string-handling, gehen Sie voran und setzen Sie Ihre eigene.
Alternativ, Sie können Ihre reader-Programm prüfen Sie, dass die ersten FÜNF bytes 04 74 65 73 74.
InformationsquelleAutor Chris | 2009-09-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie keine byte-order-Markierungen, aber eine Länge-Präfix, entsprechend MSDN:
Und Sie müssen die Länge-prefix, falls Sie jemals wollen, Lesen Sie die Zeichenfolge wieder aus, Punkt. Sehen
BinaryReader.ReadString()
.Zusätzliche
Da es scheint Sie wirklich wollen, eine Datei-Header-checker
Ist es ein problem? Lesen Sie die Länge-Präfix zurück, so als eine Art-überprüfen Sie auf die Datei, es funktioniert OK
Können Sie konvertieren Sie die Zeichenfolge in ein byte[] array, wahrscheinlich mit der Kodierung.ASCII. Aber hen, müssen Sie entweder einen festen (stillschweigend) Länge... oder Präfix-it-yourself. Nach dem Lesen des byte[] können Sie es konvertieren zu einem string wieder.
Wenn Sie hatte eine Menge text zu schreiben, könnten Sie sogar einen TextWriter, um den gleichen Strom. Aber Vorsicht, die Autoren schließen möchten, Ihre streams. Ich würde nicht die Beratung dieser im Allgemeinen, aber es ist gut zu wissen. Auch hier markieren Sie einen Punkt, wo andere Leser übernehmen kann (fixed header funktioniert OK).
InformationsquelleAutor Henk Holterman
Das ist, weil ein BinaryWriter schreibt die binäre Darstellung der Zeichenfolge, einschließlich der Länge der Zeichenfolge. Wenn Sie wurden schreiben von geraden Daten (z.B. byte[], etc.) es nicht auf die Länge.
Werden Sie feststellen, dass es nicht die Länge. Wenn du gehst, um zu schreiben, dass die textuellen Daten mit den binären Schriftsteller, müssen Sie konvertieren Sie es zuerst.
InformationsquelleAutor Joshua
Das byte am Anfang ist die Länge der Zeichenfolge, es ist geschrieben wie eine variable-length-integer.
Wenn die Zeichenfolge 127 Zeichen oder weniger, die Länge wird gespeichert als ein byte. Wenn die saite trifft, die 128 Zeichen, die Länge ist geschrieben als 2, und es wird auf 3 und 4 einige Längen sowie.
Das problem hier ist, dass Sie BinaryWriter, der schreibt aus Daten, die BinaryReader Lesen können zurück in später. Wenn Sie möchten, schreiben Sie in einem benutzerdefinierten format von Ihrer eigenen, müssen Sie entweder drop-strings geschrieben werden, oder fallen mit BinaryWriter insgesamt.
InformationsquelleAutor Lasse Vågsæther Karlsen
Als Henk wies darauf hin, in diese Antwort, dies ist die Länge des Strings (als 32-bit int).
Wenn Sie dies nicht möchten, können Sie entweder schreiben Sie "TEST" manuell, indem Sie die ASCII-Zeichen für jeden Buchstaben als bytes, oder Sie verwenden könnten:
Schreiben und das sich daraus ergebende array (NICHT enthalten Länge int)
InformationsquelleAutor Jon B
Was Sie sehen, ist eigentlich ein 7-bit-kodierte integer-Zahl, die eine Art integer-Kompression.
Der BinaryWriter Schreibe den text mit diesem, sodass der Leser (d.h. BinaryReader) weiß, wie lang der string geschrieben wird.
Lesen Sie mehr über die Einzelheiten der Durchführung dieses an http://dpatrickcaldwell.blogspot.se/2011/09/7-bit-encoding-with-binarywriter-in-net.html.
InformationsquelleAutor Patrik Svensson
Können Sie es speichern als UTF8-kodierte byte-array wie dieses:
InformationsquelleAutor rocka
Das ist ein byte order mark, das ist sehr wahrscheinlich. Es ist, weil der stream encoding eingestellt ist Unicode.
InformationsquelleAutor Kawa
Denken Sie daran, dass Java strings intern die Kodierung UTF-16.
So, in der "test" ist eigentlich aus dem Byte 0xff, 0xfe (zusammen die byte order mark), 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00.
Werden Sie wahrscheinlich wollen, um die Arbeit mit bytes anstelle von streams von Zeichen.
InformationsquelleAutor Locoluis
Klingt wie byte order marks.
http://en.wikipedia.org/wiki/Byte-order_mark
Vielleicht möchten Sie schreiben Sie den string als UTF-8.
Also ich sammeln. Auf der Grundlage der ursprünglichen Informationen, die Stückliste Diagnose war ganz vernünftig, aber.
InformationsquelleAutor Steven Sudit