2016-03-10 19 views
10

Sto usando BinaryWriter nel mio codice, qui è il mio codice:C# BinaryWriter - e endianness

static void Main(string[] args) 
{ 
    FileInfo file = new FileInfo(@"F:\testfile"); 
    if (file.Exists) file.Delete(); 
    using (BinaryWriter bw = new BinaryWriter(file.Create())) 
    { 
     ushort a = 1024; 
     ushort b = 2048; 
     bw.Write(a); 
     bw.Write(b); 
     bw.Write(a); 
     bw.Write(b); 
    } 
    Console.ReadLine(); 
} 

Ma l'esagono del file di output è:

enter image description here

enter image description here

Non è che 0x0004 = 4? perché?

risposta

10

Sebbene 1024 sia 0x0400. Quando si tratta di archiviare questo file o memoria, viene visualizzata la domanda nel caso in cui si utilizzi la notazione little endian o big endian?

In caso di BinaryWriter, è little endian. Il che significa che LSB va per primo - poi arriva l'MSB. Quindi, è memorizzata come:

LSB | MSB 
00 04 

Si può leggere di più su endianness.

+0

Sì, grazie mille. –

4

Se non sbaglio, nel display l'endianità dell'output è invertita rispetto alle vostre aspettative. Sebbene la rappresentazione esadecimale di 1024 sia 0400, potrebbe essere memorizzata come 0004, a seconda della endianità della codifica o della piattaforma.

4

Come sidenote, si scrive nel file esattamente come è specificato nella msdn:

Osservazioni

negozi BinaryWriter questo tipo di dati in formato little endian.

Quello che hai chiesto è "formato big endian". Dovrai reimplementare lo BinaryWriter per farlo.

Si noti che BinaryWriter ha un comportamento diverso da BitConverter. BinaryWriter è "sempre little endian", mentre BitConverter.GetBytes(ushort) (che è una funzione totalmente diversa ma che ha una connessione "comune": la conversione dei numeri in byte) è "local-endian" (quindi utilizza la endianità del computer)

Nota

l'ordine dei byte nella matrice restituita dalle GetBytes metodo dipende dal fatto che l'architettura del computer è little endian o big-endian.

Alla fine su PC Intel/AMD questa differenza è discutibile: Intel è Little Endian, quindi sono quasi tutti i telefoni cellulari. L'unica grande eccezione che so che supporta .NET (in una versione speciale) è la Xbox 360.

+0

Questi sono davvero utili, molte grazie. –