2

バイト配列で 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が表示されます(ファイルの終わりに到達することを意味します)。

私は使っている:

  • スマート カード タイプ = 連絡先カード
  • apduを使用してjcopでJavaカード2.2.2を使用する
4

4 に答える 4

5

あなたのコードにはいくつかの問題があります:

  1. すでに「pst」で指摘されているbyteように、128 までしか機能しない符号付きの値を使用しています。short代わりにa を使用してください。

  2. Buffer1メソッドの呼び出しごとに新しいバッファを作成していますWrite1。JavaCard では、通常、自動ガベージ コレクションはありません。そのため、メモリの割り当ては、アプリのインストール時に 1 回だけ行う必要があります。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 );
}
于 2011-12-12T12:23:17.607 に答える
3
short j = (short) apdu_buffer[ISO7816.OFFSET_LC] & 0xFF
于 2012-12-07T09:39:05.900 に答える
1

更新: 次の回答は通常の Java に対して「有効」ですが、Java カード固有の情報と追加の懸念/アプローチについては、Roberts の回答を参照してください。


Java では、 a のbyte値は範囲内にある[-128, 127]ため、「160」と言うと、それはコードが実際に提供しているものではありません:)

おそらくあなたは使いたいでしょう:

int j = apduBuffer[4] & 0xFF;

元のバイトデータを符号なし値として扱いながら、値apduBuffer[4]をに「アップキャスト」します。int

同様に、 (厄介なオーバーフローと永遠のループのバグを回避するため) であるi必要があり、 System.arraycopyメソッドも同様に便利です...int

(それが唯一の/本当の問題なのか、それとも上記がJava Cardで実行可能な解決策なのかはわかりませんがそれは確かに問題であり、言及された「128制限」と一致しています。)

ハッピーコーディング。

于 2011-12-12T07:22:01.520 に答える
1

pstの回答について詳しく説明します。1 バイトには 2^8 ビットの数値、つまり 256 があります。したがって、128 は実際には -128 になり、129 は -127 になります。

于 2011-12-12T07:51:48.657 に答える