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