如何在C#中将字节数组转换为double数组?

时间:2011-10-20 06:47:52

标签: c# .net bytearray

我有一个包含double值的字节数组。我想将它转换为双数组。是否有可能在C#?

字节数组看起来像:

byte[] bytes; //I receive It from socket

double[] doubles;//I want to extract values to here

我用这种方式创建了一个字节数组(C ++):

double *d; //Array of doubles
byte * b = (byte *) d; //Array of bytes which i send over socket

2 个答案:

答案 0 :(得分:10)

你不能转换数组类型;但是:

byte[] bytes = ...
double[] values = new double[bytes.Length / 8];
for(int i = 0 ; i < values.Length ; i++)
    values[i] = BitConverter.ToDouble(bytes, i * 8);

或(交替):

byte[] bytes = ...
double[] values = new double[bytes.Length / 8];
Buffer.BlockCopy(bytes, 0, values, 0, values.Length * 8);

应该这样做。您也可以在unsafe代码中执行此操作:

byte[] bytes = ...
double[] values = new double[bytes.Length / 8];
unsafe
{
    fixed(byte* tmp = bytes)
    fixed(double* dest = values)
    {
        double* source = (double*) tmp;
        for (int i = 0; i < values.Length; i++)
            dest[i] = source[i];
    }
}

不确定我是否推荐,但

答案 1 :(得分:8)

我将在这里添加对超级不安全代码的引用C# unsafe value type array to byte array conversions

请注意,它基于C#的无证“功能”,所以明天它可能会死。

[StructLayout(LayoutKind.Explicit)]
struct UnionArray
{
    [FieldOffset(0)]
    public byte[] Bytes;

    [FieldOffset(0)]
    public double[] Doubles;
}

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 / 8; i++)
        Console.WriteLine(arry.Doubles[i]);   
}

这种方法的唯一优点是它并没有真正“复制”数组,所以它在空间和时间上的O(1)比复制O(n)数组的其他方法要多。