2014-12-31 71 views
0

我正在實施Kinect的FaceTrackingBasics-WPF C#代碼來跟蹤某個對象的位置。 試圖收集一個Vector3DF型可變成使用Buffer.BlockCopy一些字節數組如下:將Vector3DF轉換爲字節數組的正確方法是什麼?

    this.facePoints3D = frame.Get3DShape(); 
        foreach (Vector3DF[] vector in facePoints3D.GetSlices(n)) 
        {      
         byte[] bytearray = new byte[vector.Length * this.facePoints3D.Count]; 
         Buffer.BlockCopy(vector, 0, bytearray, 0, bytearray.Length); 
        } 

但我有一個Buffer.BlockCopy ArgumentException的「SRC或dst爲不是基元的陣列。」每次運行執行文件。我知道這是'因爲Vector3DF不是原始的。

現在參考,vector3DF被定義爲:

public struct Vector3DF 
    { 
     public Vector3DF(float x, float y, float z) 
     : this() 
     { 
     X = x; 
     Y = y; 
     Z = z; 
     } 
     // ...  
     //some more code 
     //... 
    } 

是否有轉換這個所謂Vector3DF到ByteArray的,所以我可以將它傳遞到存儲的好方法? 謝謝!

+0

數據已經在內存中,你真正想要做的方法嗎?傳遞給指針? – pushpraj

+0

嗯,不完全是@pushpraj,因爲從Vector3DF向量到字節的轉換不是原始的。我問如何正確地從float(在這種情況下Vector3DF)轉換爲bytearray。謝謝! – Calorified

回答

1

這裏使用的互操作技術

//sample data 
    Vector3DF v3df = new Vector3DF(10, 20, 30); 

    //get data size 
    int size = Marshal.SizeOf(v3df); 

    //allocate memory 
    IntPtr ptr = Marshal.AllocHGlobal(size); 

    //copy data to memory 
    Marshal.StructureToPtr(v3df, ptr, false); 

    //copy data from memory to byte array 
    byte[] bytes = new byte[size]; 
    Marshal.Copy(ptr, bytes, 0, bytes.Length); 

    //release memory 
    Marshal.FreeHGlobal(ptr); 

看看這可以幫助你實現你想要的

+0

謝謝,但爲什麼我必須在轉換爲bytearray之前將數據發送到內存? – Calorified

+0

{「類型'Microsoft.Kinect.Toolkit.FaceTracking.Vector3DF []'不能作爲非託管結構進行編組;不能將有意義的大小或偏移量計算出來。」} – Calorified

+0

@「通過計算,此方法適用於確定大小的結構在問題中定義的示例結構。你能發佈完整的代碼嗎?Microsoft.Kinect.Toolkit.FaceTracking.Vector3DF []'?我們是否可以嘗試找到相同的解決方法。 – pushpraj

相關問題