2010-05-28 103 views
1

我有動態長度的結構體:C#編組動態長度字符串

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
    struct PktAck 
    { 
     public Int32 code; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string text; 
    } 

當我轉換字節[]通過這個代碼爲結構:

GCHandle handle = GCHandle.Alloc(bytes_array, GCHandleType.Pinned); 
result_struct = (PktAck)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(PktAck)); 
handle.Free(); 

我有一個錯誤,因爲結構小於字節[]和「字符串文本」的大小的大小是指向字符串的指針...

如何使用動態字符串? 或者我只能使用這樣的事情:

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1000)] 

UPD: C結構

struct PktAck 
    { 
     int code; 
     char* text; 
    } 
+0

請向我們展示C'struct'。 – SLaks 2010-05-28 14:23:45

+0

嗨, 我有同樣的問題。 你有解決方法嗎? 謝謝, Ofir – Ofir 2011-01-30 16:47:01

回答

0

如果你想元帥這一結構成的PInvoke調用,那麼我會用Marshal類分配字符串。

struct PktAck 
{ 
    public Int32 code; 
    public IntPtr text; 
} 

public static void Main() 
{ 
    var a = new PktAck(); 
    a.code = 314159; 
    a.text = Marshal.StringToHGlobalAnsi("foo"); 
    try 
    { 
    SomePInvokeCall(a); 
    } 
    finally 
    { 
    Marshal.FreeHGlobal(a.text); 
    } 
} 
+0

我想將字節數組轉換爲此結構和結構數組返回。 我有一個這樣做的函數,但是這個函數不適用於動態結構。 – mitsky 2010-05-28 15:30:02

+0

一旦你改變stuct使用'IntPtr'而不是'string',那麼它將有一個固定的大小。之後,Marshal.PtrToStructure調用應該可以工作。 – 2010-05-28 16:15:17

+0

這一個應該被標記爲答案。否則OP應該提供更多信息來精心設計。 – 2015-06-23 10:56:29