Conversione esadecimale

C1P8:
Non usare union e consimili immondizie

:o :o :o :o ... e per quale motivo visto che fanno parte dello standard 'C' fin dalla sua nascita?

Sono il sistema più pulito per fare quello che deve fare ... altro che casting e puntatori ... che poi capiti su architetture che memorizzano i dati diversamente e non ti funziona più nulla!

Dal Kernighan & Ritchie, capitolo 6.8:

A union is a variable that may hold (at different times) objects of different types and sizes, with the compiler keeping track of size and alignment requirements. Unions provide a way to manipulate different kinds of data in a single area of storage, without embedding any machine-dependent information in the program. They are analogous to variant records in pascal.

Guglielmo

Giusto, me ne ero dimenticato

Ma almeno che facesse una union tra una float e un array

Che gestire, oltretutto all'incontrario, 4 variabili separate è un orrore, diciamocelo!

Inoltre il problema del nostro amico continua ad essere la soppressione degli zeri superflui

Quindi union o puntatori non cambia molto

Ma con array è più elegante diciamoci anche questo

Dottarduino:
Utilizzando la bozza postata, diverse volte ho ottenuto il risultato sperato ma con il valore 35.0 ho qualche problema.
In esadecimale IEE754 mi diventa 0x42c00000 quando dovrebbe essere 0x420C0000.

Certo, perché la conversione con "String(mix.s.b4, HEX)" converte in esadecimale ma non aggiunge gli zeri iniziali. Tu vuoi poter avere sempre esattamente 2 caratteri hex (due nibble) per ogni byte, quindi ogni valore minore di 16 diventa un solo carattere, nel tuo caso il valore 12 viene convertito in "C" e non "0C" per cui quando concateni ti sballa il valore.
Tu poi vai a concatenare in fondo gli zeri se la stringa ha lunghezza inferiore a 6 caratteri, che non ha gran che senso...

Quindi per fare le cose corrette e per togliere di mezzo le String, potresti provare questo:

union mix_t {                  // Conversione IEEE754
  float f;
  struct
  { byte b1;
    byte b2;
    byte b3;
    byte b4;
  } s;
} mix;

void setup() {
  Serial.begin(9600);

  mix.s.b3 = 0x61;
  mix.s.b2 = 0xB3;
  mix.s.b1 = 0x33;
  mix.f  = 35.0;
  
  char prova[13];
  
  sprintf(prova,  "0x%02x%02x%02x%02x", mix.s.b4, mix.s.b3, mix.s.b2, mix.s.b1);
  
  Serial.println(prova);

}

void loop() {

}

Fidati, questo funziona.

PS: comunque ti manca sempre una "E", è "IEEE" non "IEE".. :wink:

Ora è tutto più chiaro. Grazie.

L'array lo posso ridurre a 10 oppure no?

Con tutte quelle "E" mi confondo :smiley: :smiley:

Dottarduino:
L'array lo posso ridurre a 10 oppure no?

No. Ogni stringa (array) deve avere una dimensione pari alla lunghezza massima della stringa più 1.

Quindi se vuoi comporre i 4 byte come coppie di digit esadecimali in una stringa che inizia con "0x" sono:
4 x 2 caratteri + 2 caratteri per "0x" + 1 = 11 caratteri