2013-10-22 39 views
0

我有一個問題讓我困惑了幾天。 我想發送一個大於255字節的數據從智能卡發送到主機應用程序。 我在一些網站上看到了一段代碼。此代碼如下:ISO7816.SW_BYTES_REMAINING_00在javacard中返回9000狀態

private void sendData(APDU apdu) { 
     // work out how many bytes to send this time and how many will be left 
     BUF_IN_OFFSET[0] = 0; 

     short remain = (short) ((short)372 - BUF_IN_OFFSET[0]); 
     boolean chain = remain > MAX_APDU; 
     short sendLen = chain ? MAX_APDU : remain; 
     Util.arrayCopy(data, (short) 0, apdu.getBuffer(), (short) 0, sendLen); 
     // Get ready to send 
     apdu.setOutgoing(); 
     apdu.setOutgoingLength((short)sendLen); 
     apdu.sendBytesLong(apdu.getBuffer(), BUF_IN_OFFSET[0], sendLen); 

     // Check to see if there are more APDU's to send 
     if (chain) { 
      BUF_IN_OFFSET[0] += sendLen; // count the bytes sent 
      remain -=sendLen; 
      ISOException.throwIt((short)((ISO7816.SW_BYTES_REMAINING_00) + remain)); 

     } else { 
      BUF_IN_OFFSET[0] = 0; // no more bytes to send 
     } 


    } 

當我發送apdu到netbeans模擬器中的卡,它發送6100正確。但是當我把它發送到真正的卡(smartcafe 3.2)卡。它發送給我9000.這意味着它在模擬器的工作,但通過真正的卡它不工作。 我想它與協議T = 0或T = 1有關。 我沒有找到T = 1的任何代碼。上面的代碼是T = 0。

在此先感謝。

+0

讓主應用程序保持關於偏移量的狀態不是更容易嗎? (即,提供'GET LENGTH'指令和一個帶有偏移參數的'READ BINARY'指令。) – martijno

+0

在某些情況下,您的評論是真實的,例如,當您需要字節流時。但是在某些情況下,小程序會完成所有操作,例如讀取卡上生成的對象。 –

回答

0

'6100'聽起來像是條款中的矛盾。它告訴讀者讀取一些數據,可用的數據是空的。我相信真正的卡實際上會變成9000,這是沒有數據時適當的執行狀態代碼。

+0

感謝回覆takumar。如果卡片中沒有可用的數據,我同意你的意見,但我有更多的數據。根據上述代碼,所有數據都存儲在長度爲372字節的數據變量中。我在第一個命令中讀取了255個字節,然後發送(ISO7816.SW_BYTES_REMAINING_00 +保留的字節)給主機,說有更多的數據和它的長度。然後主機發送獲取響應命令來讀取剩餘數據。 –

+0

爲什麼不簡單地將整個數據塊發送到卡操作系統進行管理,讓它爲您生成61xx代碼?在我看來,這不應該在應用層面進行編碼,因爲它是一種常見的傳輸機制。 – takumar

+0

你的意思是我發送整個372字節的響應apdu遵循下面的代碼:apdu.setOutgoingLength((short)372); apdu.sendBytesLong(data,(short)0,(short)372);但我之前嘗試過,它不起作用併發送6F00狀態字。 –