普通磁卡读写方法,转。
2012-03-23 16:39 沐海 阅读(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++方法,参数都有所改动。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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 提供三种用于在出现错误时捕获和响应错误的主要方法