2011-10-20 169 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;儘管如此,用於編寫代碼表明我們應該有雙打的八分之一。 –

相關問題