0

大家好,我还有另一个问题要问你:)

我想用协议 t=1 与智能卡通信。我正在使用 Windows 智能卡 api (winscard.dll) 和 C#。我有

用于传输数据的 SCardEstablishContext()、SCardListReaders()、SCardConnect()、SCardStatus()、SCardTransmit()、SCardDisconnect()、SCardReleaseContext() 函数。

我想用下面的代码选择主文件(mf)

SCARD_IO_REQUEST sendreq,recvreq;

byte[] sendbuff = { 0x00, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00 };

sendreq.protocol = SCARD_PROTOCOL_T1;
sendreq.pciLength = 8;
recvreq.protocol = SCARD_PROTOCOL_T1;
recvreq.pciLength = 8;

byte[] RecvBuff = new byte[258];
int recvbufflen = 2;

SCardTransmit(hCard, ref sendreq, ref sendbuff[0], sendbuff.Length, ref recvreq, ref RecvBuff[0], ref recvbufflen);

成功任务的响应必须为 9000,但我收到 6A86(无效的 ins 参数)。

我的问题是:

1- 为什么我会收到此回复?

2-如果是,我是否必须使用 pts 命令更改协议,为什么?(该卡只支持t1)

3-协议t = 1帧必须是序言字段+信息字段+结尾字段。但我没有将序言和尾声字节添加到 sendbuff。使用windows api时是否有必要将它们添加到sendbuff?

谢谢..

4

1 回答 1

0

由于参数p1和p2,我已经解决了这个问题。尽管收到“无效参数”,但我认为参数是正确的。所以我在其他地方搜索错误。

选择文件时,参数必须为 0x02 和 0x0C。

编辑:在 guidot 的评论之后,我意识到我没有使用这些参数来选择主文件。(试过但后来改了)要在 MF 下选择 EF :

byte[] sendbuff = {0x00, 0xA4, 0x02, 0x0C, 0x02, id1, id2}

感谢guidot..

于 2013-03-29T07:42:50.363 回答