优化 Java 卡上的代码序列

Optimize code sequence on Java Card

我正在尝试对 Java 卡实施 BCH 代码更正。我已经实现了 encode 函数,现在我正在解码 input.My 结果似乎是正确的,但是花在 decode 函数上的时间非常 large.I 弄清楚了序列下面给出的代码是最耗时的。

    Util.arrayCopy(data, OFFSET_START, transientMemory, OFFSET_START,LENGTH);
    short i, j, u, q, t2, count = 0, syn_error = 0;
    t2 = (short) (2 * T);
    for (i = 1; i <= t2; i++)
    {
        for (j = 0; j < LENGTH; j++)
            if (transientMemory[j] != 0)
            {
                short t = (short)(i*j);
                if(t < 0) // (i*j > 32767 )
                {
                    t &= (short)0x7FFF;
                    t += 64;  // hack because n is always 511
                }
                t %= n;
                s[i] ^= ALPHA_TO[t]; // stored in EEPROM
            }   
        if (s[i] != 0)
            syn_error = 1; 
        s[i] = (short) INDEX_OF[s[i]]; //stored in EEPROM

   }
   Util.arrayCopy(transientMemory, OFFSET_START, data, OFFSET_START,LENGTH);
   ISOException.throwIt(ISO7816.SW_CORRECT_LENGTH_00); // for stopping the program

我为byte[]预分配了两个RAM缓冲区transientMemory,为short[]预分配了temp_ram但是时间似乎执行时间仍然很长(370 s ) .本例中t2的值为104LENGTH的值为386。有什么方法可以使这段代码更好地工作

我设法通过在 RAM 中存储一些变量而不是 EEPROM.Here 来优化我的代码

    byte[] transientMemory = p_Memory.geByteRam();
    short[] temp_ram = p_Memory.getShortRam();
    short index = 0;
    for(; index < n ; index++)
        temp_ram[index]=ALPHA_TO[index];
    Util.arrayCopyNonAtomic(data, OFFSET_START, transientMemory, OFFSET_START,LENGTH);
    short i, j, u, q, t2, count = 0, syn_error = 0,s_local=0;
    t2 = (short) (2 * T);
    for (i = 1; i <= t2; i++)
    {
        s_local = s[i];
        for (j = 0; j < LENGTH; j++)
            if (transientMemory[j] != 0)
            {
                short t = (short)(i*j);
                if(t < 0) // (i*j > 32767 )
                {
                    t &= (short)0x7FFF;
                    t += 64;  // hack because n is always 511
                }
                t %= n;
                s_local ^= temp_ram[t]; 
            }   
        if (s_local != 0)
            syn_error = 1; 
        s[i] = (short) INDEX_OF[s_local];
   }
    for(; index < n ; index++)
        ALPHA_TO[index]=temp_ram[index];

现在执行时间似乎接近45s

你可以使用一些强度降低。某些低端 CPU 的乘法和除法成本很高,所以我会替换

short t = (short)(i*j);

t += i在内部循环之前将其声明为short t = 0之后。

如果我理解正确的话

if(t < 0) // (i*j > 32767 )
{
    t &= (short)0x7FFF;
    t += 64;  // hack because n is always 511
}
t %= n;

如果 tint,它的作用与 t %= 511 相同。由于 t 必须适合无符号短,假设普通 Java 你可以写

t += (t & 511) + ((t >>> 9) & 63);
if (t >= 511) t -= 511;

不知道如何将其转换为您需要的内容,因为我不知道如何表达 short 的移位(在普通的 Java 中,移位操作数被提升为 int).它可能像我写的那样工作...