Forum: Compiler & IDEs Double in Byte Array und zurück


von Philipp M. (lord-maricek)


Lesenswert?

Hi,

ich versuche gerade ein double oder float (sind soweit ich weiß in 
avr-gcc beides 4 Byte lang) in seine Bestandteile bzw. einzelne bytes zu 
zerlegen.
Die sollen dann in unsogned chars gespeichert werden.

Ich habe schon versucht mit einem (unsigned char) vor der zahl das erste 
Byte in einer Varibale zu speichern, und dann mit ([zahl]>>8) die 
nächsten Bytes an den Anfang zu schieben und dann wieder zu speichern. 
Das klappt aber leider nicht so ganz.

Habt ihr ne Idee wie das gehen könnte?

MfG
Philipp

von willibald (Gast)


Lesenswert?

Philipp Maricek schrieb:
> Ich habe schon versucht mit einem (unsigned char) vor der zahl das erste
> Byte in einer Varibale zu speichern, und dann mit ([zahl]>>8) die
> nächsten Bytes an den Anfang zu schieben und dann wieder zu speichern.
> Das klappt aber leider nicht so ganz.

nein, denn der Typecast wandelt den float-Zahlenwert in einen 
unsigned-Zahlenwert um (unter Verlust der Nachkommastellen und der 
höheren Bytes).

> Habt ihr ne Idee wie das gehen könnte?

Etwa so (ohne Test hingekritzelt):
1
float f = 3.14;
2
unsigned char bytes[sizeof (f)];
3
unsigned char * pf = (unsigned char *) &pf;
4
for (int i = 0; i < sizeof(f); i++)
5
{
6
    bytes[i] = pf[i];
7
}

von willibald (Gast)


Lesenswert?

willibald schrieb:
> Etwa so (ohne Test hingekritzelt):
> unsigned char * pf = (unsigned char *) &pf;

Sorry, vertippt. So:
1
unsigned char * pf = (unsigned char *) &f;

von Linker (Gast)


Lesenswert?

1
union floatmem {
2
  float f;
3
  unsigned char pch[sizeof(float)];
4
} foolunion;
5
6
...
7
8
foolunion.f = 3.141;
9
10
for (int i=0;i<sizeof(float);i++)
11
  dosomething(foolunion.pch[i]);

von Philipp M. (lord-maricek)


Lesenswert?

Danke euch beiden.

MfG
Philipp

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.