Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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
file001 (Normal User)
Rookie


Messaggi: 32
Iscritto: 18/06/2013

Segnala al moderatore
Postato alle 15:25
Venerdì, 20/09/2013
salve a tutti,

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


pierotofy.it
PM Quote
Avatar
dmr (Normal User)
Pro


Messaggi: 141
Iscritto: 04/01/2012

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


Principali interessi: Compilatori e generatori di parser.
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

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



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
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



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM Quote
Avatar
Ultimo (Member)
Expert


Messaggi: 513
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:


Ultimo (Hai voluto la bicicletta ? ....)

Studiare LINQ, WPF, ASP.NET MVC, Entity Framwork, C#, Blend, XAML, Javascript, HTML5, CSS .....(tanta roba)

https://www.dropbox.com/s/c2aots5x4urgbhf/setup_game_sudoku ...
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
file001 (Normal User)
Rookie


Messaggi: 32
Iscritto: 18/06/2013

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()"


pierotofy.it
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



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo