2011-12-12 51 views
2

我無法在字節數組中的128以上的索引處寫入數據。下面給出了代碼 。如何在JavaCard中存儲大於128字節的數據

private void Write1(APDU apdu) throws ISOException 
{ 
    apdu.setIncomingAndReceive(); 
    byte[] apduBuffer = apdu.getBuffer(); 
    byte j = (byte)apduBuffer[4];  // Return incoming bytes lets take 160 
    Buffer1 = new byte[j];    // initialize a array with size 160 
    for (byte i=0; i<j; i++) 
     Buffer1[(byte)i] = (byte)apduBuffer[5+i]; 
} 

它給我錯誤6F 00(這意味着達到文件結束)。

我使用:

  • 智能卡類型=接觸卡
  • 使用的Java Card 2.2.2 JCOP使用APDU

回答

4

你的代碼中包含了幾個問題:

  1. 前面已經指出的「PST」您使用的是簽署byte值只能達到128 - 使用short代替

  2. 您正在在Write1方法的每次調用中創建一個新的緩衝區Buffer1。在JavaCard上通常不會有自動垃圾回收 - 因此內存分配只能在安裝應用程序時進行一次。如果您只想處理adpu緩衝區中的數據,請從此處使用它。如果你想從一個字節數組複製數據到另一個更好使用javacard.framework.Util.arrayCopy(..)

  3. 您正在調用apdu.setIncomingAndReceive();,但忽略返回值。返回值爲您提供可以讀取的數據的字節數。

下面的代碼是從所述API文檔並顯示常見的方式:

short bytesLeft = (short) (buffer[ISO7816.OFFSET_LC] & 0x00FF); 
if (bytesLeft < (short)55) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); 
short readCount = apdu.setIncomingAndReceive(); 
while (bytesLeft > 0){ 

    // process bytes in buffer[5] to buffer[readCount+4]; 

    bytesLeft -= readCount; 
    readCount = apdu.receiveBytes (ISO7816.OFFSET_CDATA); 
} 
+0

謝謝你的回答。我試過了,但是它不會寫入或接受超過255的值。 –

+1

這是設計。標準APDU不能大於255個字節。只有具有擴展APDU支持的卡才能處理大於該值的APDU。實際上,最大數據長度通常甚至小於255個字節,因爲必須考慮封裝安全通道的安全有效載荷。 – Robert

+0

好的,謝謝各位的支持 –

1

更新:雖然下面的答案是 「有效」 的普通的Java,請參閱Roberts對Java Card特定信息的回答,以及其他關注/方法。


在Java中的byte範圍[-128, 127]有值,因此,當你說「160」,這是什麼代碼是真的給你:)

也許你想使用:

int j = apduBuffer[4] & 0xFF; 

即「upcasts」的值apduBuffer[4]int而處理該原始數據字節作爲一個無符號值。

同樣,i也應該是一個int(以避免討厭的溢出和環 - 永遠的bug),和System.arraycopy方法可以幫助,以及...

(我不知道如果這是唯一的/真正的問題 - 或者,如果上面是一個Java Card一個可行的解決方案 - 但可以肯定的是一個問題,並提到的「128限制」對齊)

編碼愉快。

+1

很多JavaCard的實施方式中的不支持'int'數據類型。因此使用'short'是最好的方法。另外,JavaCard環境中沒有可用的System.arrayCopy()。 – Robert

+0

@羅伯特感謝您的信息。你的答案肯定比較適合Java Card :) – 2011-12-12 18:16:17

1

詳細闡述了pst的答案。一個字節有2^8位數字,或者更確切地說是256位。但是如果你使用帶符號的數字,它們將在一個循環中工作。所以,128實際上是-128,129會是-127等等。

+0

有沒有什麼辦法可以使用無符號字節 –

3
short j = (short) apdu_buffer[ISO7816.OFFSET_LC] & 0xFF 
相關問題