[英]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(這意味着達到文件結束)。
我在用:
您的代碼包含幾個問題:
正如'pst'已經指出的那樣,你使用的是一個有符號的byte
值,最多只能工作128個 - 而是使用short
您正在每次調用Write1
方法時創建一個新緩沖區Buffer1
。 在JavaCard上通常沒有自動垃圾收集 - 因此內存分配應該只在安裝應用程序時完成一次。 如果您只想處理adpu緩沖區中的數據,請從那里使用它。 如果你想將數據從一個字節數組復制到另一個字節數組,最好使用javacard.framework.Util.arrayCopy(..)
。
你正在調用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.