java Integer.toHexString基础理解

weng4570 发布于 2013/08/21 11:18
阅读 10K+
收藏 0

 下面代码的红色一行怎么理解;特别是(tempbytes[i] & 0xFF),是什么意思;其整行代码有是指什么意思;蓝色区域又是怎么理解;谢谢大家

 public static void printHexString( byte[] tempbytes) throws IOException { 

        FileWriter fw=new FileWriter("E:/tt.txt",true);
        
        for (int i = 0; i < tempbytes.length; i++) { 
            String hex = Integer.toHexString(tempbytes[i] & 0xFF); 
            if (hex.length() == 1) { 
                hex = '0' + hex; 
            } 
            System.out.print(hex.toUpperCase() ); 
            fw.write(hex.toUpperCase());
            
        } 
        fw.flush();
        fw.close();
//                String hex;
        pcmwrite();
    }
加载中
0
bigtiger02
bigtiger02

红色(tempbytes[i] & 0xFF)的意思是去掉tmpbytes[i]的符号,
比如tmpbytes[i]=-1,转出来就是FF,
若与0xFF按位与Integer.toHexString将输出FFFFFFFF。

String hex = Integer.toHexString(tempbytes[i] & 0xFF); 得到十六进制字符串。

蓝色部分是为了统一格式,
比如当tmpbytes[i]=1时十六进制字符串为1,加个0就转成了01,
而tmpbytes[i]=-1时候十六进制字符串为FF

bigtiger02
bigtiger02
回复 @weng4570 : 计算机中使用补码存放负数,现按照8位数码来解释-1: -1原码:1 0000 0001 -1补码:1 1111 1111(计算机中实际存储的是这个) 故-1的十六进制为FF。
weng4570
weng4570
tmpbytes[i]=-1,转出来就是FF,??为什么转出来就是FF呀
0
bigtiger02
bigtiger02

计算机中使用补码存放负数,现按照8位数码来解释-1:
-1原码:1 0000 0001 -1补码:1 1111 1111(计算机中实际存储的是这个)
故-1的十六进制为FF。

这个工作过程大致是个这样子的:
java中一个byte为8位,而int为32位,故需要用tempbytes[i] & 0xFF来掩掉其他多余24位,现以1和-1为例:
1计算机中实际存储的是:
         0000 0000 0000 00000 0000 0000 0000 00001
因为一个字节数值范围在00-FF之间,故只需要最后8位即可,将其余24位掩掉,即按位与0XFF:0000 0000 0000 00000 0000 0000 1111 11111
得到的还是1,故1的十六进制转出为01

-1计算机中实际存储的是(补码):
      1 1111 1111 1111 1111 1111 1111 1111 1111,
若直接转十六进制则为FFFFFFFF,而一个字节数值范围在00-FF之间,所以我们只需要后8位即可,将前24个1掩掉(即按位与0XFF)得到:
      1 0000 0000 0000 0000 0000 0000 1111 1111
      即转出的十六进制为FF

s
summer2333
1和0XFF按位与写错了
zhoumengkang
zhoumengkang
你好,看你的解释里面,符号位单独成一位,但是我看Integer.toBinaryString(-1)只有32个1并不是33个
weng4570
weng4570
你理解的是对的;其实文本数据里面的数据之间没有空格;
weng4570
weng4570
回复 @bigtiger02 : 是的;你的理解是对的
bigtiger02
bigtiger02
回复 @weng4570 : 不是很理解你问题的描述,是不是这个样子的:有一个文本文件里面有这样的一组数据11000 11000 00111 11000 00111每个数据用空格相隔,现需要对这些数据进行索引若为11000则记为10,若为00011则记为01对吗?
下一页
返回顶部
顶部