36.0 和 5.832204E-42 是字节序相反的,因此这是一个字节序问题。在 Windows / .NET 上,通常是小端字节序,因此我猜测数据是大端字节序。这意味着您需要反转数据对于每个值,分别(不是整个数组)。
要以 CPU 安全的方式编写此代码,最好的选择是检查BitConverter.IsLittleEndian
,并在必要时进行补偿。例如:
public static float ReadSingleBigEndian(byte[] data, int offset)
{
return ReadSingle(data, offset, false);
}
public static float ReadSingleLittleEndian(byte[] data, int offset)
{
return ReadSingle(data, offset, true);
}
private static float ReadSingle(byte[] data, int offset, bool littleEndian)
{
if (BitConverter.IsLittleEndian != littleEndian)
{ // other-endian; reverse this portion of the data (4 bytes)
byte tmp = data[offset];
data[offset] = data[offset + 3];
data[offset + 3] = tmp;
tmp = data[offset + 1];
data[offset + 1] = data[offset + 2];
data[offset + 2] = tmp;
}
return BitConverter.ToSingle(data, offset);
}
with:
float x= ReadSingleBigEndian(data, 0);
float y= ReadSingleBigEndian(data, 4);
float z= ReadSingleBigEndian(data, 8);
float alpha= ReadSingleBigEndian(data, 12);
float theta= ReadSingleBigEndian(data, 16);
float phi= ReadSingleBigEndian(data, 20);