java 字节转为16进制字符的个人理解
2017-07-21 12:16
295 查看
public static void printHexString(byte[] b) { for (int i = 0; i < b.length; i++) { int temp = b[i] & 0xFF; String hex = Integer.toHexString(temp); if (hex.length() == 1) { hex = '0' + hex; } System.out.print(hex.toUpperCase()); } }
以上代码将字节转为十六进制字符,以下是个人理解:
0.上面思路是:byte转int再算出16进制字符;
1.一个字节需要二进制的8个位,一个整型需要二进制的32个位;
2. 十六进制的1位相当于二进制的4个位;
3. java的二进制是补码(第一位是符号,相对于原码,后面的位全部取反后+1);
4. 在二进制里,对于正数,原码,反码,补码表示都一样,但是,对于负数,原码,反码,补码表示各不同;
5. 不论是byte还是int,我们debug时看到的数值都是我们最常用的十进制数值;
上面是理论基础,下面是理解重点:
6. 对于负数,当byte直接转为int时,在二进制里,8位扩为32位,会进行补位,补位的结果是:数值没变,但是转换成十六进制字符变了(2个十六进制位变成了8个)。
举例(注意第三点):十进制的-1,二进制8个位表示:11111111; 补位后,二进制32个位表示:11111111111111111111111111111111,数值没变,都是十进制的-1,但是换成16进制的位表示,就有:0xFF变为0xFFFFFFFF,出现了差错;
7.负数进行byte & 0xFF 运算后的整型, 结合第一点,假设byte的十进制数值是-1,在二进制里运算是11111111111111111111111111111111
& 00000000000000000000000011111111 ,运算方法是单个位进行与运算,得到结果是00000000000000000000000011111111,即把byte的高24位清零,留下低8位,结果是:byte的十进制数值被改变,但是转换成十六进制有0xFF------>0xFF,消除了差错;
8.十六进制字符长度为1时补零:byte转为16进制应该有16进制的两个位,当16进制数值<=9时进行补位
如以上理解有误,欢迎指正!
相关文章推荐
- 理解Java中字符流与字节流
- 流 java 流 字符流 字节 流的学习与理解
- 字符串逆序,字符串转为字符数组 、字符串转字节数组,字节数组转字符串、java中String、StringBuffer、StringBuilder
- java IO,字符字节终极理解
- IO_缓冲流_转换流_字节转为字符_乱码分析_编码与解码JAVA152-154
- Java IO深入理解字节和字符数组(ByteArrayInputStream、ByteArrayOutputStream、CharArrayReader、CharArrayWriter)
- 【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集
- IO_缓冲流_转换流_字节转为字符_乱码分析_编码与解码JAVA152-154
- 初学java之12 泛型编程的个人理解总结
- 【JAVA IO】_字节-字符转换流笔记
- java中的equals和双等号个人理解和疑问
- java中的字符,字节和编码
- java二进制,字节数组,字符,十六进制,BCD编码转换
- Java复习之IO字节字符转换流
- java中复制文本文件的方式我总结为14种(按字符读取4中,按字节读取8种!??)
- Java 将字节数组转化为16进制的多种方案
- java中hashmap的个人理解和分析(1.8版本)
- java对字符处理(二)-- 截取中英文字节
- Java流编程实例之一--Java中的字节与字符
- java中字符与字节的编码关系