Как преобразовать байтовый массив в двойной массив в C #? - PullRequest
4 голосов
/ 20 октября 2011

У меня есть байтовый массив, который содержит двойные значения. Я хочу преобразовать его в двойной массив. Возможно ли это в 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 ]

10 голосов
/ 20 октября 2011

Вы не можете преобразовать тип массива; однако:

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];
    }
}

не уверен, что рекомендую, хотя

8 голосов
/ 20 октября 2011

Здесь я добавлю ссылку на сверхбезопасный код C # небезопасный тип массива в преобразования байтового массива

Имейте в виду, что он основан на недокументированной "функции"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).

...