C# SCardTransmit()返回空的响应缓冲区

C# SCardTransmit()返回空的响应缓冲区,c#,.net,smartcard,cac,C#,.net,Smartcard,Cac,使用所描述的框架,我试图从智能卡读取数据。我已经建立了一个apdu命令。命令结构似乎是正确的,因为它在java中工作。当我调用SCardTransmit()函数时,会执行该命令,但它会返回长度为Le+2字节的空响应缓冲区。保存SW1和SW2的前两个字节是6118。我相信这意味着要将更多字节读入缓冲区。但是,当我更改缓冲区大小时,响应缓冲区大小也会更改,但仍然会得到错误代码6118。这是一个select命令,后面是一个get data命令,返回状态6100,我认为这意味着仍有超过0xFF字节要读取

使用所描述的框架,我试图从智能卡读取数据。我已经建立了一个apdu命令。命令结构似乎是正确的,因为它在java中工作。当我调用SCardTransmit()函数时,会执行该命令,但它会返回长度为Le+2字节的空响应缓冲区。保存SW1和SW2的前两个字节是6118。我相信这意味着要将更多字节读入缓冲区。但是,当我更改缓冲区大小时,响应缓冲区大小也会更改,但仍然会得到错误代码6118。这是一个select命令,后面是一个get data命令,返回状态6100,我认为这意味着仍有超过0xFF字节要读取。那么,如何让响应缓冲区被填充呢

所描述的行为与T=0协议卡匹配。在该协议中,您永远不会直接获得命令响应,而是必须发送一个get响应命令,该命令的长度在上一个命令的返回代码中报告,这里是0x18。

这正是我在这里要做的,但这18与所选数据的长度无关。GET-response的响应具有独立的length@nwnoga响应代码“61 nn”的确切意思是“请发送P3/LE=nn的GET响应”。我不明白,如果你看到一个独立的长度,也不建议用不同的东西替换“nn”,因为有些卡可能不接受它。在java程序中,SELECT返回26字节,GET响应返回1100字节。据我所知,6118的意思是“您的响应缓冲区短了18个字节,我还有更多的数据要提供。”26与0x18加上2个字节SW1/SW2匹配,因此选择的响应似乎很好。我仍然感到困惑,无论您是在谈论您的问题中指出的“获取数据”,还是在我的回答中提到的获取响应。在T=0的情况下,GET RESPONSE是必不可少的,因为没有它,任何命令都不会得到响应。请注意,可能需要多个GET响应,在这种情况下,除最后一个响应外,所有响应的SW1/SW2都应为6100。直接返回响应的一部分,通过GET响应返回其余部分的行为与T=0不同。另外,SCardTransmit()也无助于识别发送的指令。命令顺序如下:Select、GET RESPONSE、GET DATA、GET RESPONSE