C#中关于对IC卡读写的总结

环境:vs.net2005/USB口IC卡读写器/IC卡

IC卡内部存储结构分为16个扇区,0-15区,个扇区有独立的密码和权限控制字,可作为独立的电子钱包,每个扇区有4个块,序号为第0块、第1块、第2块、第3块,每块16个字节,第3块是卡的密码和权限控制字专用块,禁止在此存放数据。第0块、第1块、第2块可随意存放数据。但第0区的第0块已被固化了IC卡出厂信息,此块只能读出信息,不可更改。

购买读写器时候厂商都会提供动态调用库的. 本文以RUK公司的OUR MIFARE.dll动态调用库为例.

该动态库必须和读写器一起使用。还必须将硬件底层驱动的动态库WY-ICUSB.DLL放在与OUR_MIFARE.dll同一个目录下,否则不能使用。另外在软件运行的过程当中可以随时更换USB接口.

 

ContractedBlock.gif ExpandedBlockStart.gif Code
  1ExpandedBlockStart.gifContractedBlock.gif/**//// <summary>
  2    /// 与读写器连接类
  3    /// arongbest
  4    /// </summary>

  5    public class OUR_MIFARE
  6ExpandedBlockStart.gifContractedBlock.gif    {
  7ContractedSubBlock.gifExpandedSubBlockStart.gif        引入动态库#region 引入动态库
  8        //读卡
  9        [DllImport("OUR_MIFARE.dll", EntryPoint = "piccreadex")]
 10        public static extern byte piccreadex(byte ctrlword, byte[] serial, byte area, byte keyA1B0, byte[] picckey, byte[] piccdata0_2);
 11        //写卡
 12        [DllImport("OUR_MIFARE.dll", EntryPoint = "piccwriteex")]
 13        public static extern byte piccwriteex(byte ctrlword, byte[] serial, byte area, byte keyA1B0, byte[] picckey, byte[] piccdata0_2);
 14        //发出声音
 15        [DllImport("OUR_MIFARE.dll", EntryPoint = "pcdbeep")]
 16        public static extern byte pcdbeep(ushort mm);
 17        #endregion

 18
 19ContractedSubBlock.gifExpandedSubBlockStart.gif        变量声明#region 变量声明
 20        const byte BLOCK0_EN = 0x01;
 21        const byte BLOCK1_EN = 0x02;
 22        const byte BLOCK2_EN = 0x04;
 23        const byte EXTERNKEY = 0x10;
 24        //const byte NEEDSERIAL = 0x08;
 25        //const byte NEEDHALT = 0x20;
 26        //byte area =1;//区号
 27        byte keyA1B0 = 1;//密码类型 大于0表示用A密码认证
 28        byte ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;//控制字
 29        byte[] picckey; //密码
 30        byte[] serial;//卡序列号
 31        //byte[] piccdata0_2; //卡数据缓冲
 32        string status="";  //返回状态
 33        #endregion

 34ContractedSubBlock.gifExpandedSubBlockStart.gif       读卡并返回状态编号#region 读卡并返回状态编号
 35ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
 36        /// 读卡并返回状态编号
 37        /// </summary>
 38        /// <param name="area"></param>
 39        /// <returns></returns>

 40        public string Get_ReadIC_Status()
 41ExpandedSubBlockStart.gifContractedSubBlock.gif        
 42            picckey = new byte[6];
 43            picckey[0= 0xFF;
 44            picckey[1= 0xFF;
 45            picckey[2= 0xFF;
 46            picckey[3= 0xFF;
 47            picckey[4= 0xFF;
 48            picckey[5= 0xFF;
 49
 50            byte[] piccdata0_2, piccdata0_2_1, piccdata0_2_2, piccdata0_2_3;
 51            serial = new byte[4];
 52            piccdata0_2 = new byte[48]; //存1区数据
 53            piccdata0_2_1 = new byte[48]; //存2区数据
 54            piccdata0_2_2 = new byte[48]; //存3区数据
 55            piccdata0_2_3 = new byte[48]; //存5区数据
 56            Beep();
 57            status = piccreadex(ctrlword, serial,(byte)1, keyA1B0, picckey, piccdata0_2).ToString();
 58            piccreadex(ctrlword, serial, (byte)2, keyA1B0, picckey, piccdata0_2_1).ToString();
 59            piccreadex(ctrlword, serial, (byte)3, keyA1B0, picckey, piccdata0_2_2).ToString();
 60            piccreadex(ctrlword, serial, (byte)5, keyA1B0, picckey, piccdata0_2_3).ToString();
 61
 62ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_CardNo ={ piccdata0_2[0], piccdata0_2[1], piccdata0_2[2], piccdata0_2[3], piccdata0_2[4], piccdata0_2[5], piccdata0_2[6], piccdata0_2[7] };
 63            Card_No = System.Text.Encoding.Default.GetString(array_CardNo);
 64ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_CardType ={ piccdata0_2[8], piccdata0_2[9], piccdata0_2[10], piccdata0_2[11], piccdata0_2[12], piccdata0_2[13], piccdata0_2[14], piccdata0_2[15], piccdata0_2[16], piccdata0_2[17]};
 65            Card_Type = System.Text.Encoding.Default.GetString(array_CardType);
 66ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_CardStatus ={ piccdata0_2[18], piccdata0_2[19], piccdata0_2[20], piccdata0_2[21] };
 67            Card_Status = System.Text.Encoding.Default.GetString(array_CardStatus);
 68ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_BeginDate ={ piccdata0_2[22], piccdata0_2[23], piccdata0_2[24], piccdata0_2[25], piccdata0_2[26], piccdata0_2[27], piccdata0_2[28], piccdata0_2[29], piccdata0_2[30], piccdata0_2[31]};
 69            Begin_Date = System.Text.Encoding.Default.GetString(array_BeginDate);
 70ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_EndDate ={ piccdata0_2[32], piccdata0_2[33], piccdata0_2[34], piccdata0_2[35], piccdata0_2[36], piccdata0_2[37], piccdata0_2[38], piccdata0_2[39], piccdata0_2[40], piccdata0_2[41] };
 71            End_Date = System.Text.Encoding.Default.GetString(array_EndDate);
 72ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_Money ={ piccdata0_2[42], piccdata0_2[43], piccdata0_2[44], piccdata0_2[45], piccdata0_2[46], piccdata0_2[47]};
 73            Money = System.Text.Encoding.Default.GetString(array_Money);
 74
 75ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_TicketFlag ={ piccdata0_2_1[0], piccdata0_2_1[1], piccdata0_2_1[2], piccdata0_2_1[3], piccdata0_2_1[4], piccdata0_2_1[5], piccdata0_2_1[6], piccdata0_2_1[7], piccdata0_2_1[8], piccdata0_2_1[9], piccdata0_2_1[10], piccdata0_2_1[11] };
 76            Ticket_Flag = System.Text.Encoding.Default.GetString(array_TicketFlag);
 77ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_EnterFlag ={ piccdata0_2_1[12], piccdata0_2_1[13], piccdata0_2_1[14], piccdata0_2_1[15], piccdata0_2_1[16], piccdata0_2_1[17] };
 78            Enter_Flag = System.Text.Encoding.Default.GetString(array_EnterFlag);
 79ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_EnterStation ={ piccdata0_2_1[18], piccdata0_2_1[19], piccdata0_2_1[20], piccdata0_2_1[21], piccdata0_2_1[22], piccdata0_2_1[23], piccdata0_2_1[24], piccdata0_2_1[25], piccdata0_2_1[26], piccdata0_2_1[27] };
 80            Enter_Station = System.Text.Encoding.Default.GetString(array_EnterStation);
 81ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_EnterDate ={ piccdata0_2_1[28], piccdata0_2_1[29], piccdata0_2_1[30], piccdata0_2_1[31], piccdata0_2_1[32], piccdata0_2_1[33], piccdata0_2_1[34], piccdata0_2_1[35], piccdata0_2_1[36], piccdata0_2_1[37], piccdata0_2_1[38], piccdata0_2_1[39], piccdata0_2_1[40], piccdata0_2_1[41], piccdata0_2_1[42], piccdata0_2_1[43], piccdata0_2_1[44], piccdata0_2_1[45], piccdata0_2_1[46], piccdata0_2_1[47]};
 82            Enter_Date = System.Text.Encoding.Default.GetString(array_EnterDate);
 83
 84            Useful_Station = System.Text.Encoding.Default.GetString(piccdata0_2_2);
 85
 86ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_Exception1 ={ piccdata0_2_3[0]};
 87ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_Exception2 ={ piccdata0_2_3[1] };
 88ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_Exception3 ={ piccdata0_2_3[2] };
 89ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_Exception4 ={ piccdata0_2_3[3] };
 90ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_Exception5 ={ piccdata0_2_3[4] };
 91ExpandedSubBlockStart.gifContractedSubBlock.gif            byte[] array_Exception6 ={ piccdata0_2_3[5] };
 92            Exception1 = System.Text.Encoding.Default.GetString(array_Exception1);
 93            Exception2 = System.Text.Encoding.Default.GetString(array_Exception2);
 94            Exception3 = System.Text.Encoding.Default.GetString(array_Exception3);
 95            Exception4 = System.Text.Encoding.Default.GetString(array_Exception4);
 96            Exception5 = System.Text.Encoding.Default.GetString(array_Exception5);
 97            Exception6 = System.Text.Encoding.Default.GetString(array_Exception6);
 98
 99            return status;
100        }

101ContractedSubBlock.gifExpandedSubBlockStart.gif 获取IC卡序列号#region 获取IC卡序列号
102ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
103        /// 获取IC卡的序列号
104        /// </summary>
105        /// <returns></returns>

106        public byte[] Get_ReadIC_Serial()
107ExpandedSubBlockStart.gifContractedSubBlock.gif        {
108            byte area = 1;
109            picckey = new byte[6];
110            picckey[0= 0xFF;
111            picckey[1= 0xFF;
112            picckey[2= 0xFF;
113            picckey[3= 0xFF;
114            picckey[4= 0xFF;
115            picckey[5= 0xFF;
116
117            byte[] piccdata0_2;
118            serial = new byte[4];
119            piccdata0_2 = new byte[48];
120            //Beep();
121            piccreadex(ctrlword, serial, area, keyA1B0, picckey, piccdata0_2).ToString();
122
123            return serial;
124
125        }

126        #endregion

127ContractedSubBlock.gifExpandedSubBlockStart.gif       让读卡器发出声音#region 让读卡器发出声音
128ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
129        /// 让读写器发出声音
130        /// </summary>

131        public void Beep()
132ExpandedSubBlockStart.gifContractedSubBlock.gif        {
133            pcdbeep(50);
134        }

135        #endregion

136
137ContractedSubBlock.gifExpandedSubBlockStart.gif        写卡并返回状态编号#region 写卡并返回状态编号
138ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
139        /// 向IC卡中写入数据并返回状态编号
140        /// </summary>
141        /// <param name="area">扇区</param>
142        /// <returns></returns>

143        public string Get_WriteIC_Status()
144ExpandedSubBlockStart.gifContractedSubBlock.gif        {
145            picckey = new byte[6];
146            picckey[0= 0xFF;
147            picckey[1= 0xFF;
148            picckey[2= 0xFF;
149            picckey[3= 0xFF;
150            picckey[4= 0xFF;
151            picckey[5= 0xFF;
152
153            serial = new byte[4];
154
155            byte[] piccdata0_2, piccdata0_2_1, piccdata0_2_2,piccdata0_2_3;
156            piccdata0_2 = new byte[48];
157            piccdata0_2_1 = new byte[48];
158            piccdata0_2_2 = new byte[48];
159            piccdata0_2_3 = new byte[48];
160
161            byte[] array_CardNo=new byte[8];
162            array_CardNo = System.Text.Encoding.Default.GetBytes(Card_No);
163            byte[] array_CardType = new byte[10];
164            array_CardType=System.Text.Encoding.Default.GetBytes(Card_Type);
165            byte[] array_CardStatus = new byte[4];
166            array_CardStatus=System.Text.Encoding.Default.GetBytes(Card_Status);
167            byte[] array_BeginDate = new byte[10];
168            array_BeginDate = System.Text.Encoding.Default.GetBytes(Begin_Date);
169            byte[] array_EndDate = new byte[10];
170            array_EndDate = System.Text.Encoding.Default.GetBytes(End_Date);
171            byte[] array_Money = new byte[6];
172            array_Money=System.Text.Encoding.Default.GetBytes(Money);
173
174            byte[] array_TicketFlag=new byte[12];
175            array_TicketFlag = System.Text.Encoding.Default.GetBytes(Ticket_Flag);
176            byte[] array_EnterFlag = new byte[6];
177            array_EnterFlag=System.Text.Encoding.Default.GetBytes(Enter_Flag);
178            byte[] array_EnterStation = new byte[10];
179            array_EnterStation=System.Text.Encoding.Default.GetBytes(Enter_Station);
180            byte[] array_EnterDate = new byte[20];
181            array_EnterDate=System.Text.Encoding.Default.GetBytes(Enter_Date);
182
183            piccdata0_2_2 = System.Text.Encoding.Default.GetBytes(Useful_Station);
184
185            byte[] array_CardPass = new byte[8];
186            array_CardPass = System.Text.Encoding.Default.GetBytes(Card_Pass);
187            
188
189            Array.Copy(array_CardNo,0, piccdata0_2,0,array_CardNo.Length);
190            Array.Copy(array_CardType,0,piccdata0_2,8,array_CardType.Length);
191            Array.Copy(array_CardStatus,0, piccdata0_2,18,array_CardStatus.Length);
192            Array.Copy(array_BeginDate,0,piccdata0_2,22, array_BeginDate.Length);
193            Array.Copy(array_EndDate,0,piccdata0_2,32, array_EndDate.Length);
194            Array.Copy(array_Money,0,piccdata0_2,42,array_Money.Length);
195
196            Array.Copy(array_TicketFlag, 0, piccdata0_2_1, 0, array_TicketFlag.Length);
197            Array.Copy(array_EnterFlag, 0, piccdata0_2_1,12,array_EnterFlag.Length);
198            Array.Copy(array_EnterStation, 0, piccdata0_2_1,18,array_EnterStation.Length);
199            Array.Copy(array_EnterDate, 0, piccdata0_2_1,28,array_EnterDate.Length);
200
201            Array.Copy(array_CardPass, 0, piccdata0_2_3, 16, array_CardPass.Length);
202
203            Beep();
204
205            status = piccwriteex(ctrlword, serial,(byte)1, keyA1B0, picckey, piccdata0_2).ToString();
206            piccwriteex(ctrlword, serial,(byte)2, keyA1B0, picckey, piccdata0_2_1);
207            piccwriteex(ctrlword, serial,(byte)3, keyA1B0, picckey, piccdata0_2_2);
208            piccwriteex(ctrlword, serial,(byte)0, keyA1B0, picckey, piccdata0_2_3);
209
210            return status;
211        }

212        #endregion

213  }

转载于:https://www.cnblogs.com/arongbest/archive/2009/05/06/1450601.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值