终端发送APDU指令给卡片,都是按照无符号数据发送给卡片,因此,到了卡片解释APDU指令,就应该以无符号解释。
今天在看《Java Card Technology for Smart Cards》的时候,看到这一段:
Short data_length = (short)(apdu_buffer[ISO7816.OFFSET_LC]&0xFF);Java 编程语言中的整数数据是带符号的,即最高位决定它是正数还是负数。但是 Lc 域应被解释为无符号的值,因为具有负长度是无意义的。在上面的代码段中,Lc 字节是按位和常数 0xFF 相与的,以将有符号的字节转化为无符号的值。
后来经过验证测试,发现 &0xff 确实达到目的了,可以去掉byte的符号位。
查了一下资料,下面这个博客写得很详尽,直接引用过来吧:
byte a = (byte)234;
System.out.println(a);
上面的代码,结果是-22,因为java中byte是有符号的,byte范围是-128~127。
如果想输出234,该怎么做呢,首先想到的是将a 赋给大一点的类型,如下:
byte a = (byte)234;
int i = a;
System.out.println(a);
执行后,还是-22,因为int也是有符号的,所以a赋给i时,a的符号位在i中成为了i的符号位。
正确方法应该是:
byte a = (byte)234;
int i = a;
i = a&0xff;
System.out.println(i);
原因是:
0xff是int,占4个字节,a是byte,占1个字节,进行&操作的细节如下:
00000000 00000000 00000000 11101010 (a)
&
00000000 00000000 00000000 11111111 (i)
---------------------------------------------------------------------
= 00000000 00000000 00000000 11101010
结果是int,但是符号位是0,说明是正数,最后就是正整数234.
其实这个方法在C语言中也可以获取有符号char的无符号值,但是C语言中可以直接使用unsigned来转换就可以,比这个方便。
博客讨论了在JAVA Card应用开发中,终端发送的APDU指令是以无符号数据形式,卡片在解释时需按无符号解释。引用了《Java Card Technology for Smart Cards》中的相关内容,并提到了C语言中转换有符号char为无符号值的方法。
APDU中值得注意的符号位&spm=1001.2101.3001.5002&articleId=38588313&d=1&t=3&u=871ec737fd774ea7905e4ecd12db4a33)
1086

被折叠的 条评论
为什么被折叠?



