我有一个包含双精度值的字节数组.我想将它转换为双数组.在C#中有可能吗?
字节数组看起来像:
byte[] bytes; //I receive It from socket
double[] doubles;//I want to extract values to here
Run Code Online (Sandbox Code Playgroud)
我用这种方式创建了一个字节数组(C++):
double *d; //Array of doubles
byte * b = (byte *) d; //Array of bytes which i send over socket
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 12
你不能转换数组类型; 然而:
byte[] bytes = ...
double[] values = new double[bytes.Length / 8];
for(int i = 0 ; i < values.Length ; i++)
values[i] = BitConverter.ToDouble(bytes, i * 8);
Run Code Online (Sandbox Code Playgroud)
或(交替):
byte[] bytes = ...
double[] values = new double[bytes.Length / 8];
Buffer.BlockCopy(bytes, 0, values, 0, values.Length * 8);
Run Code Online (Sandbox Code Playgroud)
应该做.您也可以在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];
}
}
Run Code Online (Sandbox Code Playgroud)
不过我不推荐这样做
我将从这里C#unsafe值类型数组添加对超不安全代码的引用到字节数组转换
请注意,它基于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]);
}
Run Code Online (Sandbox Code Playgroud)
这种方法的唯一优点是它不会真正"复制"数组,因此在空间和时间上的O(1)是复制O(n)数组的其他方法.
| 归档时间: |
|
| 查看次数: |
9830 次 |
| 最近记录: |