20/09/13 13:25
salve a tutti,
vorrei sapere come posso leggere valori int16 scritti con codifica big endian? Grazie in anticipo
20/09/13 20:02
netarrow
Le bitwise le usa BitConverter sotto. Se il framework ti offre già gli strumenti, tra l'altro affidabili e perfettamente ottimizzati, perchè non usarli?
Poi è anche una questione di leggibilità, scrivere questo:
short input = 258;
byte[] bytes = BitConverter.GetBytes (input);
Int16 littleEndian = BitConverter.ToInt16 (bytes.ToArray(), 0);
Int16 bigEndian = BitConverter.ToInt16 (bytes.Reverse().ToArray(), 0);
E' estremamente più leggibile che portarsi dentro un metodo che fa questo giro:
(UInt16)((value & 0xFFU) << 8 | (value & 0xFF00U) >> 8);
o peggio ancora
(value & 0x00000000000000FFUL) << 56 | (value & 0x000000000000FF00UL) << 40 |
(value & 0x0000000000FF0000UL) << 24 | (value & 0x00000000FF000000UL) << 8 |
(value & 0x000000FF00000000UL) >> 8 | (value & 0x0000FF0000000000UL) >> 24 |
(value & 0x00FF000000000000UL) >> 40 | (value & 0xFF00000000000000UL) >> 56;
Che poi dentro BitConverter faccia operazioni simili è un altro discorso, ma sarà codice che non si vedrà mai e non crea "rumore".
Ultima modifica effettuata da netarrow 20/09/13 20:05
aaa
20/09/13 21:29
Ultimo
Postato originariamente da netarrow:
Le bitwise le usa BitConverter sotto. Se il framework ti offre già gli strumenti, tra l'altro affidabili e perfettamente ottimizzati, perchè non usarli?
Poi è anche una questione di leggibilità, scrivere questo:
short input = 258;
byte[] bytes = BitConverter.GetBytes (input);
Int16 littleEndian = BitConverter.ToInt16 (bytes.ToArray(), 0);
Int16 bigEndian = BitConverter.ToInt16 (bytes.Reverse().ToArray(), 0);
E' estremamente più leggibile che portarsi dentro un metodo che fa questo giro:
(UInt16)((value & 0xFFU) << 8 | (value & 0xFF00U) >> 8);
o peggio ancora
(value & 0x00000000000000FFUL) << 56 | (value & 0x000000000000FF00UL) << 40 |
(value & 0x0000000000FF0000UL) << 24 | (value & 0x00000000FF000000UL) << 8 |
(value & 0x000000FF00000000UL) >> 8 | (value & 0x0000FF0000000000UL) >> 24 |
(value & 0x00FF000000000000UL) >> 40 | (value & 0xFF00000000000000UL) >> 56;
Che poi dentro BitConverter faccia operazioni simili è un altro discorso, ma sarà codice che non si vedrà mai e non crea "rumore".
Per non reinventare la ruota
If ok Then GOTO Avanza else GOTO Inizia
21/09/13 10:50
ZioCrocifisso
Con BitConverter sono necessari vari passaggi che sono sicuramente meno efficienti degli operatori bitwise. Inoltre gli serve per numeri a 16 bit, è un'operazione più corta e comprensibile, non è quella che hai messo dopo. E se crea una funzione apposita con nome corretto, si capisce subito cosa fa, anche con gli operatori bitwise (che comunque, nel caso dei numeri a 16 bit, sono più chiari).
Ultima modifica effettuata da ZioCrocifisso 21/09/13 10:57
aaa