Oppure

Loading
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 15:09
dmr
aaa
20/09/13 18:09
netarrow
Potresti usare BitConverter: msdn.microsoft.com/it-it/library/…
aaa
20/09/13 18:49
ZioCrocifisso
Basta qualche operazione bitwise...
csharp-examples.net/reverse-bytes/
aaa
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 :yup:
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
22/09/13 18:20
Concordo con netarrow, usare BitConverter è molto più leggibile

ho provato il codice

short input = 258;
byte[] bytes = BitConverter.GetBytes (input);
Int16 littleEndian = BitConverter.ToInt16 (bytes.ToArray(), 0);
Int16 bigEndian = BitConverter.ToInt16 (bytes.Reverse().ToArray(), 0);


però mi appaiono due errori, il primo dove c'è scritto "bytes.ToArray()" e il secondo dove c'è scritto "bytes.Reverse()"