簡體   English   中英

如何在JavaCard中存儲大於128字節的數據

[英]How to store data larger than 128 byte in 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卡2.2.2與jcop使用apdu

您的代碼包含幾個問題:

  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 );
}
short j = (short) apdu_buffer[ISO7816.OFFSET_LC] & 0xFF

更新:雖然以下答案對普通Java是“有效”,但請參閱Roberts答復Java Card特定信息,以及其他問題/方法。


在Java中,一個byte值在[-128, 127]范圍內[-128, 127]因此,當你說“160”時,那不是代碼真正給你的:)

也許你想用:

int j = apduBuffer[4] & 0xFF;

將值apduBuffer[4] “upcast”為int同時將原始字節數據視為無符號值。

同樣, i也應該是一個int (以避免一個令人討厭的溢出和循環永遠的錯誤), System.arraycopy方法也可以很方便...

(我不知道這是否是唯一/真正的問題 - 或者如果以上是Java卡的可行解決方案 - 但它肯定是一個問題並且與提到的“128限制”一致。)

快樂的編碼。

詳細說明pst的答案。 一個字節有2 ^ 8位數字,或者更確切地說是256位。但是如果你使用有符號數字,它們將在一個循環中工作。 因此,128實際上是-128,129將是-127,依此類推。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM