2011-10-20 104 views
4

我有一个包含double值的字节数组。我想将它转换为双数组。在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 
+1

A转换很容易,但理解并不。你想要什么? – Polity

+8

更好的语言,如C++或JavaScript?仅此而已,我没有回答这个问题。 –

+1

你会如何在JavaScript中做到这一点? – Gabe

回答

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); 

或(alterntive):

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

不知道我建议,虽然

+0

非常感谢!如果有效,我会立即尝试。 – Vasya

+2

如果数据是大端的呢? – Gabe

+0

@Marc Garvell我通过File.ReadAllBytes()API读取文本文件,然后使用for循环,我只是做了doubleArray [i] = byteArray [i]; 循环结束后,数组的内容都是相同的。是的,数组的大小是1000个项目。 那么究竟应该使用BitConverter?如果上述解决方案有效 – Zenwalker

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(n)的阵列的其他方法是O(1)。

+0

@MarcGravell有趣...是否使用内存页面共享?否则它不能小于O(n) – xanatos

+0

MSDN指出“顾名思义,BlockCopy方法复制一个字节块作为一个整体,而不是一次复制一个字节。” - 但是,它被实现为一个'extern',所以我不能告诉你底层的实现是什么。我会*想象*它会调用类似'memcpy'的东西。 –

+0

@MarcGravell然后整个操作在空间和时间上是O(n)(因为复制n个字节需要复制所有n个字节,所以你必须进行n/k操作,其中常量和是您一次(4或8)复制的字节数,而在空间中是因为您需要分配第二个大小为n字节的数组)。显然,它比“手动”复制要快。我曾希望它使用copy-on-write的这些“肮脏技巧”之一:-) – xanatos

-2

我不知道你使用的.NET版本,但如果你使用.NET 3.5,你可以尝试以下..

... 
List<double> dList = new List<double>(); 
double[] doubleArray; 
byteArray.ToList<byte>().ForEach(b => dList.Add(Convert.ToDouble(b))); 
doubleArray = dList.ToArray<double>(); 
+1

这会将每个* byte *转换为double;尽管如此,用于编写代码表明我们应该有双打的八分之一。 –

相关问题