2011-01-06 18 views
17

das verwirrt mich wirklich, sagen, ich mag eine ganze Zahl in eine Datei speichern, int x = 56, nimmt die Binary den ascii-Äquivalent der Darstellung von 56 in Speicher 00000000 00000000 00000000 00111000, das wäre: null null null 8 und schreibe es in die Datei? hab ich recht? Kann jemand erklären, wie diese zwei Funktionen funktionieren und wann sollte ich sie benutzen? Ich benutze C# BTW. Danke im Voraus!Was ist der Unterschied zwischen einem Streamwriter und einem Binarywriter?

+0

Das ist die binäre Darstellung, nicht ASCII. –

+1

00111000 = 0 * 1 + 0 * 2 + 0 * 4 + 1 * 8 + 1 * 16 + 1 * 32 + 0 * 64 + 0 * 128 = 56. –

+0

Es ist nicht NULL NULL NULL 8 seine 0 0 0 56 - In einer Binärdatei gibt es keinen NULL. ASCII und seine Ersetzungen codieren NULL als Nullbyte – Adrian

Antwort

2

StreamWriter ist für Text und BinaryWriter schreibt die tatsächliche binäre Darstellung von dem, was Sie schreiben möchten. Ich bin mir nicht 100% sicher, aber fast :).

14

Der binäre Writer schreibt die In-Memory-Binärdarstellung der Ganzzahl. Der Stream Writer schreibt die ASCII-Darstellung. Im Allgemeinen kann ersteres kompakter und effizienter sein (man denke an das Schreiben der ganzen Zahl 23861398 - der binäre Schreiber würde 4 Bytes benötigen, aber der Stromschreiber würde 8, 16 oder sogar 32 abhängig von der Kodierung benötigen), aber letzteres ergibt einfach alter Text.

19

Aus den MSDN-Seiten für StreamWriter und BinaryWriter Sie können sehen, die Unterschiede deutlich:

Stream:

Implementiert eine Textwriter Zeichen in einen Stream in einer bestimmten Codierung für das Schreiben.

Und:

Binary:

Schreibt primitive Typen in Binär einen Strom und unterstützt Strings in eine spezielle Codierung zu schreiben.

Der erste schreibt Dinge wie Text, der zweite in binärer schreibt, little endian, so würde int x = 5600111000 00000000 00000000 00000000 geschrieben werden.

5

Von dem, was ich erkennen kann ... Stream ist für Text und Binary ist für primitive Typen, einschließlich Folgen von speziellen Kodierungen. Zu sagen, dass der BinaryWriter binär schreibt, ist für Leute, die Dinge für bare Münze nehmen, irgendwie irreführend ... wie ich es getan habe. Ich nahm an, dass, wenn ich eine Ganzzahl in den zugrunde liegenden Stream schreibe, würde es tatsächlich in Binärdatei schreiben und ich könnte es wieder als ein Strom von 1 und 0's lesen. Um die Dinge hinstellen, wie es in Code aussieht:

MemoryStream stream = new MemoryStream(); 

BinaryWriter bw = new BinaryWriter(stream); 

bw.Write(35); 

// is equivalent to doing: 

stream.Write(BitConverter.GetBytes((int)35), 0, 4); 

Obwohl das Binary Bit verwendet Verschieben des Bytes zu extrahieren und BitConverter verwendet unsichere Zeiger Gießen, das Ergebnis ist das gleiche. Ein Int ist 32 Bit oder 4 Byte lang, und alles, was es einfach tut, schreibt die Bytes, die dieses Int darstellen, in seinen zugrunde liegenden Stream.

Stream macht das Gleiche, nur dass es für Text gemeint ist, also ganze Zahlen werden nicht an Bytes umgewandelt werden, sondern zu chars ... das ist zum Schreiben ähnlich:

byte[] buffer = Encoding.UTF8.GetBytes("my string here 1234"); 
stream.Write(buffer, 0, buffer.Length); 

Deshalb habe ich sagte es ist irreführend zu sagen, es schreibt in Binärdatei .. weil es technisch ist. Zerlegen Sie jedes geschriebene Byte in Bits und Sie erhalten die Binärwerte. Es wäre jedoch sinnvoller zu sagen, dass primitive Typen als Byte-Arrays geschrieben werden.Wenn Sie den Stream in eine Zeichenfolge konvertieren würden, würden Sie keine Zeichenfolge von 1 und 0 erhalten.

+0

FYI 'stream.Write (BitConverter.GetBytes ((int) 35), 0, 4));' kompiliert nicht – Kcvin

+0

lol Es tut mir leid, dass ich das aus dem Speicher schrieb. Entfernen Sie einfach die zusätzliche Klammer nach der 4 <. <--- bearbeiteten Antwort – SilverX

Verwandte Themen