如何封送c#结构数组

本文关键字:数组 结构 何封送 | 更新日期: 2023-09-27 18:10:18

我正在为人力资源管理系统开发指纹登录。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文档(链接)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;
            }
        }
    }

如何封送c#结构数组

检查我,如果我错了,但我相信我在某处读到,封送结构到数组可以通过以下操作来执行:

[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.
}

然后简单地传递结构体来代替数组。

好运