Локальная переменная память для карты Java с фиксированным размером - PullRequest
0 голосов
/ 08 декабря 2018

Интересно, кто-нибудь точно знает, где хранится массив temp (EEPROM или RAM) в следующем методе Java Card (часть исходного кода WalletDemoApplet, который я нашел в каталоге примеров JCIDE).Обратите внимание, что массив не выделяется с помощью makeTransientByteArray.Также он объявлен как локальная переменная внутри метода.

private void calIntegral(byte [] buf,byte soff,short len)
{
    byte temp[]={0x00,0x00,0x00,0x00};
    short low=0;
    byte aa=0;
    if (len==2)
        Util.arrayCopy(buf, soff, temp,(short)2, len);
    else
        Util.arrayCopy(buf, soff, temp,(short)0, len);

    ...
}

Кроме того, в Руководстве разработчика по Java Card Applet вы можете найти:

Конвертер обеспечивает выделение памяти для содержимого статических полей, а именно для примитивных типов данных и ссылок на массивы.Память выделяется для экземпляров с использованием нового байт-кода из системной кучи и не может быть возвращена (если на смарт-карте не реализован сборщик мусора).Память для переменных, локальных переменных и параметров метода выделяется из стека и освобождается при возврате метода.

1 Ответ

0 голосов
/ 09 декабря 2018

Эта часть WalletDemoApplet определенно не должна генерироваться в локальной переменной:

byte temp[]={0x00,0x00,0x00,0x00};

Это хранилище EEPROM;часть new byte[] может быть скрыта, но создание массива все еще выполняется, , как указано в JLS :

Инициализатор массива создает массив и предоставляет начальные значения для всехего компоненты.

здесь инициализатор массива - это фигурные скобки и все, что в них есть.


Пожалуйста, игнорируйте хотя бы эту часть примера.Обычно для этого вы используете статический метод и поле класса с makeTransientByteArray (вызывается при создании экземпляра апплета) в качестве буфера.То есть: если вам требуется массив, простое определение 4-байтовых переменных или - в этом случае - непосредственная установка байтовых значений также может сработать.

...