This is an "Arduino" version. It works a little different 
It starts from the first byte and treats that byte (and consecutive bytes) as char, 8bit int, 16bit int (2 bytes), 32bit int (4 bytes) and ad float (4 bytes).
Next it takes the next byte as the starting point and repeats.
If you get nan or ovf for the float at a given index, you know that those 4 bytes don't represent a float.
The htons() etc in the beginning are borrowed from a network library (file w5100.h).
The sample data is a subset of yours.
#ifndef htons
// The host order of the Arduino platform is little endian.
// Sometimes it is desired to convert to big endian (or
// network order)
// Host to Network short
#define htons(x) ( (((x)&0xFF)<<8) | (((x)>>8)&0xFF) )
// Network to Host short
#define ntohs(x) htons(x)
// Host to Network long
#define htonl(x) ( ((x)<<24 & 0xFF000000UL) | \
((x)<< 8 & 0x00FF0000UL) | \
((x)>> 8 & 0x0000FF00UL) | \
((x)>>24 & 0x000000FFUL) )
// Network to Host long
#define ntohl(x) htonl(x)
#endif // !defined(htons)
#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))
byte data[] = {86, 53, 71, 0, 0, 212, 65, 12, 242, 252, 68, 255, 255, 255, 255, 0, 224, 73, 68, 0,
0, 148, 65, 10, 215, 163, 60, 255, 255, 255};
int16_t i = 0x1234;
void setup()
{
Serial.begin(115200);
while (!Serial) {};
Serial.println(F("RAW data"));
for (uint16_t cnt = 0; cnt < NUMELEMENTS(data); cnt++)
{
if (cnt % 8 == 0)
{
Serial.println();
}
if (data[cnt] < 0x10)
{
Serial.print("0");
}
Serial.print(data[cnt], HEX);
Serial.print(" ");
}
Serial.println();
Serial.println();
// 8-bit integer
for (uint16_t cnt = 0; cnt < NUMELEMENTS(data); cnt++)
{
int8_t i8 = data[cnt];
int16_t *i16 = (int16_t*)&data[cnt];
int32_t *i32 = (int32_t*)&data[cnt];
float *f = (float*)&data[cnt];
Serial.print(F("index = "));
Serial.println(cnt);
Serial.print(F("char = "));
Serial.print((char)i8);
Serial.print(F(" ("));
Serial.print((uint8_t)i8, HEX);
Serial.println(F(")"));
Serial.print(F("i8 = "));
Serial.print(i8);
Serial.print(F(" ("));
Serial.print((uint8_t)i8, HEX);
Serial.println(F(")"));
Serial.print(F("i16 = "));
Serial.print(*i16);
Serial.print(F(" ("));
Serial.print((uint16_t)*i16, HEX);
Serial.println(F(")"));
Serial.print(F("i16 swapped = "));
Serial.print(htons(*i16));
Serial.print(" (");
Serial.print(htons((uint16_t)*i16), HEX);
Serial.println(F(")"));
Serial.print(F("i32 = "));
Serial.print(*i32);
Serial.print(F(" ("));
Serial.print((uint32_t)*i32, HEX);
Serial.println(F(")"));
Serial.print(F("i32 swapped = "));
Serial.print(htonl(*i32));
Serial.print(F(" ("));
Serial.print(htonl((uint32_t)*i32), HEX);
Serial.println(F(")"));
Serial.print(F("f = "));
Serial.print(*f, 6);
Serial.print(F(" ("));
Serial.print((uint32_t)*i32, HEX);
Serial.println(F(")"));
Serial.println("============================");
}
}
void loop()
{
// put your main code here, to run repeatedly:
}
Partial output
11:55:14.016 -> RAW data
11:55:14.016 ->
11:55:14.016 -> 56 35 47 00 00 D4 41 0C
11:55:14.016 -> F2 FC 44 FF FF FF FF 00
11:55:14.016 -> E0 49 44 00 00 94 41 0A
11:55:14.016 -> D7 A3 3C FF FF FF
11:55:14.016 ->
11:55:14.016 -> index = 0
11:55:14.016 -> char = V (56)
11:55:14.016 -> i8 = 86 (56)
11:55:14.016 -> i16 = 13654 (3556)
11:55:14.016 -> i16 swapped = 22069 (5635)
11:55:14.016 -> i32 = 4666710 (473556)
11:55:14.016 -> i32 swapped = 1446332160 (56354700)
Not shown is the float output (I ran out of time due to load shedding).
Also time ran out to add a little hardening as it will read some crap at the end of the array when using 2byte or 4byte variables.
Not fully tested !!