将byte []转换为float []的速度最快,反之亦然(当然没有循环)。
我现在正在使用BlockCopy,但后来我需要双内存。我想要某种演员。
我需要进行此转换只是为了通过套接字发送数据并在另一端重建数组。
答案 0 :(得分:7)
毫无疑问,msarchet的提议也会复制。你正在谈论的只是改变.NET思考内存区域的方式,如果你不想复制的话。
但是,我不认为你想要的是什么,因为字节和浮点数在内存中的表示完全不同。一个字节在内存中只使用一个字节,但浮点数使用4个字节(32位)。
如果您没有存储数据的内存要求,只需将数据表示为您在内存中使用最多的数据类型,并在使用时转换实际使用的值。
你想如何将浮点数(可以表示±1.5×10-45和±3.4×10 ^ 38之间的值)转换成一个字节(可以表示0到255之间的值)?
(查看更多关于她的信息:
有关.NET中浮动类型的更多信息,请访问:http://csharpindepth.com/Articles/General/FloatingPoint.aspx
答案 1 :(得分:4)
您可以使用StructLayout来实现此目的(来自Stack Overflow问题 C# unsafe value type array to byte array conversions ):
[StructLayout(LayoutKind.Explicit)]
struct UnionArray
{
[FieldOffset(0)]
public Byte[] Bytes;
[FieldOffset(0)]
public float[] Floats;
}
static void Main(string[] args)
{
// From bytes to floats - works
byte[] bytes = { 0, 1, 2, 4, 8, 16, 32, 64 };
UnionArray arry = new UnionArray { Bytes = bytes };
for (int i = 0; i < arry.Bytes.Length / 4; i++)
Console.WriteLine(arry.Floats[i]);
}
答案 2 :(得分:0)
如果您有权访问LINQ,则有两种方式:
var floatarray = ByteArry.AsEnumerable.Cast<float>().ToArray();
或仅使用数组函数
var floatarray = Array.ConvertAll(ByteArray, item => (float)item);
答案 3 :(得分:0)
IEnumerable<float> ToFloats(byte[] bytes)
{
for(int i = 0; i < bytes.Length; i+=4)
yield return BitConverter.ToSingle(bytes, i);
}