将byte[]转换为float[]的最快方法是什么?反之亦然

本文关键字:方法 是什么 反之亦然 float byte 转换 | 更新日期: 2023-09-27 18:04:24

这是将byte[]转换为float[]的最快方式,反之亦然(当然没有循环)。

我现在使用BlockCopy,但我需要双内存。我想要一些演员。

我需要做这个转换,只是为了通过套接字发送数据,并在另一端重建数组。

将byte[]转换为float[]的最快方法是什么?反之亦然

当然,微软的提案也会复制。如果你不想复制,你说的只是改变。net考虑内存区域的方式。

但是,我不认为你想要的是可能的,因为字节和浮点数在内存中的表示完全不同。一个字节在内存中正好使用一个字节,但是浮点数使用4个字节(32位)。

如果你不需要内存来存储你的数据,那就把数据表示为你在内存中使用最多的数据类型,并在你使用它们时转换你实际使用的值。

如何将浮点数(可以表示±1.5 × 10−45和±3.4 × 10^38之间的值)转换为字节(可以表示0到255之间的值)?

(查看更多关于:

  • 字节:http://msdn.microsoft.com/en-us/library/5bdb6693 (v = VS.100) . aspx
  • 浮动:http://msdn.microsoft.com/en-us/library/b1e65aza.aspx

关于。net中浮动类型的更多信息:http://csharpindepth.com/Articles/General/FloatingPoint.aspx

你可以使用StructLayout来实现这一点(从Stack Overflow问题 c#不安全的值类型数组到字节数组的转换):

[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]);
}
IEnumerable<float> ToFloats(byte[] bytes)
{
  for(int i = 0; i < bytes.Length; i+=4)
     yield return BitConverter.ToSingle(bytes, i);
}

如果您可以访问LINQ,有两种方法:

var floatarray = ByteArry.AsEnumerable.Cast<float>().ToArray();

或者仅仅使用数组函数

var floatarray = Array.ConvertAll(ByteArray, item => (float)item);