如何在 C# 中封送此嵌套的可变长度 C 结构
本文关键字:结构 嵌套 | 更新日期: 2023-09-27 18:32:29
typedef struct pt_bir {
PT_BIR_HEADER Header;
BYTE Data[1]; //variable length based on pt_bir_header.Length
} PT_BIR
typedef struct pt_bir_header {
DWORD Length;
BYTE HeaderVersion;
BYTE Type;
WORD FormatOwner;
WORD FormatID;
CHAR Quality;
BYTE Purpose;
DWORD FactorsMask;
} PT_BIR_HEADER
我的 C 函数是:
PT_STATUS LoadFinger (
IN PT_CONNECTION hConnection,
IN PT_LONG lSlotNr,
IN PT_BOOL boReturnPayload,
OUT PT_BIR **ppStoredTemplate
)
现在我需要在 C# 中为上述 C 函数做包装器。
我应该如何封送PT_BIR**
结构,以及在此函数返回后应该如何解封它?
请帮帮我...
您将需要手动取消封送。首先在 C# 中声明标头结构
[StructLayout(LayoutKind.Sequential)]
public struct PT_BIR_HEADER
{
public int Length;
public byte HeaderVersion;
public byte Type;
public ushort FormatOwner;
public ushort FormatID;
public char Quality;
public byte Purpose;
public uint FactorsMask;
}
然后对于函数声明,声明ppStoredTemplate
参数,如下所示:
out IntPtr ppStoredTemplate
一旦函数返回并且您有ppStoredTemplate
,那么您可以取消编组它。首先拉出标题:
PT_BIR_HEADER header = (PT_BIR_HEADER)Marshal.PtrToStructure(ppStoredTemplate,
typeof(PT_BIR_HEADER));
然后,您可以解压缩数据:
byte[] data = new byte[header.Length];
Marshal.Copy(ppStoredTemplate + Marshal.SizeOf(typeof(PT_BIR_HEADER)), data, 0,
header.Length);