Class CommandAPDU

java.lang.Object
javax.smartcardio.CommandAPDU
所有已实现的接口:
Serializable

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

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

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

对于头部字节CLA、INS、P1和P2,Java类型int用于表示8位无符号值。在构造函数中,应用程序指定的int值的最低8位是有效的。访问器方法始终将字节作为0到255之间的无符号值返回。

该类的实例是不可变的。通过字节数组传入或传出数据时,会执行防御性克隆。

自:
1.6
参见:
  • Constructor Summary

    Constructors
    Constructor
    Description
    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。
    从包含完整APDU内容(头部和体)的ByteBuffer创建CommandAPDU。
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    equals(Object obj)
    将指定的对象与此命令APDU进行比较以确定它们是否相等。
    byte[]
    返回此APDU中字节的副本。
    int
    getCLA()
    返回类字节CLA的值。
    byte[]
    返回命令体中数据字节的副本。
    int
    getINS()
    返回指令字节INS的值。
    int
    getNc()
    返回命令体中数据字节的数量(Nc),如果此APDU没有体,则返回0。
    int
    getNe()
    返回响应APDU中预期数据字节的最大数量(Ne)。
    int
    getP1()
    返回参数字节P1的值。
    int
    getP2()
    返回参数字节P2的值。
    int
    返回此命令APDU的哈希码值。
    返回此命令APDU的字符串表示形式。

    Methods declared in class java.lang.Object

    clone, finalize, getClass, notify, notifyAll, wait, wait, wait
  • Constructor Details

    • CommandAPDU

      public CommandAPDU(byte[] apdu)
      从包含完整APDU内容(头部和体)的字节数组构造CommandAPDU。

      请注意,为了防止后续修改,APDU字节会被复制。

      参数:
      apdu - 完整的命令APDU
      抛出:
      NullPointerException - 如果apdu为null
      IllegalArgumentException - 如果apdu不包含有效的命令APDU
    • CommandAPDU

      public CommandAPDU(byte[] apdu, int apduOffset, int apduLength)
      从包含完整APDU内容(头部和体)的字节数组构造CommandAPDU。APDU从字节数组中的索引apduOffset开始,长度为apduLength字节。

      请注意,为了防止后续修改,APDU字节会被复制。

      参数:
      apdu - 包含完整APDU的字节数组
      apduOffset - apdu数据开始的字节数组中的偏移量
      apduLength - APDU的长度
      抛出:
      NullPointerException - 如果apdu为null
      IllegalArgumentException - 如果apduOffset或apduLength为负数,或者如果apduOffset + apduLength大于apdu.length,或者指定的字节不是有效的APDU
    • CommandAPDU

      public CommandAPDU(ByteBuffer apdu)
      从包含完整APDU内容(头部和体)的ByteBuffer创建CommandAPDU。缓冲区的position必须设置为APDU的起始位置,其limit必须设置为APDU的结束位置。返回时,缓冲区的position等于其limit;其limit保持不变。

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

      参数:
      apdu - 包含完整APDU的ByteBuffer
      抛出:
      NullPointerException - 如果apdu为null
      IllegalArgumentException - 如果apdu不包含有效的命令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中预期数据字节的最大数量Ne
      抛出:
      IllegalArgumentException - 如果ne为负数或大于65536
    • CommandAPDU

      public CommandAPDU(int cla, int ins, int p1, int p2, byte[] data)
      从四个头部字节和命令数据构造CommandAPDU。这是ISO 7816中的情况3,存在命令数据且Ne不存在。如果data为null或其长度为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不存在。如果dataLength为0,则APDU被编码为ISO 7816情况1。

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

      参数:
      cla - 类字节CLA
      ins - 指令字节INS
      p1 - 参数字节P1
      p2 - 参数字节P2
      data - 包含命令体数据字节的字节数组
      dataOffset - 数据字节的命令体中开始的字节数组中的偏移量
      dataLength - 命令体中数据字节的数量
      抛出:
      NullPointerException - 如果data为null且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为非null,则值Nc取为data.length,否则为0。如果Ne或Nc为零,则根据ISO 7816的情况1、2或3对APDU进行编码。

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

      参数:
      cla - 类字节CLA
      ins - 指令字节INS
      p1 - 参数字节P1
      p2 - 参数字节P2
      data - 包含命令体数据字节的字节数组
      ne - 响应APDU中预期数据字节的最大数量Ne
      抛出:
      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为零,则根据ISO 7816将APDU编码为情况1、2或3。

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

      参数:
      cla - 类字节CLA
      ins - 指令字节INS
      p1 - 参数字节P1
      p2 - 参数字节P2
      data - 包含命令主体数据字节的字节数组
      dataOffset - 命令主体数据字节开始的字节数组中的偏移量
      dataLength - 命令主体中数据字节的数量
      ne - 响应APDU中预期数据字节的最大数量
      抛出:
      NullPointerException - 如果数据为null且dataLength不为0
      IllegalArgumentException - 如果dataOffset或dataLength为负数,或者如果dataOffset + dataLength大于data.length,或者如果ne为负数或大于65536,或者如果dataLength大于65535
  • Method Details

    • 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没有主体,则此方法返回长度为零的字节数组。
      返回:
      命令主体中数据字节的副本或如果此APDU没有主体则为空字节数组。
    • getNe

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

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

      public String toString()
      返回此命令APDU的字符串表示形式。
      覆盖:
      toString 在类 Object
      返回:
      此命令APDU的字符串表示形式。
    • equals

      public boolean equals(Object obj)
      将指定对象与此命令APDU进行比较以检查是否相等。如果给定对象也是CommandAPDU并且其字节与此CommandAPDU中的字节相同,则返回true。
      覆盖:
      equals 在类 Object
      参数:
      obj - 用于与此命令APDU比较是否相等的对象
      返回:
      如果指定对象等于此命令APDU,则返回true
      参见:
    • hashCode

      public int hashCode()
      返回此命令APDU的哈希码值。
      覆盖:
      hashCode 在类 Object
      返回:
      此命令APDU的哈希码值。
      参见: