JAVA card 应用开发(八)APDU中值得注意的符号位

博客讨论了在JAVA Card应用开发中,终端发送的APDU指令是以无符号数据形式,卡片在解释时需按无符号解释。引用了《Java Card Technology for Smart Cards》中的相关内容,并提到了C语言中转换有符号char为无符号值的方法。


终端发送APDU指令给卡片,都是按照无符号数据发送给卡片,因此,到了卡片解释APDU指令,就应该以无符号解释。


今天在看《Java Card Technology for Smart Cards》的时候,看到这一段:

Short data_length = (short)(apdu_buffer[ISO7816.OFFSET_LC]&0xFF); 
Java 编程语言中的整数数据是带符号的,即最高位决定它是正数还是负数。但是 Lc 域应被解释为无符号的值,因为具有负长度是无意义的。在上面的代码段中,Lc 字节是按位和常数 0xFF 相与的,以将有符号的字节转化为无符号的值。 


总觉得是不是这里写错了,因为站在C语言的角度,觉得对一个变量 &0xff ,不会做任何改变,也觉得这样做不可能从有符号转为无符号。
后来经过验证测试,发现 &0xff 确实达到目的了,可以去掉byte的符号位。

查了一下资料,下面这个博客写得很详尽,直接引用过来吧:


出处:http://blog.csdn.net/todd911/article/details/9378319


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来转换就可以,比这个方便。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值