Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [c#] convertire con codifica big endian
Forum - C# / VB.NET - [c#] convertire con codifica big endian

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
salve a tutti,

vorrei sapere come posso leggere valori int16 scritti con codifica big endian? Grazie in anticipo

PM Quote
Avatar
dmr (Normal User)
Pro


Messaggi: 141
Iscritto: 04/01/2012

Segnala al moderatore
Postato alle 17:09
Venerdì, 20/09/2013

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 20:09
Venerdì, 20/09/2013

PM Quote
Avatar
ZioCrocifisso (Member)
Pro


Messaggi: 135
Iscritto: 06/03/2013

Segnala al moderatore
Postato alle 20:49
Venerdì, 20/09/2013
Basta qualche operazione bitwise...
http://www.csharp-examples.net/reverse-bytes/

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 22:02
Venerdì, 20/09/2013
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:

Codice sorgente - presumibilmente C# / VB.NET

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



E' estremamente più leggibile che portarsi dentro un metodo che fa questo giro:

Codice sorgente - presumibilmente Plain Text

  1. (UInt16)((value & 0xFFU) << 8 | (value & 0xFF00U) >> 8);
  2.  
  3. o peggio ancora
  4.  
  5.  (value & 0x00000000000000FFUL) << 56 | (value & 0x000000000000FF00UL) << 40 |
  6.          (value & 0x0000000000FF0000UL) << 24 | (value & 0x00000000FF000000UL) << 8 |
  7.          (value & 0x000000FF00000000UL) >> 8 | (value & 0x0000FF0000000000UL) >> 24 |
  8.          (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 il 20/09/2013 alle 22:05
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 23:29
Venerdì, 20/09/2013
Testo quotato

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:

Codice sorgente - presumibilmente C# / VB.NET

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



E' estremamente più leggibile che portarsi dentro un metodo che fa questo giro:

Codice sorgente - presumibilmente Plain Text

  1. (UInt16)((value & 0xFFU) << 8 | (value & 0xFF00U) >> 8);
  2.  
  3. o peggio ancora
  4.  
  5.  (value & 0x00000000000000FFUL) << 56 | (value & 0x000000000000FF00UL) << 40 |
  6.          (value & 0x0000000000FF0000UL) << 24 | (value & 0x00000000FF000000UL) << 8 |
  7.          (value & 0x000000FF00000000UL) >> 8 | (value & 0x0000FF0000000000UL) >> 24 |
  8.          (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

PM Quote
Avatar
ZioCrocifisso (Member)
Pro


Messaggi: 135
Iscritto: 06/03/2013

Segnala al moderatore
Postato alle 12:50
Sabato, 21/09/2013
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 il 21/09/2013 alle 12:57
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 20:20
Domenica, 22/09/2013
Concordo con netarrow, usare BitConverter è molto più leggibile

ho provato il codice

Codice sorgente - presumibilmente C# / VB.NET

  1. short input = 258;
  2. byte[] bytes = BitConverter.GetBytes (input);
  3. Int16 littleEndian = BitConverter.ToInt16 (bytes.ToArray(), 0);
  4. 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()"

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 20:21
Domenica, 22/09/2013
Probabilmente ti manca la using di System.Linq

Ultima modifica effettuata da netarrow il 22/09/2013 alle 20:22
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo