我正在使用其他人編寫的項目從Parrot AR Drone接收一些數據。很多數據以字節數組的形式出現,我使用的這個庫使用一堆結構進行分析。一般來說,我對編組真的很陌生。擺脫不安全的代碼,從字節編組uint數組?
我有一個結構,看起來像這樣:
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public unsafe struct navdata_vision_detect_t
{
public ushort tag;
public ushort size;
public uint nb_detected;
public fixed uint type [4]; // <Ctype "c_uint32 * 4">
public fixed uint xc [4]; // <Ctype "c_uint32 * 4">
public fixed uint yc [4]; // <Ctype "c_uint32 * 4">
public fixed uint width [4]; // <Ctype "c_uint32 * 4">
public fixed uint height [4]; // <Ctype "c_uint32 * 4">
public fixed uint dist [4]; // <Ctype "c_uint32 * 4">
public fixed float orientation_angle [4]; // <Ctype "float32_t * 4">
}
但是,如果我曾經試着訪問navdata_vision_detect_t的實例,並在固定的uint值獲得,我必須使用「固定」關鍵字,它似乎真的很亂:
unsafe private void drawTagDetection()
{
int x, y;
if (_detectData.nb_detected > 0)
{
fixed (uint* xc = _detectData.xc)
{
x = (int)xc[0];
}
fixed (uint* yc = _detectData.yc)
{
y = (int)yc[0];
}
}
我希望能夠只訪問UINT陣列就像我會正常的C#陣列。我認爲我應該能夠使用編組,但我無法使它工作。我想是這樣的:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public uint[] type; // <Ctype "c_uint32 * 4">
這讓我刪除「不安全」和「固定」的關鍵字,但引起了另一個問題,因爲解析字節的數據時,有一個大的switch語句,做一些蒙上各種結構像這樣:
private static unsafe void ProcessOption(navdata_option_t* option, ref NavdataBag navigationData){
var tag = (navdata_tag_t) option->tag;
switch (tag)
{
//lots of other stuff here
case navdata_tag_t.NAVDATA_VISION_TAG:
navigationData.vision = *(navdata_vision_t*) option;
break;
}
}
所以我仍然有一些指向這個結構在另一個不安全的函數。我怎樣才能讓這些結構中的數組保持「安全」,同時又允許另一個不安全的函數將我的對象作爲結構體來施放?
感謝您給予任何幫助!
不幸的是,您的問題和代碼示例並不完全清楚。爲什麼你的'ProcessOption()'方法將一個指針作爲參數?什麼是'navdata_option_t'類型?這與「navdata_vision_detect_t」類型有什麼關係?'navdata_vision_detect_t'類型有一個'size'字段;這個大小實際上是可變的?您使用的圖書館是否強迫您使用不安全的結構,或者您是否擁有對圖書館代碼的控制權?在我看來,僅僅使用'BitConverter'來解析數組到實際的結構將是最好的。 – 2015-02-10 07:58:35
請注意,通過在類型中使用顯式佈局並將多個字段(本身可以是結構體)的偏移量設置爲結構中的相同位置,您可以在C#中有效地創建聯合。這個問題對你是否有用尚不清楚,因爲問題本身不是很清楚。 – 2015-02-10 07:59:35
'* _detectData.xc'不工作?編輯:不,你正在使用它作爲一個領域。作爲一個本地人,你不需要那個。所以修復它在入門或使用參數等 – leppie 2015-02-10 18:25:35