可能重复:
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;
将浮点数组转换为字节数组的最佳方法是什么?
答案 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[]
作为参数传递,而不是每次都创建一个新参数。