2011-01-06 15 views
17

questo veramente mi confonde, dico che voglio salvare un intero in un file, int x = 56, il binarywriter accetta l'equivalente ascii della rappresentazione di 56 nella memoria 00000000 00000000 00000000 00111000, che sarebbe: null null null 8 e scriverlo nel file? ho ragione? qualcuno può spiegare come quei due twofunction e quando dovrei usare ciascuno di loro? sto usando C# btw. grazie in anticipo!qual è la differenza tra uno streamwriter e un binarywriter?

+0

Questa è la rappresentazione binaria, non ASCII. –

+1

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

+0

Non è NULL NULL NULL 8 è 0 0 0 56 - in un file binario non c'è NULL. ASCII e le sue dirette codificano NULL come un byte zero – Adrian

risposta

2

StreamWriter è per il testo e BinaryWriter scrive la rappresentazione binaria effettiva di ciò che si desidera scrivere. Non sono sicuro al 100%, ma quasi :).

14

Lo scrittore binario scrive la rappresentazione binaria in memoria dell'intero. Lo scrittore di stream scrive la rappresentazione ASCII. In generale, il primo può essere più compatto ed efficiente (si consideri la scrittura del numero intero 23861398 - lo scrittore binario richiederebbe 4 byte, ma lo scrittore dello stream richiederebbe 8, 16 o anche 32 a seconda della codifica) ma quest'ultimo risulta in chiaro vecchio testo

19

Dalle pagine MSDN per StreamWriter e BinaryWriter si può chiaramente vedere le differenze:

StreamWriter:

Implementa un TextWriter per la scrittura caratteri in un flusso in un particolare codifica.

E:

BinaryWriter:

Scrive tipi primitivi in ​​binario in un flusso e supporta la scrittura di stringhe in una codifica specifica.

Il primo scrive le cose come testo, il secondo scrive in binario, little endian, così int x = 56 sarebbe da scrivere 00111000 00000000 00000000 00000000.

5

Da quello che posso discernere ... StreamWriter è più per il testo e BinaryWriter è per i tipi primitivi incluse le stringhe di particolari codifiche. Dire che BinaryWriter scrive in binario è in qualche modo fuorviante per le persone che prendono le cose al valore nominale ... come ho fatto io. Supponevo che scrivendo un intero al flusso sottostante lo scrivessi effettivamente in binario e potessi leggerlo di nuovo come flusso di 1 e 0. per mettere le cose in giù come appare nel codice:

MemoryStream stream = new MemoryStream(); 

BinaryWriter bw = new BinaryWriter(stream); 

bw.Write(35); 

// is equivalent to doing: 

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

Anche se il BinaryWriter utilizza po 'spostando per estrarre i byte e BitConverter utilizza pericoloso puntatore fusione, il risultato è lo stesso. Un int è di 32 bit o 4 byte di lunghezza e tutto ciò che fa semplicemente è scrivere i byte che rappresentano quell'int al suo stream sottostante.

StreamWriter fa la stessa cosa solo che ha significato per il testo, in modo da numeri interi non saranno convertiti in byte, ma invece di caratteri ... questo è simile alla scrittura:

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

Ecco perché ha detto che è fuorviante dire che scrive in binario .. perché lo fa .. tecnicamente. Analizza ogni byte scritto in bit e ottieni i valori binari. Tuttavia avrebbe più senso dire che scrive tipi primitivi come array di byte.Se si dovesse convertire lo stream in una stringa non si otterrebbe una stringa di 1 e 0.

+0

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

+0

lol Mi dispiace di averlo scritto dalla memoria. basta rimuovere la parentesi quadra dopo la 4 <. <--- risposta modificata – SilverX

Problemi correlati