代码改变世界

普通磁卡读写方法,转。

  沐海  阅读(1036)  评论(0编辑  收藏  举报

//调用磁卡dll文件 重写调用方法

//打开方法      

public int HCE300Open()
        {
            int iComPort = int.Parse(iniFile.IniReadValue("HCE300Option", "ComPort"));
            int iTemp = 0;
            iTemp = HCE300_Open(iComPort);
            //if (iTemp < HCE300_OK)
            //{
            //    sMsg = MessageShow(iTemp) + "(打开写卡串口)";
            //}
            return iTemp;
        }

//关闭方法       

public int HCE300Close()
        {
            int iTemp = 0;
            iTemp = HCE300_Close();
            //if (iTemp < HCE300_OK)
            //{
            //    sMsg = MessageShow(iTemp) + "(关闭写卡串口)";
            //}
            return iTemp;
        }

//写入方法       

public string WriteData(string sData)
        {
            string sTemp = string.Empty;
            string sMsg = string.Empty;
            int iShowDialogFlag = int.Parse(iniFile.IniReadValue("HCE300Option", "ShowDialogFlag"));
            int iFormatFlag = int.Parse(iniFile.IniReadValue("HCE300Option", "FormatFlag"));
            int iInBPIFlag = int.Parse(iniFile.IniReadValue("HCE300Option", "InBPIFlag"));
            int iTemp = 0;

            iTemp = HCE300Open();
            if (iTemp < HCE300_OK)
            {
                sMsg = MessageShow(iTemp) + "(打开写卡串口)";
                return sMsg;
            }

            iTemp = HCE300_SetShowDialog(iShowDialogFlag);
            if (iTemp < HCE300_OK)
            {
                sMsg = MessageShow(iTemp) + "(写磁卡机)";
                return sMsg;
            }
            iTemp = HCE300_SetTrack2Density(iInBPIFlag);
            if (iTemp < HCE300_OK)
            {
                sMsg = MessageShow(iTemp) + "(写磁卡机)";
                return sMsg;
            }
            iTemp = HCE300_SetRecordFormat(iFormatFlag);
            if (iTemp < HCE300_OK)
            {
                sMsg = MessageShow(iTemp) + "(写磁卡机)";
                return sMsg;
            }
            byte[] bData = GetWriteData(sData);
            iTemp = HCE300_Write(2, bData);
            sMsg = MessageShow(iTemp) + "(写磁卡机)";

            iTemp = HCE300Close();
            if (iTemp < HCE300_OK)
            {
                sMsg += "\r\n" + MessageShow(iTemp) + "(关闭写卡串口)";
                return sMsg;
            }
            return sMsg;
        }

//读取方法       

public string ReadData(ref string sData)
        {
            string sMsg = string.Empty;
            int iTemp = 0;
            byte[] bReadBuf = new byte[104];
            int iShowDialogFlag = int.Parse(iniFile.IniReadValue("HCE300Option", "ShowDialogFlag"));

            iTemp = HCE300Open();
            if (iTemp < HCE300_OK)
            {
                sMsg = MessageShow(iTemp) + "(打开写卡串口)";
                return sMsg;
            }

            iTemp = HCE300_SetShowDialog(iShowDialogFlag);
            if (iTemp < HCE300_OK)
            {
                sMsg = MessageShow(iTemp) + "(读磁卡机)";
                return sMsg;
            }

            iTemp = HCE300_Read(2, bReadBuf);
            if (iTemp < HCE300_OK)
            {
                sMsg = MessageShow(iTemp)+"(读磁卡机)";
            }
            else
            {
                string sTemp = ASCIIEncoding.Default.GetString(bReadBuf).TrimEnd('\0');
                iTemp = GetReadData(sTemp,ref sData);
                if (iTemp == 0)
                {
                    sMsg = MessageShow(iTemp) + "(读磁卡机)";
                }
                else if (iTemp == -1)
                {
                    sMsg = "读磁卡数据不完整";
                }
                else if (iTemp == -2)
                {
                    sMsg = "解析磁卡数据发生异常";
                }
            }

            iTemp = HCE300Close();
            if (iTemp < HCE300_OK)
            {
                sMsg += "\r\n" + MessageShow(iTemp) + "(关闭写卡串口)";
                return sMsg;
            }
            return sMsg;

        }


        private byte[] GetWriteData(string sData)
        {
            byte[] bStrTemp = ASCIIEncoding.Default.GetBytes(sData);
            byte[] bStr = new byte[bStrTemp.Length + 1];
            byte bEnd = 0;
            for (int i = 0; i < bStrTemp.Length; i++)
            {
                bStr[i] = bStrTemp[i];
                bEnd += bStrTemp[i];
            }
            bStr[bStrTemp.Length] = bEnd;
            string sTemp = string.Empty;
            sTemp = ASCIIEncoding.Default.GetString(bStr);
            sTemp = FootBall.Encrypt.EncryptString(sTemp);
            bStrTemp = ASCIIEncoding.Default.GetBytes(sTemp);
            bStr = new byte[bStrTemp.Length + 1];
            bEnd = 0;
            for (int i = 0; i < bStrTemp.Length; i++)
            {
                bStr[i] = bStrTemp[i];
                bEnd += bStrTemp[i];
            }
            bStr[bStrTemp.Length] = bEnd;

            sTemp = string.Empty;
            for (int i = 0; i < bStr.Length; i++)
            {
                sTemp += bStr[i].ToString().PadLeft(3, '0');
            }
            byte[] bTemp = ASCIIEncoding.Default.GetBytes(sTemp);
            return bTemp;
        }

        public int GetReadData(string sStr, ref string sData)
        {
            int iState = 0;
            byte[] bStrTemp = new byte[sStr.Length/3 - 1];
            byte bEnd = 0;
            string sTemp = string.Empty;
            try
            {
                sTemp = sStr;
                byte[] bTemp = new byte[sTemp.Length / 3];
                for (int i = 0; i < sTemp.Length / 3; i++)
                {
                    bTemp[i] = byte.Parse(sTemp.Substring(i * 3, 3));
                }

                for (int i = 0; i < bTemp.Length - 1; i++)
                {
                    bStrTemp[i] = bTemp[i];
                    bEnd += bTemp[i];
                }
                if (bEnd == bTemp[bTemp.Length - 1])
                {
                    sTemp = ASCIIEncoding.Default.GetString(bStrTemp);
                    sTemp = FootBall.Encrypt.DecryptString(sTemp);
                    byte[] bNum = ASCIIEncoding.Default.GetBytes(sTemp);
                    bStrTemp = new byte[bNum.Length - 1];
                    bEnd = 0;
                    for (int i = 0; i < bNum.Length - 1; i++)
                    {
                        bStrTemp[i] = bNum[i];
                        bEnd += bNum[i];
                    }
                    if (bNum[bNum.Length - 1] != 63)
                    {
                        if (bEnd == bNum[bNum.Length - 1])
                        {
                            sData = ASCIIEncoding.Default.GetString(bStrTemp);
                        }
                        else
                        {
                            iState = -1;
                        }
                    }
                    else
                    {
                        sData = ASCIIEncoding.Default.GetString(bStrTemp);
                    }
                }
                else
                {
                    //磁卡信息不完整
                    iState = -1;
                }
            }
            catch (Exception ex)
            {
                iState = -2;
            }

            return iState;
        }

    }

 

 

 

=========

以上方法只是做个思路。并不是这样实际使用。因为最新的HCE300磁卡读写机的文档上,对应的dll里面C++方法,参数都有所改动。

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2011-03-23 [转]用Global统计在线人数
2011-03-23 ASP.NET 提供三种用于在出现错误时捕获和响应错误的主要方法
记录生活、工作、学习点滴!
E-Mail:mahaisong@hotmail.com 欢迎大家讨论。
沐海博客园,我有一颗,卓越的心!
点击右上角即可分享
微信分享提示