将双精度数组转换为字节数组

19

我该如何将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),还是想要获取底层机器表示的八个字节(例如用于序列化)? - Richard
1
我们在谈论什么类型的转换?你想把对应的double值“强制转换”为整型以获取字节值吗?还是你想要获取每个double值的字节表示形式?你需要“澄清”。 - Jeff Mercado
打算使用BinaryWriter.Write()函数。但是它只接受字节。我想获取每个double值的字节表示形式? - Raghaav
@Raghaav:在这种情况下,您需要每个双精度浮点数的字节表示。 - Jeff Mercado
是的。怎么做呢?数组大小将为1,00,000。 - Raghaav
7个回答

27

假设您希望将double类型的数按顺序放置在对应的字节数组中,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 版本很棒。谢谢。 - Paul Kertscher

6
您可以使用 SelectToArray 方法将一个数组转换为另一个数组:
oneArray = anotherArray.Select(n => {
  // the conversion of one item from one type to another goes here
}).ToArray();

将 double 转换为 byte:

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

将字节转换为双精度浮点数,只需更改转换部分即可:
doubleArray = byteArray.Select(n => {
  return Convert.ToDouble(n);
}).ToArray();

如果您想将每个double转换为多字节表示,您可以使用SelectMany方法和BitConverter类。由于每个double都将导致一个字节数组,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();

2
double[] array = new double[] { 10.0, 20.0, 30.0, 40.0 };
byte[] convertedarray = array.Select(x => Convert.ToByte(x)).ToArray();

如何将byte[]转换回double[]。 - Raghaav

2

1

你应该使用 Buffer.BlockCopy 方法。

看一下页面的示例,你就会清楚地理解。

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

0
你可以使用类似这样的代码:
byte[] byteArray = new byteArray[...];  
...
byteArray.SetValue(Convert.ToByte(d), index);

-1
var byteArray = (from d in doubleArray
                 select (byte)d)
                .ToArray();

var doubleArray = (from b in byteArray
                   select (double)b)
                  .ToArray();

干杯。


这将从大双精度数据中删除一些数据。 - VMAtm
@VMAtm:虽然这不是谴责他的理由。其他答案在这里也有同样的问题,只是因为一开始不够清楚。 - Jeff Mercado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接