Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换Suprema Biostar C++;代码转换为C#_C#_C++_Pointers_Biometrics - Fatal编程技术网

转换Suprema Biostar C++;代码转换为C#

转换Suprema Biostar C++;代码转换为C#,c#,c++,pointers,biometrics,C#,C++,Pointers,Biometrics,我从Suprema获得了Biostation T2,他们提供了一个用C#制作的包装Dll,他们还提供了使用VB6、VB.net、,大多数的文档都是C++的,而且很难把逻辑转换成C语言。我不能用PASTY中的下面函数来注册用户。主要是因为我不确定C++和C++中的逻辑是否匹配。 看电影 我在尝试读取或写入此处捕获的受保护内存时出错 这里是他们提供的sdk示例链接我们无法使用您向我们展示的内容编译和测试您的代码。也就是说,比较C++和C并排,我看到以下不一致: > C++有以下代码: unsign

我从Suprema获得了Biostation T2,他们提供了一个用C#制作的包装Dll,他们还提供了使用VB6、VB.net、,大多数的文档都是C++的,而且很难把逻辑转换成C语言。我不能用PASTY中的下面函数来注册用户。主要是因为我不确定C++和C++中的逻辑是否匹配。 看电影

我在尝试读取或写入此处捕获的受保护内存时出错


这里是他们提供的sdk示例链接

我们无法使用您向我们展示的内容编译和测试您的代码。也就是说,比较C++和C并排,我看到以下不一致:

<> > C++有以下代码:

unsigned char* templateBuf = (unsigned char*)malloc( userHeader.numOfFinger * 2 * BS_TEMPLATE_SIZE );
int bufPos = 0;
for( int i = 0; i < userHeader.numOfFinger * 2; i++ )
{
    result = BS_ScanTemplate( handle, templateBuf + bufPos );
    bufPos += BS_TEMPLATE_SIZE;
}
此代码不是按顺序存储BS_ScanTemplate的结果,而是通过重新分配数组来丢弃前面每次调用的结果。也许你想要这样的东西:

    byte[] templateBuf = new byte[userHdr.numOfFinger * 2 * BS_TEMPLATE_SIZE];
    for (int i = 0, bufPos = 0; i < userHdr.numOfFinger * 2; i++)
    {
        byte[] singleBuf = new byte[BS_TEMPLATE_SIZE];
        result = BSSDK.BS_ScanTemplate(m_Handle, singleBuf);
        Array.Copy(singleBuf, 0, templateBuf, bufPos, singleBuf.Length);
        bufPos += singleBuf.Length;
    }
这是完全不同的

< > > C++代码:

    userHdr.duressMask = 0; // no duress finger
for( int i = 0; i < userHeader.numOfFinger * 2; i++ )
{
    if( i % 2 == 0 )
    {
        userHeader.fingerChecksum[i/2] = 0;
    }
    unsigned char* templateData = templateBuf + i * BS_TEMPLATE_SIZE;
    for( int j = 0; j < BS_TEMPLATE_SIZE; j++ )
    {
        userHeader.fingerChecksum[i/2] += templateData[j];
    }
}
    for (int i = 0; i < userHdr.numOfFinger * 2; i++)
    {
        if (i % 2 == 0)
        {
            userHdr.checksum[i / 2] = 0;
        }
        byte[] templateData = templateBuf;
        for (int j = 0; j < 2000 - 1; j++)
        {
            userHdr.checksum[i / 2] += templateData[j];
        }
    }
更新
btngetUserInfo\u单击
,如下所示:

    public const int BS_MAX_NAME_LEN = 32;
    public const int BS_MAX_PASSWORD_LEN = 16;

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct BSUserHdrEx
    {
        public static BSUserHdrEx CreateDefaultBSUserHdrEx()
        {
            var userHdr = new BSUserHdrEx();
            userHdr.name = new byte[BSSDK.BS_MAX_NAME_LEN + 1];
            userHdr.department = new byte[BSSDK.BS_MAX_NAME_LEN + 1];
            userHdr.password = new byte[BSSDK.BS_MAX_PASSWORD_LEN];
            userHdr.checksum = new ushort[5];
            return userHdr;
        }

        public uint ID;
        public ushort reserved1;
        public ushort adminLevel;
        public ushort securityLevel;
        public ushort statusMask; // internally used by BioStation
        public uint accessGroupMask;

        //char name[BS_MAX_NAME_LEN + 1];
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = BSSDK.BS_MAX_NAME_LEN + 1)]
        public byte[] name;

        //char department[BS_MAX_NAME_LEN + 1];
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = BSSDK.BS_MAX_NAME_LEN + 1)]
        public byte[] department;

        // char password[BS_MAX_PASSWORD_LEN + 1];
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = BSSDK.BS_MAX_PASSWORD_LEN + 1)]
        public byte[] password;

        public ushort numOfFinger;
        public ushort duressMask;

        //public ushort checksum[5];
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
        public ushort[] checksum;

        public ushort authMode;
        public ushort authLimitCount; // 0 for no limit
        public ushort reserved;
        public ushort timedAntiPassback; // in minutes. 0 for no limit
        public uint cardID; // 0 for not used
        public bool bypassCard;
        public bool disabled;
        public uint expireDateTime;
        public uint customID; //card Custom ID
        public int version; // card Info Version
        public uint startDateTime;
    };
    private void btngetUserInfo_Click(object sender, EventArgs e)
    {
        int result;

        BSSDK.BSUserHdrEx userHdr = BSSDK.BSUserHdrEx.CreateDefaultBSUserHdrEx();
        userHdr.ID = 2; // 0 cannot be assigned as a user ID
        userHdr.startDateTime = 0; // no check for start date
        userHdr.expireDateTime = 0; // no check for expiry date
        userHdr.adminLevel = BSSDK.BS_USER_NORMAL;
        userHdr.securityLevel = BSSDK.BS_USER_SECURITY_DEFAULT;
        userHdr.authMode = BSSDK.BS_AUTH_MODE_DISABLED; // use the authentication mode of the device
        userHdr.accessGroupMask = 0xffff0201; // a member of Group 1 and Group 2;
        Encoding.UTF8.GetBytes("Madman").CopyTo(userHdr.name, 0);
        Encoding.UTF8.GetBytes("INC").CopyTo(userHdr.department, 0);
        Encoding.UTF8.GetBytes("").CopyTo(userHdr.password, 0);
        userHdr.password = Encoding.UTF8.GetBytes("");  // no password is enrolled. Password should be longer than 4 bytes.
        userHdr.numOfFinger = 2;
        byte[] templateBuf = new byte[userHdr.numOfFinger * 2 * BSSDK.BS_TEMPLATE_SIZE];
        for (int i = 0, bufPos = 0; i < userHdr.numOfFinger * 2; i++)
        {
            byte[] singleBuf = new byte[BSSDK.BS_TEMPLATE_SIZE];
            result = BSSDK.BS_ScanTemplate(m_Handle, singleBuf);
            Array.Copy(singleBuf, 0, templateBuf, bufPos, singleBuf.Length);
            bufPos += singleBuf.Length;
        }
        userHdr.duressMask = 0; // no duress finger

        for (int i = 0; i < userHdr.numOfFinger * 2; i++)
        {
            if (i % 2 == 0)
            {
                userHdr.checksum[i / 2] = 0;
            }
            // byte[] templateData = templateBuf;
            for (int j = 0; j < BSSDK.BS_TEMPLATE_SIZE; j++)
            {
                userHdr.checksum[i / 2] += templateBuf[i * BSSDK.BS_TEMPLATE_SIZE + j];
            }
        }

        // enroll the user
        result = BSSDK.BS_EnrollUserBioStation2(m_Handle, ref userHdr, templateBuf);
        if (result == (int)BSSDK.BS_RET_CODE.BS_SUCCESS)
        {
            MessageBox.Show("user " + userHdr.name.ToString() + " enrolled");
        }
private void btngetUserInfo_单击(对象发送方,事件参数e)
{
int结果;
BSSDK.BSUserHdrEx userHdr=BSSDK.BSUserHdrEx.CreateDefaultBSUserHdrEx();
userHdr.ID=2;//无法将0分配为用户ID
userHdr.startDateTime=0;//不检查开始日期
userHdr.expireDateTime=0;//不检查到期日期
userHdr.adminLevel=BSSDK.BS\u USER\u NORMAL;
userHdr.securityLevel=BSSDK.BS_USER_SECURITY_DEFAULT;
userHdr.authMode=BSSDK.BS_AUTH_MODE_DISABLED;//使用设备的身份验证模式
userHdr.accessGroupMask=0xffff0201;//组1和组2的成员;
Encoding.UTF8.GetBytes(“疯子”).CopyTo(userHdr.name,0);
编码.UTF8.GetBytes(“INC”).CopyTo(userHdr.department,0);
Encoding.UTF8.GetBytes(“”).CopyTo(userHdr.password,0);
userHdr.password=Encoding.UTF8.GetBytes(“”;//未注册密码。密码长度应大于4字节。
userHdr.numofinger=2;
byte[]templateBuf=新字节[userHdr.numofinger*2*BSSDK.BS_TEMPLATE_SIZE];
for(inti=0,bufPos=0;i
更新

您正在编组的结构是
BSUserHdrEx
BS_EnrollUserBioStation2
不将此作为参数。
BS_EnrollUserBioStation2
BS2UserHdr
作为参数(来源:BioStar SDK手册V1.8.pdf第158页)。
BSUserHdrEx
BS_EnrollUserEx
的参数。(第129页)

  • BS_EnrollUserEx
    “将用户注册到BioStation。每个用户最多可注册5个手指。”
  • BS_EnrollUserBioStation2
    “将用户注册到BioStation T2。每个用户最多10个手指。”

你需要切换到前一个函数,或者使用后者的数据结构。< /P>请尝试创建一个p/jokes问题。我们没有办法用你所发布的来复制这个。@我的问题是C++代码解释是否正确匹配C?我忘记了添加注册用户的最后一行,但是我已经更新了PASTY。让我尝试修改。@ GoTaleFoo-回答。没有看到C++的代码> BS2USERHDR < /代码>类,我就不能做更多了。@ Gotalove -在C++中有<代码> FoePoTeLabeBuf>代码>传递到<代码> BSXiuSueSueSudio2甚至存在于c#代码中。

    for (int i = 0; i < userHdr.numOfFinger; i++)
    {
        if (i % 2 == 0)
        {
            userHdr.checksum[i / 2] = 0;
        }
        for (int j = 0; j < BS_TEMPLATE_SIZE; j++)
        {
            userHdr.checksum[i / 2] += templateBuf[i * BS_TEMPLATE_SIZE + j];
        }
    }
    public const int BS_MAX_NAME_LEN = 32;
    public const int BS_MAX_PASSWORD_LEN = 16;

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct BSUserHdrEx
    {
        public static BSUserHdrEx CreateDefaultBSUserHdrEx()
        {
            var userHdr = new BSUserHdrEx();
            userHdr.name = new byte[BSSDK.BS_MAX_NAME_LEN + 1];
            userHdr.department = new byte[BSSDK.BS_MAX_NAME_LEN + 1];
            userHdr.password = new byte[BSSDK.BS_MAX_PASSWORD_LEN];
            userHdr.checksum = new ushort[5];
            return userHdr;
        }

        public uint ID;
        public ushort reserved1;
        public ushort adminLevel;
        public ushort securityLevel;
        public ushort statusMask; // internally used by BioStation
        public uint accessGroupMask;

        //char name[BS_MAX_NAME_LEN + 1];
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = BSSDK.BS_MAX_NAME_LEN + 1)]
        public byte[] name;

        //char department[BS_MAX_NAME_LEN + 1];
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = BSSDK.BS_MAX_NAME_LEN + 1)]
        public byte[] department;

        // char password[BS_MAX_PASSWORD_LEN + 1];
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = BSSDK.BS_MAX_PASSWORD_LEN + 1)]
        public byte[] password;

        public ushort numOfFinger;
        public ushort duressMask;

        //public ushort checksum[5];
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
        public ushort[] checksum;

        public ushort authMode;
        public ushort authLimitCount; // 0 for no limit
        public ushort reserved;
        public ushort timedAntiPassback; // in minutes. 0 for no limit
        public uint cardID; // 0 for not used
        public bool bypassCard;
        public bool disabled;
        public uint expireDateTime;
        public uint customID; //card Custom ID
        public int version; // card Info Version
        public uint startDateTime;
    };
    private void btngetUserInfo_Click(object sender, EventArgs e)
    {
        int result;

        BSSDK.BSUserHdrEx userHdr = BSSDK.BSUserHdrEx.CreateDefaultBSUserHdrEx();
        userHdr.ID = 2; // 0 cannot be assigned as a user ID
        userHdr.startDateTime = 0; // no check for start date
        userHdr.expireDateTime = 0; // no check for expiry date
        userHdr.adminLevel = BSSDK.BS_USER_NORMAL;
        userHdr.securityLevel = BSSDK.BS_USER_SECURITY_DEFAULT;
        userHdr.authMode = BSSDK.BS_AUTH_MODE_DISABLED; // use the authentication mode of the device
        userHdr.accessGroupMask = 0xffff0201; // a member of Group 1 and Group 2;
        Encoding.UTF8.GetBytes("Madman").CopyTo(userHdr.name, 0);
        Encoding.UTF8.GetBytes("INC").CopyTo(userHdr.department, 0);
        Encoding.UTF8.GetBytes("").CopyTo(userHdr.password, 0);
        userHdr.password = Encoding.UTF8.GetBytes("");  // no password is enrolled. Password should be longer than 4 bytes.
        userHdr.numOfFinger = 2;
        byte[] templateBuf = new byte[userHdr.numOfFinger * 2 * BSSDK.BS_TEMPLATE_SIZE];
        for (int i = 0, bufPos = 0; i < userHdr.numOfFinger * 2; i++)
        {
            byte[] singleBuf = new byte[BSSDK.BS_TEMPLATE_SIZE];
            result = BSSDK.BS_ScanTemplate(m_Handle, singleBuf);
            Array.Copy(singleBuf, 0, templateBuf, bufPos, singleBuf.Length);
            bufPos += singleBuf.Length;
        }
        userHdr.duressMask = 0; // no duress finger

        for (int i = 0; i < userHdr.numOfFinger * 2; i++)
        {
            if (i % 2 == 0)
            {
                userHdr.checksum[i / 2] = 0;
            }
            // byte[] templateData = templateBuf;
            for (int j = 0; j < BSSDK.BS_TEMPLATE_SIZE; j++)
            {
                userHdr.checksum[i / 2] += templateBuf[i * BSSDK.BS_TEMPLATE_SIZE + j];
            }
        }

        // enroll the user
        result = BSSDK.BS_EnrollUserBioStation2(m_Handle, ref userHdr, templateBuf);
        if (result == (int)BSSDK.BS_RET_CODE.BS_SUCCESS)
        {
            MessageBox.Show("user " + userHdr.name.ToString() + " enrolled");
        }