2009-08-21 19 views
9

Se io dichiaroC# bandiere dimensione della parola enum

[Flags] 
public enum MyColor 
{ 
    Red = 1; 
    Green = 2; 
    Blue = 4; 
    White = 8; 
    Magenta = 16; 
    ... (etc) 
} 

C'è un modo per determinare/impostare il numero di byte che questo enum occupa? Inoltre, quale ordine di byte finirebbe in? (Ad esempio, devo eseguire un HostToNetwork() per inviarlo correttamente via cavo?) Inoltre, per chiamare HostToNetwork, posso eseguire il cast come array di byte e iterare?

+3

Non c'è bisogno che questo sia wiki della comunità. È una domanda standard. – Noldorin

+0

È possibile verificare l'endianess del sistema con 'BitConverter.IsLittleEndian' e reagire di conseguenza. – Thorarin

+0

Le flag non dovrebbero avere un valore 0 a meno che non significhi veramente "none". –

risposta

6

risposta completa è:

  • C'è un modo per determinare/impostare il numero di byte che questo enum occupa?

Sì:

[Flags] 
public enum MyColor : byte // sets the underlying type. 
{ 
    Red = 1; 
    Green = 2; 
    Blue = 4; 
    White = 8; 
    Magenta = 16; 
    ... (etc) 
} 
  • Inoltre, quale ordine sarebbe finire in byte?

Qualunque sia la compilazione, quindi per il mio caso, x86 (piccolo).

  • Inoltre, per chiamare HostToNetwork, posso eseguire il cast come array di byte e iterare?

Questo è dove è difficile. Ho scoperto alcune cose:

+0

Inoltre, è possibile * ottenere * il tipo sottostante con 'Enum.GetUnderlyingType (typeof (MyColor))': http://msdn.microsoft.com/en-us/library/system.enum.getunderlyingtype.aspx –

10
[Flags] 
public enum MyColor : byte // sets the underlying type. 
{ 
    Red = 0; 
    Green = 1; 
    Blue = 2; 
    White = 4; 
    Magenta = 8; 
    ... (etc) 
} 

Non è possibile impostare direttamente il endianness. È possibile utilizzare alcuni numeri ben congegnati che simulano i byte big-endian su un sistema little endian. Tuttavia, userei sempre API esplicite per convertire gli ordini di byte.

+4

Per riferimento, la dimensione predefinita se non specificata è Int32, e essendo numeri standard sotto la cappa hanno tutte le stesse regole di un numero quando si tratta di byte order. –