问答详情
源自:4-2 字节流之文件输入流FileInputStream-2

FileInputStream

代码有问题,求解啊,不知道为什么出错http://img.mukewang.com/583c05f00001b22911360725.jpg

提问者:指尖繁华 2016-11-28 18:25

个回答

  • 绿色蝈蝈拜见
    2016-12-14 05:02:18
    已采纳

    凌晨来回答问题。

    首先我们要弄明白,对于一个buf[i], 我们在什么情况下需要在输出之前补0,什么时候不需要补0.答案很清楚,如果它的高四位都是0,那么我们需要补,否则不需要。那么问题来了,怎么判断呢?

    老师的代码是用buf[i] <= 0xf,可是代码结果不正确,会出现错误补0,也就是三个数字一起的情况。如果buf[i] == 0xff, 那么按程序是需要补0,因为作为一个byte,0xff实际上等于-1, 那么自然也小于0xf,因为0xf代表15.这就是出错的问题。

    if判定语句改为((buf&oxff)<=oxf)之后,实际上结果就正确了。因为在Java中整数默认是int,也就是4个字节。因为有buf[i] & 0xff, 注意这里0xff 是4个字节的int类型,那么计算之前会把buf[i]自动进行类型转换,结果也是int类型,所以我们最终的到的结果是24位0加上原先的8位buf[i]。这时候的结果已经绝对是个正数,此时要判断buf[i]高4位是否有1,就看他和0xf的大小就行了。这里要设计一点补码的知识,我们还是以buf[i] == 0xff为例:

    ((buf&oxff)<=oxf)之后的结果是0x000000ff, 显然是大于0xf,所以没有补0.

    实际上,我们也可以这么判断:buf[i] & 0xf0 == 0;这样的结果会保留buf[i]的高四位,其他位都是0,比较容易理解。

  • 指尖繁华
    2016-11-28 18:47:08

    if判定语句改为((buf&oxff)<=oxf);之后输出都是两位,这个不知原因,跪求求大神解惑 !!

  • 指尖繁华
    2016-11-28 18:41:08

    还有,int b=in.read()则没有以上问题;


  • 指尖繁华
    2016-11-28 18:34:25

    或许不是错,但是为啥有三个数字一组的,这个不太懂。