【问题标题】:Conversion double array to byte array将双精度数组转换为字节数组
【发布时间】:2020-10-03 05:03:08
【问题描述】:

如何将double[] 数组转换为byte[] 数组,反之亦然?

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(sizeof(double));
        Console.WriteLine(double.MaxValue);

        double[] array = new double[] { 10.0, 20.0, 30.0, 40.0 };
        byte[] convertedarray = ?

        Console.Read();
    }
}

【问题讨论】:

  • 您想要转换值(即10.0 -> 10)还是底层机器表示的八个字节(例如用于序列化)?
  • 我们在这里谈论什么样的转换?您想将相应的双精度数“强制转换”为整数类型以获取字节值吗?或者你想得到每个双精度值的字节表示?你需要澄清
  • 意图是使用 BinaryWriter.Write() 函数。但这只接受字节。我想得到每个双精度值的字节表示?
  • @Raghaav:在这种情况下,您需要每个双精度的字节表示。
  • 是的。这个怎么做?数组大小为 1,00,000

标签: c# c#-3.0


【解决方案1】:

假设您希望将双精度数据一个接一个地放置在相应的字节数组中,LINQ 可以解决这个问题:

static byte[] GetBytes(double[] values)
{
    return values.SelectMany(value => BitConverter.GetBytes(value)).ToArray();
}

或者,您可以使用Buffer.BlockCopy():

static byte[] GetBytesAlt(double[] values)
{
    var result = new byte[values.Length * sizeof(double)];
    Buffer.BlockCopy(values, 0, result, 0, result.Length);
    return result;
}

转换回来:

static double[] GetDoubles(byte[] bytes)
{
    return Enumerable.Range(0, bytes.Length / sizeof(double))
        .Select(offset => BitConverter.ToDouble(bytes, offset * sizeof(double)))
        .ToArray();
}

static double[] GetDoublesAlt(byte[] bytes)
{
    var result = new double[bytes.Length / sizeof(double)];
    Buffer.BlockCopy(bytes, 0, result, 0, bytes.Length);
    return result;
}

【讨论】:

  • BlockCopy 版本很棒。谢谢你。
【解决方案2】:

您可以使用SelectToArray 方法将一个数组转换为另一个数组:

oneArray = anotherArray.Select(n => {
  // the conversion of one item from one type to another goes here
}).ToArray();

从双精度转换为字节:

byteArray = doubleArray.Select(n => {
  return Convert.ToByte(n);
}).ToArray();

要将字节转换为双精度,只需更改转换部分:

doubleArray = byteArray.Select(n => {
  return Convert.ToDouble(n);
}).ToArray();

如果要将每个双精度转换为多字节表示,可以使用SelectMany 方法和BitConverter 类。由于每个双精度都会产生一个字节数组,SelectMany 方法会将它们展平为单个结果。

byteArray = doubleArray.SelectMany(n => {
  return BitConverter.GetBytes(n);
}).ToArray();

要转换回双精度,您需要一次循环八个字节:

doubleArray = Enumerable.Range(0, byteArray.Length / 8).Select(i => {
  return BitConverter.ToDouble(byteArray, i * 8);
}).ToArray();

【讨论】:

    【解决方案3】:

    使用Bitconverter 类。

    【讨论】:

      【解决方案4】:
      double[] array = new double[] { 10.0, 20.0, 30.0, 40.0 };
      byte[] convertedarray = array.Select(x => Convert.ToByte(x)).ToArray();
      

      【讨论】:

      • 如何将 byte[] 转换回 double[]。
      【解决方案5】:

      你应该使用Buffer.BlockCopy方法。

      看看pages例子,你就明白了。

      doubleArray = byteArray.Select(n => {return Convert.ToDouble(n);}).ToArray();
      

      【讨论】:

        【解决方案6】:

        我认为你可以使用这样的东西:

        byte[] byteArray = new byteArray[...];  
        ...
        byteArray.SetValue(Convert.ToByte(d), index);
        

        【讨论】:

          【解决方案7】:
          var byteArray = (from d in doubleArray
                           select (byte)d)
                          .ToArray();
          
          var doubleArray = (from b in byteArray
                             select (double)b)
                            .ToArray();
          

          干杯。

          【讨论】:

          • 这将从大双打中删除一些数据。
          • @VMAtm:虽然这不是谴责他的理由。这里的其他答案也有同样的问题,只是因为一开始就不清楚。
          猜你喜欢
          • 2013-03-10
          • 1970-01-01
          • 2014-11-02
          • 2010-11-21
          • 2011-07-07
          • 2012-03-07
          • 2015-10-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多