智能卡APDU响应的数据字段是否包含自身长度标识?
关于APDU响应数据长度标识的说明
我来帮你理清这个问题——其实APDU响应里的长度指示分两种典型场景,和你提到的61 1b案例直接相关:
1. 卡片先返回"待读取"状态码的情况
当你发送00 A4 00 00(不带Le字段)这类指令时,卡片返回61 1b,这里的SW1=61是标准状态码,意思是还有数据未返回,而SW2=1b(十六进制转十进制是27)就是明确告诉你剩余待读取的数据长度。
这时候你需要发送GET RESPONSE指令来获取完整数据,比如:
00 C0 00 00 1b
这里最后一个字节1b就是从之前的SW2里拿到的长度,执行后卡片会返回27字节的实际数据,再加上成功状态码90 00。
2. 卡片直接返回完整数据的情况
如果你的APDU指令里指定了Le字段(比如00 A4 00 00 00,Le=00表示请求最大长度),卡片会直接返回完整的响应数据,再加上状态码90 00。这种情况下,数据字段内部不会包含单独的长度标识字节——数据的实际长度就是返回的字节数(排除最后的SW1和SW2),或者由你指定的Le来限制(如果卡片返回的数据长度小于等于Le的话)。
举个例子,假设你发送带Le的SELECT指令后,卡片返回:
6F 19 84 08 A0 00 00 00 03 00 00 00 A5 0D 9F 6E 06 12 34 56 78 90 00
这里前面的6F 19 ... 78是实际数据(共25字节),90 00是成功状态码,数据里没有额外的长度字节,你直接通过计数就能知道数据长度。
总结一下:
- 数据字段本身不会自带长度标识
- 长度信息要么通过
61 XX状态码里的SW2传递(需要后续GET RESPONSE) - 要么由你指定的Le和实际返回的字节数来确定(直接返回完整数据的场景)
内容的提问来源于stack exchange,提问作者Berbus
相关产品推荐
相关产品推荐

