The first thing to note is that you can't define those structs in C, C++, or C# - variable names cannot start with a numeric digit in any of those languages.
So quite probably, what you are sending / receiving is nothing like what you expected because that code will not compile, and you are probably running old EXE files.
But ... even if you fix that, when you define a struct like this:
Typedef struct {
char c1;
float f;
char c2;
} Payload;
You will not get a 6 byte struct - floats have to be aligned to a 4 byte address boundary, so your first char will be "padded" to occupy 4 bytes. Aditionally, the final char will also be padded to a 4 byte boundary, which is why you get 12 bytes shown here:
#include <stdio.h>
typedef struct {
char c1;
float f;
char c2;
} Payload;
int main()
{
printf("%lu\n", sizeof(Payload));
return 0;
}
Exactly the same thing will happen with C#, for the same reasons.
The next thing to consider is "endianness" - in this case you are probably OK, because both the PC and the Arduino are "little endian" - which means that numbers are stored with the least significant byte of the value in the lowest memory byte address. But be aware that that is not the case for all systems!