4 byte array to float conversion


I’am working on a sketch where I receive 4 data bytes which I put in an array, now I want to convert this array of 4 bytes into a float value. Below is my code, the ??? is where the magic should be but unfortunately I have no clue as in how to tackle this problem.

Any help would be much appreciated :slight_smile:

for(int i=0;i<=3;i++)
                    byte data = client.read();
                    Serial.print(data,HEX); // prints the byte in hex
                    speedArray[i] = data; // uint8_t
Serial.println(""); // linefeed
speedFloat = ??? // SnelheidFloat

If we assume that the most significant byte is sent first, then you could do it this way:

long speedLong = 0;
byte speedArray[4];

for(int i = 0; i < 4; i++)
  speedArray[i] = client.read();
  Serial.print(speedArray[i],HEX); // prints the byte in hex
  speedLong = (speedLong << 8) | speedArray[i];
Serial.println(""); // linefeed

If you don’t need to save the bytes in an array, you could use a single variable instead of speedArray inside your for loop.

Thanx Mike, I tried the conversion and it worked :), problem now is the number should have gone up slowly but it keeps jumping from negative to some positive number, I've looked up what the 4 byte data is supposed to mean but the explanation is in Delphi code:

I have looked up single and I think it is the Delphi equivelent of float so I changed to code but the same trick doesn't seem to work for float's.

procedure ConvertSingle;
  FOriginalSingle: Single;
  FTransportArray: Array[0..3] of Byte;
  FKopieSingle:    Single;

  // Init
  FOriginalSingle := 1234.9876;
  FKopieSingle    := 0.0;

  // single to byte array
  PSingle(@FTransportArray)^ := FOriginalSingle;

  // Byte array decoding to single
  FKopieSingle := PSingle(@FTransportArray)^;

I have looked up single and I think it is the Delphi equivelent of float

It is.

Does this help... http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1207242838

The post you reffered to did help me find out that the byte order is normal (byte 4 is the last in the array and byte 1 the first). I can't really get to understand the union concept. I think I have to do the opposite of union as I have to combine 4 bytes to a float.

I think I must confess I replied to soon, I copied the code from the other page and by a miracle it worked right away (now that doesn't happen very often) :)

the code I used to convert is: In which snelheidArray[] are the bytes

float snelheid;

union u_tag {
    byte b[4];
    float fval;
} u;

u.b[0] = snelheidArray[0];
u.b[1] = snelheidArray[1];
u.b[2] = snelheidArray[2];
u.b[3] = snelheidArray[3];

snelheid = u.fval;

Thanx for the help!!!, I can now use a computer trainsimulator game to send over the internet the speed the train is driving to an analogue 60 year old speedgauge using the Arduino MEGA and Ethernet Shield. Isn't life beautyful ;D

Isn't life beautyful

I agree!

I'm glad you got it working.