Let con differenza tra StreamWriter
e BinaryWriter
. StreamWriter
è per la scrittura di una rappresentazione testuale in un flusso. StreamWriter
converte tutto ciò che viene scritto (tramite metodo Write *) in una stringa, quindi converte tramite la codifica in byte e scrive i byte nel flusso sottostante.
BinaryWriter
è per la scrittura di tipi di dati grezzi "primitivi" in un flusso. Per i tipi numerici prende la rappresentazione in memoria, alcuni funzionano fino a normalizzare la rappresentazione (ad esempio per gestire le differenze in endianess) e quindi scrivono i byte nel flusso sottostante. Si noti che ha anche una codifica fornita nel costruttore. Viene utilizzato solo per convertire char
e string
in byte. La codifica predefinita è UTF8.
La dimensione di ciascun carattere in ASCII (StreamWriter) richiede 1 byte sia esso un numero o un carattere.
Questa è una dichiarazione un po 'confusa per me. Permettimi di chiarire. Il int
1 verrà convertito nella stringa "1" che codifica in ASCII come 49 che è effettivamente un byte, ma 100 verrà convertito nella stringa "10000" che codifica in ASCII a 49 48 48 48 48, quindi questo è 5 byte . Se si utilizza BinaryWriter
entrambi occuperebbero 4 byte (la dimensione di un int
).
Analogamente, quale sarà la dimensione di ogni carattere, intero in binario? (BinaryWriter). Qualcuno può spiegare in breve?
La dimensione di un char
dipende dalla codifica utilizzata sia per BinaryWriter
e StreamWriter
. La dimensione dei tipi numerici come int
, long
, double
sono le dimensioni dei tipi sottostanti, 4, 8 e 8 byte rispettivamente. La quantità di dati scritti è documentata in ogni Write overload di BinaryWriter. Le stringhe vengono trattate distintamente da char[]
in BinaryWriter e avranno la loro lunghezza prefissata prima che i byte codificati vengano scritti.
fonte
2015-12-18 08:30:34
'sizeof (char) == 2', quindi il carattere singolo è * 2 byte * lungo; tuttavia, la dimensione di 'Stream' dipende dalla codifica (Ascii, UTF-8 ecc.) e dai caratteri stessi:' aaa' (3 lettere inglesi 'a') può essere più breve di' ааа' (3 * Russo * lettere 'A ') –
Un' char' in C# è UTF-16, questo significa che ogni carattere richiede 2 byte. Un tipo intergrale dipende dalla sua dimensione, il che significa che può essere un singolo byte ('Byte'), un' Short' (16 bit), 'int' (32 bit),' long' (64 bit). –
Quasi (ma non del tutto) ogni volta che vedo qualcuno usare 'BinaryWriter', lo usano per ragioni scarsamente prese in considerazione. Che cosa hai bisogno di fare qui? Un serializzatore binario sarebbe una scelta migliore? (ce ne sono diversi tra cui scegliere) –