如何将浮点数组转换为字节数组?

时间:2012-11-28 08:39:00

标签: c# arrays floating-point byte converter

  

可能重复:
  Convert an array of different value types to a byte array

我有6个浮点数,我需要将它们放在一个浮点数组中,然后将它们转换为字节。我们走了:

float x= g.transform.position.x;
float y= g.transform.position.y;
float z= g.transform.position.z;
float alpha = g.transform.rotation.eulerAngles.x;
float theta = g.transform.rotation.eulerAngles.y;
float phi =  g.transform.rotation.eulerAngles.z;

将浮点数组转换为字节数组的最佳方法是什么?

5 个答案:

答案 0 :(得分:2)

byte[] data = new float[]{x,y,z,alpha,theta,phi}
                  .SelectMany(f => BitConverter.GetBytes(f)).ToArray();

或(取决于消费者的计算机架构)

byte[] data = new float[]{x,y,z,alpha,theta,phi}
              .SelectMany(f => BitConverter.GetBytes(f).Reverse()).ToArray();

您可能还想使用BitConverter.IsLittleEndian来决定选择哪一个作为@CodesInChaos建议

答案 1 :(得分:0)

float[] source = new float[100];
byte[] dest = new byte[source.Length * sizeof(float)];
Buffer.BlockCopy(source, 0, dest, 0, dest.Length);

答案 2 :(得分:0)

尝试类似:

var farray = new float[] {12.4f, 12.3f, 4.5f}; // or what ever values you want.
var bArray = new byte[farray.Length];
Buffer.BlockCopy(farray, 0, bArray, 0, bArray.Length);
        foreach (byte value in bArray)
            Console.Write("{0}  ", value);

有关详细信息,请访问MSDN

希望这有帮助。

答案 3 :(得分:0)

如果原生字节序和LINQ可以接受,那么L.B的答案很好。如果您想要一致(小)字节序,请使用BinaryWriter

using(var stream = new MemoryStream())
using(var writer = new BinaryWriter(stream))
{
   writer.Write(x);
   writer.Write(y);
   ...
   return stream.ToArray();
}

如果要使用大字节序,可以使用以下辅助方法:

byte[] GetBytesBigEndian(float f)
{
  var bytes = BitConverter.GetBytes(f);
  if(BitConverter.IsLittleEndian)
    Array.Reverse(bytes);
  return bytes;
}

using(var stream = new MemoryStream())
using(var writer = new BinaryWriter(stream))
{
   writer.Write(GetBytesBigEndian(x));
   writer.Write(GetBytesBigEndian(y));
   ...
   return stream.ToArray();
}

如果这太慢了,还有一些unsafe技巧可以加快它的速度。

答案 4 :(得分:0)

这是一种厚颜无耻的方式:

float x = 1F;
float y = 2F;
float z = 3F;
float alpha = 4F;
float theta = 5F;
float phi = 6F;
byte[] raw = new byte[6 * sizeof(float)];
fixed (byte* ptr = raw)
{
    float* typed = (float*)ptr;
    typed[0] = x;
    typed[1] = y;
    typed[2] = z;
    typed[3] = alpha;
    typed[4] = theta;
    typed[5] = phi;
}
return raw;
但是,请注意,它会对字节序进行分析。您可能需要检查BitConverter.IsLittleEndian并在必要时反转每个4字节块。

当然,如果你可以重用现有的缓冲区,那就更好了。相同的方法 - 只需将现有byte[]作为参数传递,而不是每次都创建一个新参数。