Module  java.smartcardio
软件包  javax.smartcardio

Class CommandAPDU

  • All Implemented Interfaces:
    Serializable


    public final class CommandAPDU
    extends Object
    implements Serializable
    遵循ISO / IEC 7816-4中定义的结构的命令APDU。 它由一个四字节标题和一个可变长度的条件体组成。 该类不尝试验证APDU对语义有效的命令进行编码。

    请注意,当constructors中指定了响应APDU的预期长度时,必须指定实际长度(Ne),而不是其编码形式(Le)。 同样, getNe()返回实际值Ne。 换句话说,值为0表示“无响应APDU中的数据”而不是“最大长度”。

    这个类支持Ne和Nc的长度编码的短和扩展形式。 但是请注意,并非所有终端和智能卡都能接受使用扩展形式的APDU。

    对于标题字节CLA,INS,P1和P2,Java类型int用于表示8位无符号值。 在构造函数中,只有应用程序指定的int值的8位最低位是很重要的。 访问器方法总是将该字节作为0到255之间的无符号值返回。

    这个类的实例是不可变的。 在通过字节数组传入或传出数据的地方,执行防御性克隆。

    从以下版本开始:
    1.6
    另请参见:
    ResponseAPDUCardChannel.transmitSerialized Form
    • 构造方法摘要

      构造方法  
      Constructor 描述
      CommandAPDU​(byte[] apdu)
      从包含完整的APDU内容(标题和正文)的字节数组构造一个CommandAPDU。
      CommandAPDU​(byte[] apdu, int apduOffset, int apduLength)
      从包含完整的APDU内容(标题和正文)的字节数组构造一个CommandAPDU。
      CommandAPDU​(int cla, int ins, int p1, int p2)
      从四个头字节构造一个CommandAPDU。
      CommandAPDU​(int cla, int ins, int p1, int p2, byte[] data)
      从四个头字节和命令数据构造一个CommandAPDU。
      CommandAPDU​(int cla, int ins, int p1, int p2, byte[] data, int ne)
      从四个头字节,命令数据和预期的响应数据长度构造一个CommandAPDU。
      CommandAPDU​(int cla, int ins, int p1, int p2, byte[] data, int dataOffset, int dataLength)
      从四个头字节和命令数据构造一个CommandAPDU。
      CommandAPDU​(int cla, int ins, int p1, int p2, byte[] data, int dataOffset, int dataLength, int ne)
      从四个头字节,命令数据和预期的响应数据长度构造一个CommandAPDU。
      CommandAPDU​(int cla, int ins, int p1, int p2, int ne)
      从四个头字节和预期的响应数据长度构造一个CommandAPDU。
      CommandAPDU​(ByteBuffer apdu)
      从包含完整的APDU内容(标题和正文)的ByteBuffer创建一个CommandAPDU。
    • 方法摘要

      所有方法  接口方法  具体的方法 
      Modifier and Type 方法 描述
      boolean equals​(Object obj)
      将指定的对象与此命令APDU相比较。
      byte[] getBytes​()
      返回此APDU中的字节的副本。
      int getCLA​()
      返回类字节CLA的值。
      byte[] getData​()
      返回命令体中数据字节的副本。
      int getINS​()
      返回指令字节INS的值。
      int getNc​()
      返回命令体(Nc)中的数据字节数,如果该APDU没有正文,则返回0。
      int getNe​()
      返回响应APDU(Ne)中的最大预期数据字节数。
      int getP1​()
      返回参数字节P1的值。
      int getP2​()
      返回参数字节P2的值。
      int hashCode​()
      返回此命令APDU的哈希码值。
      String toString​()
      返回此命令APDU的字符串表示形式。
    • 构造方法详细信息

      • CommandAPDU

        public CommandAPDU​(byte[] apdu,
                           int apduOffset,
                           int apduLength)
        从包含完整的APDU内容(标题和正文)的字节数组构造一个CommandAPDU。 APDU从字节数组中的索引apduOffset开始, apduOffsetapduLength个字节。

        请注意,复制apdu字节以防止后续修改。

        参数
        apdu - 完整的命令APDU
        apduOffset - apduOffset数据开始的字节数组中的偏移量
        apduLength - APDU的长度
        异常
        NullPointerException - 如果 NullPointerException为空
        IllegalArgumentException - 如果apduOffset或apduLength为负值,或者如果apduOffset + apduLength大于apdu.length,或者指定的字节不是有效的APDU
      • CommandAPDU

        public CommandAPDU​(ByteBuffer apdu)
        从包含完整的APDU内容(标题和正文)的ByteBuffer创建一个CommandAPDU。 缓冲区的position必须设置为APDU的开始,其limit到APDU的结尾。 返回时,缓冲区的position等于其限制; 其限制保持不变。

        请注意,ByteBuffer中的数据被复制以防止后续修改。

        参数
        apdu - 包含完整APDU的ByteBuffer
        异常
        NullPointerException - 如果 NullPointerException为空
        IllegalArgumentException - 如果 IllegalArgumentException不包含有效的命令APDU
      • CommandAPDU

        public CommandAPDU​(int cla,
                           int ins,
                           int p1,
                           int p2)
        从四个头字节构造一个CommandAPDU。 这是ISO 7816中的情况1,没有命令体。
        参数
        cla - 类字节CLA
        ins - 指令字节INS
        p1 - 参数字节P1
        p2 - 参数字节P2
      • CommandAPDU

        public CommandAPDU​(int cla,
                           int ins,
                           int p1,
                           int p2,
                           int ne)
        从四个头字节和预期的响应数据长度构造一个CommandAPDU。 这是ISO 7816中的情况2,指定了Ne的空指令数据字段。 如果Ne为0,则APDU被编码为ISO 7816情况1。
        参数
        cla - 类字节CLA
        ins - 指令字节INS
        p1 - 参数字节P1
        p2 - 参数字节P2
        ne - 响应APDU中的最大预期数据字节数
        异常
        IllegalArgumentException - 如果ne为负数或大于65536
      • CommandAPDU

        public CommandAPDU​(int cla,
                           int ins,
                           int p1,
                           int p2,
                           byte[] data)
        从四个头字节和命令数据构造一个CommandAPDU。 这是ISO 7816中的情况3,存在命令数据,Ne不存在。 值Nc取为data.length。 如果data为空或其长度为0,则APDU被编码为ISO 7816案例1。

        请注意,数据字节被复制以防止后续修改。

        参数
        cla - 类字节CLA
        ins - 指令字节INS
        p1 - 参数字节P1
        p2 - 参数字节P2
        data - 包含命令体数据字节的字节数组
        异常
        IllegalArgumentException - 如果data.length大于65535
      • CommandAPDU

        public CommandAPDU​(int cla,
                           int ins,
                           int p1,
                           int p2,
                           byte[] data,
                           int dataOffset,
                           int dataLength)
        从四个头字节和命令数据构造一个CommandAPDU。 这是ISO 7816中的情况3,存在命令数据,Ne不存在。 值Nc取为dataLength。 如果dataLength为0,则APDU被编码为ISO 7816情况1。

        请注意,数据字节被复制以防止后续修改。

        参数
        cla - 类字节CLA
        ins - 指令字节INS
        p1 - 参数字节P1
        p2 - 参数字节P2
        data - 包含命令体数据字节的字节数组
        dataOffset - 命令体的数据字节开始的字节数组中的偏移量
        dataLength - 命令体中的数据字节数
        异常
        NullPointerException - 如果数据为空,dataLength不为0
        IllegalArgumentException - 如果dataOffset或dataLength为负数或dataOffset + dataLength大于data.length或dataLength大于65535
      • CommandAPDU

        public CommandAPDU​(int cla,
                           int ins,
                           int p1,
                           int p2,
                           byte[] data,
                           int ne)
        从四个头字节,命令数据和预期的响应数据长度构造一个CommandAPDU。 这是ISO 7816中的情况4,命令数据和Ne存在。 如果data为非空值,则值Nc取为data.length,否则为0。 如果Ne或Nc为零,则APDU被编码为根据ISO 7816的情况1,2或3。

        请注意,数据字节被复制以防止后续修改。

        参数
        cla - 类字节CLA
        ins - 指令字节INS
        p1 - 参数字节P1
        p2 - 参数字节P2
        data - 包含命令体数据字节的字节数组
        ne - 响应APDU中预期数据字节的最大数量
        异常
        IllegalArgumentException - 如果data.length大于65535,或者如果ne为负数或大于65536
      • CommandAPDU

        public CommandAPDU​(int cla,
                           int ins,
                           int p1,
                           int p2,
                           byte[] data,
                           int dataOffset,
                           int dataLength,
                           int ne)
        从四个头字节,命令数据和预期的响应数据长度构造一个CommandAPDU。 这是ISO 7816中的情况4,命令数据和Le存在。 值Nc取为dataLength 如果Ne或Nc为零,则APDU被编码为根据ISO 7816的情况1,2或3。

        请注意,数据字节被复制以防止后续修改。

        参数
        cla - 类字节CLA
        ins - 指令字节INS
        p1 - 参数字节P1
        p2 - 参数字节P2
        data - 包含命令体数据字节的字节数组
        dataOffset - 指令体数据字节开始的字节数组中的偏移量
        dataLength - 命令体中的数据字节数
        ne - 响应APDU中预期数据字节的最大数目
        异常
        NullPointerException - 如果数据为空,dataLength不为0
        IllegalArgumentException - 如果dataOffset或dataLength为负数或dataOffset + dataLength大于data.length,或者如果ne为负数或大于65536,或者dataLength大于65535
    • 方法详细信息

      • getCLA

        public int getCLA​()
        返回类字节CLA的值。
        结果
        类字节CLA的值。
      • getINS

        public int getINS​()
        返回指令字节INS的值。
        结果
        指令字节INS的值。
      • getP1

        public int getP1​()
        返回参数字节P1的值。
        结果
        参数字节P1的值。
      • getP2

        public int getP2​()
        返回参数字节P2的值。
        结果
        参数字节P2的值。
      • getNc

        public int getNc​()
        返回命令体(Nc)中的数据字节数,如果该APDU没有正文,则返回0。 此通话相当于getData().length
        结果
        命令体中的数据字节数,如果此APDU没有正文,则为0。
      • getData

        public byte[] getData​()
        返回命令体中数据字节的副本。 如果这个APDU没有body,这个方法返回一个长度为零的字节数组。
        结果
        命令体中的数据字节的副本或空字节数组,如果该APDU没有正文。
      • getNe

        public int getNe​()
        返回响应APDU(Ne)中的最大预期数据字节数。
        结果
        响应APDU中预期数据字节的最大数量。
      • getBytes

        public byte[] getBytes​()
        返回此APDU中的字节的副本。
        结果
        该APDU中的字节的副本。
      • toString

        public String toString​()
        返回此命令APDU的字符串表示形式。
        重写:
        toStringObject
        结果
        此命令APDU的字符串表示形式。
      • equals

        public boolean equals​(Object obj)
        将指定的对象与此命令APDU相比较。 如果给定对象也是一个CommandAPDU,并且其字节与此CommandAPDU中的字节相同,则返回true。
        重写:
        equalsObject
        参数
        obj - 要与此命令APDU相等的对象
        结果
        如果指定的对象等于此命令APDU,则为true
        另请参见:
        Object.hashCode()HashMap