Funktion und byte array übergabe

Hallo,

ich habe einen float wert byte weise vorliegen, leider in der falschen reihenfolge
funktionieren tut dies

byte wertvorliegend[4];
byte wertswap[4];
float wertfloat;


wertswap[0] = wertvorliegend[3];
wertswap[1] = wertvorliegend[2];
wertswap[2] = wertvorliegend[1];
wertswap[3] = wertvorliegend[0];

wertfloat = *(float*)&wertswap[0])

da ich das ganze einge male umwandeln muss würde ich es gern über eine Funktion machen, aber irgendwie klappt es nicht :frowning:

dies ist mein nicht funktionierender ansatz:
Aufruf:

wertfloat = bytetofloat (wertvorliegend[3], wertvorliegend[2], wertvorliegend[1], wertvorliegend[0]);

Funktion:

float bytetofloat(byte readb[4]){

float ergebnis = *(float*)&readb[0];
return ergebnis
}

Danke für eure Hilfe

Sorry, ich verstehe es nicht.

was genau ist deinen 4 bytewerten drin?
die 4 bytes eine 4-Byte Float zahl?

du wertest doch bloß ein Byte aus.

Ja ich habe ein byte array mit 200 bytes diese ergeben 50 float werte, aber eben stimmt die Reihenfolge der bytes nicht, um diese direkt aus dem vorliegenden array in float umwandeln könnte.

Wie kommst du auf diesen Aufruf der Funktion? Natürlich geht das nicht. Wenn du ein Array hast dann musst du auch ein Array übergeben! Und nicht die einzelnen Werte

Übergebe ein Array und dreh es in einer temporären Variable:

float byteToFloat(byte* bytes)
{
  byte temp[4];

  temp[0] = bytes[3];  
  temp[1] = bytes[2];  
  temp[2] = bytes[1];  
  temp[3] = bytes[0];  

  return *(float*)&temp[0];
}

...

= ... byteToFloat(wertvorliegend);

Mit dem Zeiger kannst dann direkt einen Zeiger auf ein Byte in dem Byte Array übergeben:

byte bytes[200];
float floats[50];

....

for (int i = 0; i < sizeof(floats) / sizeof(float); i++)
{
   floats[i] = byteToFloat(&bytes[i * 4]);
}

i = 0 -> 0
i = 1 -> 4
i = 2 = 8
i = 3 = 12
....

So wird immer die Adresse des ersten Bytes des nächsten Wertes übergeben

Nimm doch einfach eine union aus beiden Arrays:

union myArrays {
  float nums[50];
  byte bytes[200];
};

Gruß Tommy

Er hat aber ein Problem mit der Endianess. z.B. Daten von einer Java-Platform senden, welche Big Endian ist. Es gibt auch andere Prozessor-Architekturen die Big Endian sind.

Danke für die Antworten, besonders Serenifly, deine Version funktioniert supper, DANKE

Union geht nicht da die reihenfolge der bytes ja nicht stimmt.

Union geht nicht da die reihenfolge der bytes ja nicht stimmt.

Natürlich geht das, auch wenn die Reihenfolge nicht stimmt.

float swapByte2float(byte * inptr)
{
  union {byte in[4];float out;}temp;
  const size_t n = sizeof(float);
  byte * p = temp.in+n-1;
  for(uint16_t i=0;i<n;i++)*p--=*inptr++;
  return temp.out;
}

Am ressourcenschonendsten wäre es eine große Union zu haben wie oben gesagt, aber dann die Werte im Byte Array in situ zu vertauschen. Dann belegt man nur einmal 200 Bytes