我的卡是gemalto v2.2.1,T = 0并且它不支持apdu链。 我看到样本他们正在使用ExtendedLength,但我的卡不受支持。 我写了一个代码,但我有问题。每个人都可以告诉我 我在哪里弄错了,或者请给我一个解决方案。
public class ap2 extends Applet {
private Object[] FileArray;
private ap2() {
// I want to save three binary data
FileArray=new Object[3];
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new ap2().register();
}
public void process(APDU arg0) throws ISOException {
// TODO Auto-generated method stub
}
private void ReadBinaryData(APDU apdu)
{
short offset = getoffset_read(apdu);
byte[] buf= apdu.getBuffer();
//I send file index in p1 from host and get File Index in card
byte p1value=buf[ISO7816.OFFSET_P1];
byte[] FileObj=(byte[]) FileArray[p1value];
short le = apdu.setOutgoing();
if(le == 0 || le == 256) {
le = (short)(FileObj.length - offset);
if(le > 256) le = 256;
}
boolean eof = false;
if((short)(FileObj.length - offset) < le) {
le = (short)(FileObj.length - offset);
eof = true;
}
apdu.setOutgoingLength(le);
apdu.sendBytesLong(FileObj, offset, le);
if(eof) {
ISOException.throwIt(SW_END_OF_FILE);
}
}
private short getoffset_read(APDU apdu)
{
?????????????????
}
private void WriteBinaryData(APDU apdu)
{
if(FileCount==3)
{
ISOException.throwIt(SW_END_OF_ThreeFILES);
}
byte[] buf = apdu.getBuffer();
short offset = getoffset_write();
byte lc=buf[ISO7816.OFFSET_LC];
if((short)(offset + lc) >((byte[])FileArray[FileCount]).length) {
ISOException.throwIt(SW_WRONG_LENGTH);
}
apdu.setIncomingAndReceive();
Util.arrayCopyNonAtomic(buf, ISO7816.OFFSET_CDATA,(byte[]) FileArray[FileCount],offset,lc);
}
private short getoffset_write()
{
????????????????????
}
我不知道如何计算偏移量。
答案 0 :(得分:0)
将偏移量编码为字节P1P2作为短值
short offset = Util.getShort(apdu.getBuffer(), ISO7816.OFFSET_P1);
您不应该按P1字节选择文件,而是在使用Select命令读取/写入数据之前选择它。请详细研究ISO7816-4,因为这将解决您的所有问题。