[英]How to Marshal C# struct array?
我正在為HRM系統開發指紋登錄。 SDK提供的示例代碼允許使用一個模板進行驗證。 這是代碼段。
BSTypes.ABS_BIR ppEnrolledTemplate; //Load the template array to ppEnrolledTemplate
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ppEnrolledTemplateArray[i]));
Marshal.StructureToPtr(ppEnrolledTemplateArray[i], ptr, false);
res = BSApi.ABSVerify(conn, ref op, 1, ref ptr, ref matching_slot, 0);
根據SDK文檔( Link ),ABSVerify方法允許輸入模板數組作為參數之一。 我在整理ABS_BIR結構數組時遇到困難。 這是ABS_BIR的結構。
[StructLayout(LayoutKind.Sequential)]
public struct ABS_BIR
{
public ABS_BIR_HEADER Header; // BIR header
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2560)]
public byte[] Data; // The data composing the fingerprint template.
}
這是我附帶的解決方案。 我寫了一個叫ReadyTemplate()的方法
private void readTemplate() {
//read template from binary file
for (int i = 0; i < 4; i++)
{
FileStream objFileStream;
BinaryReader objBinaryReader;
try
{
// ========== Updated by bubz ============
byte[] data;
objFileStream = new FileStream(i + ".bin", FileMode.Open);
objBinaryReader = new BinaryReader(objFileStream);
data = objBinaryReader.ReadBytes((int)objFileStream.Length);
GCHandle pinnedData = GCHandle.Alloc(data, GCHandleType.Pinned);
ppEnrolledTemplateArray[i] = (BSTypes.ABS_BIR)Marshal.PtrToStructure(pinnedData.AddrOfPinnedObject(), typeof(BSTypes.ABS_BIR));
displayOut(0, 0, "Template retrieved from PC.");
displayOut(0, 0, i.ToString());
objBinaryReader.Close();
// ============ end ====================
}
catch (FileNotFoundException FileEx)
{
displayOut(2, 0, FileEx.Message);
return;
}
catch (Exception Ex)
{
displayOut(2, 0, Ex.Message);
return;
}
}
}
請幫助我。謝謝。
檢查我是否錯,但是我相信我讀到某個地方可以通過執行以下操作來將結構封送到數組中:
[StructLayout(LayoutKind.Sequential)]
[MarshalAs(UnmanagedType.ByValArray)]
public struct ABS_BIR
{
public ABS_BIR_HEADER Header; // BIR header
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2560)]
public byte[] Data; // The data composing the fingerprint template.
}
然后只需將結構傳遞給數組即可。
祝好運
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.