【问题标题】:What is the Fastest way to convert byte[] to float[] and vice versa?将 byte[] 转换为 float[] 的最快方法是什么,反之亦然?
【发布时间】:2011-08-01 19:37:44
【问题描述】:

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

我现在正在使用 BlockCopy,但是我需要双倍内存。我想要某种演员表。

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

【问题讨论】:

  • 您的意思是:1 字节 => 1 个浮点数还是 4 个字节 => 1 个浮点数?
  • 能否请您说明您为什么要这样做,以及您想用它来做什么?这将更容易提出好的解决方案。答案中提到了许多有趣的技巧,但是,根据您实际希望达到的目标,有些可能会,有些可能不会,给您想要的结果。
  • 好的!你是对的,我刚刚编辑了问题

标签: c# arrays bytearray


【解决方案1】:

当然,msarchet 的提案也会复制。如果您不想复制,您所说的只是改变.NET 对内存区域的看法。

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

如果您没有存储数据的内存要求,只需将数据表示为您将在内存中使用最多的数据类型,并在使用时转换您实际使用的值。

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

(查看更多关于她的信息:

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

【讨论】:

【解决方案2】:

您可以使用 StructLayout 来实现这一点(来自 StackOverflow 问题 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]);
}

【讨论】:

    【解决方案3】:
    IEnumerable<float> ToFloats(byte[] bytes)
    {
      for(int i = 0; i < bytes.Length; i+=4)
         yield return BitConverter.ToSingle(bytes, i);
    }
    

    【讨论】:

    • 您正在使用和转换数据,我不想从字节转换为浮点数,我想要 *byte = &float[0]
    【解决方案4】:

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

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

    或者只使用数组函数

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

    【讨论】:

    • OP 说“没有循环”。您的两个选项都有一个隐藏循环。第一个实际上有 2 个。也都不会像 BlockCopy 那样优化。
    • 布鲁克,你是对的。而且这种方法实际上会使用 1 个 loat 空间来存储每个字节,这是浪费空间,我不需要。我需要做这个转换只是为了通过一个套接字发送并在另一端重建数组。
    猜你喜欢
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多