-2

可能重复:
将不同值类型的数组转换为字节数组

我有 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;

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

4

5 回答 5

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 的建议来决定选择哪一个

于 2012-11-28T08:48:59.850 回答
0
float[] source = new float[100];
byte[] dest = new byte[source.Length * sizeof(float)];
Buffer.BlockCopy(source, 0, dest, 0, dest.Length);
于 2012-11-28T08:53:32.587 回答
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[]参数作为参数传递,而不是每次都创建一个新参数。

于 2012-11-28T09:25:37.747 回答
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

希望这可以帮助。

于 2012-11-28T08:54:50.157 回答
0

如果本机字节序和 LINQ 是可以接受的,LB 的答案很好。如果您想要一致的(小)字节序,请使用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技巧可以加快速度。

于 2012-11-28T08:55:26.617 回答