代码之家  ›  专栏  ›  技术社区  ›  Jean

解释java卡HelloWorld小程序

  •  1
  • Jean  · 技术社区  · 10 年前

    下面,您可以看到一个java卡程序,当它收到APDU命令时,它会返回“Hello Word”= 8000000000 ( its source )

    package helloWorldPackage;
    
    import javacard.framework.APDU;
    import javacard.framework.Applet;
    import javacard.framework.ISO7816;
    import javacard.framework.ISOException;
    import javacard.framework.Util;
    
    public class HelloWorldApplet extends Applet 
    {
        private static final byte[] helloWorld = {(byte)'H',(byte)'e',(byte)'l',(byte)'l',(byte)'o',(byte)' ',(byte)'W',(byte)'o',(byte)'r',(byte)'l',(byte)'d',};
        private static final byte HW_CLA = (byte)0x80;
        private static final byte HW_INS = (byte)0x00;
    
        public static void install(byte[] bArray, short bOffset, byte bLength) 
            {
            new HelloWorldApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
            }
    
        public void process(APDU apdu) 
            {
            if (selectingApplet()) 
                {
                return;
                }
    
            byte[] buffer = apdu.getBuffer();
            byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
            byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);
    
            if (CLA != HW_CLA)
                {
                ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
                }
    
            switch ( INS ) 
                {
                case HW_INS:
                    getHelloWorld( apdu );
                    break;
                default:
                    ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
                }
            }
    
        private void getHelloWorld( APDU apdu)
            {
            byte[] buffer = apdu.getBuffer();
            short length = (short) helloWorld.length;
            Util.arrayCopyNonAtomic(helloWorld, (short)0, buffer, (short)0, (short) length);
            apdu.setOutgoingAndSend((short)0, length);
            }
    }
    

    我明白,但我不明白为什么程序员使用 &0XFF 行中:

            byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
            byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);
    

    为什么他通常不使用下面的行?

            byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA]);
            byte INS = (byte) (buffer[ISO7816.OFFSET_INS]);
    

    此外,在该行中:

    ew HelloWorldApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
    

    他说的 +1 ?

    1 回复  |  直到 10 年前
        1
  •  5
  •   Maarten Bodewes    10 年前

    虽然我们看不出作者的意图,但这句话:

        byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
    

    100%等于:

        byte CLA = buffer[ISO7816.OFFSET_CLA];
    

    Java经常使用整数作为运算结果,因为Java Card通常不支持 int 值,通常需要将其转换为 byte short 。我只能猜测 & 0xFF 和演员都在场,因为他们过于热心地试图摆脱中间角色 整数 价值观让Java支持无符号字节也可能是错误的尝试。


    这个 register 方法需要实例AID。该AID在全球平台期间给定的用户参数范围内 INSTALL for INSTALL ,但其前面是一个包含AID长度的字节(包括5和15)。所以 + 1 是跳过该长度字节-该字节依次出现在 登记 方法: bArray[bOffset] .