Как хранить данные размером более 128 байт в JavaCard - PullRequest
2 голосов
/ 12 декабря 2011

Я не могу записать данные с индексом выше 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 (это означает, что конец файла).

Я использую:

  • смарт-картаtype = карточка контакта
  • с использованием Java-карты 2.2.2 с использованием jcop с использованием apdu

Ответы [ 4 ]

4 голосов
/ 12 декабря 2011

Ваш код содержит несколько проблем:

  1. Как уже было указано в 'pst', вы используете значение byte со знаком, которое работает только до 128 - используйте short вместо

  2. Вы создаете новый буфер Buffer1 при каждом вызове вашего метода Write1. На 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 );
}
3 голосов
/ 07 декабря 2012
short j = (short) apdu_buffer[ISO7816.OFFSET_LC] & 0xFF
1 голос
/ 12 декабря 2011

Разработка ответа PST.Байт имеет номера 2 ^ 8 бит, а точнее 256. Но если вы работаете со знаковыми числами, они будут работать в цикле.Итак, 128 будет на самом деле -128, 129 будет -127 и так далее.

1 голос
/ 12 декабря 2011

Обновление: хотя следующий ответ является "действительным" для обычной Java, пожалуйста, обратитесь к ответу Робертса для информации, относящейся к Java Card, а также к дополнительным проблемам / подходам.


В Java byte имеет значения в диапазоне [-128, 127], поэтому, когда вы говорите «160», это не , что код действительно вам дает:)

Возможно, вы хотели бы использовать:

int j = apduBuffer[4] & 0xFF;

Это увеличивает значение apduBuffer[4] до int, обрабатывая исходные байтовые данные как значение без знака .

Аналогично, i также должен быть int (чтобы избежать неприятной ошибки переполнения и петли навсегда), и метод System.arraycopy также может быть удобен ...

(Я понятия не имею, является ли это единственной / реальной проблемой - или если вышеприведенное является жизнеспособным решением для Java Card - но это точно проблема и выравнивается с указанным «пределом 128».)

Счастливого кодирования.

...