为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码,请使用:

Integer.toHexString((byteVar & 0x000000FF) | 0xFFFFFF00).substring(6)

byteVar & 0x000000FF的作用是,如果byteVar 是负数,则会清除前面24个零,正的byte整型不受影响。

(...) | 0xFFFFFF00的作用是,如果byteVar 是正数,则置前24位为一,这样toHexString输出一个小于等于15的byte整型的十六进制时,倒数第二位为零且不会被丢弃,这样可以通过substring方法进行截取最后两位即可。

实例说明

import junit.framework.TestCase;

public class Hex extends TestCase {

    public void testPositiveIntToHex() {
//如果正数小于15时,只输入一位,而不是按我们想像的两位标准十六进制输出显示的,后面解决这个问题
System.out.println(Integer.toHexString(2));//2
System.out.println(Integer.toHexString(15));//f
System.out.println(Integer.toHexString(16));//10
System.out.println(Integer.valueOf("F", 16));//16
} /*
* Integer.valueOf()实质上调用的是Integer.parseInt()来完成的,所以
* Integer.parseInt()与Integer.valueOf()功能是一样的,只是返回值不
* 一样而已
*/
public void testNegativeIntToHex() {
//负整数时,前面输入了多余的 FF ,没有去掉前面多余的 FF,按并双字节形式输出
System.out.println(Integer.toHexString(-2).toUpperCase());//FFFFFFFE //实质上0xFF会像转换成0x000000FF后再进行位运算
System.out.println(Integer.toHexString(-2 & 0xFF).toUpperCase());//FE
System.out.println(Integer.toHexString(-2 & 0x000000FF).toUpperCase());//FE //注,FE输出时不会为-2,因为此时不会把FE看成负数,valueOf会把所有数字串看成正的
System.out.println(Integer.valueOf("FE", 16));//254
//如果要输出-2,只能按以下形式输出
System.out.println(Integer.valueOf("-2", 16));//-2 //所以要把 FE 看成负的话,只能在前面加上负号,但是这里输出还不是-2,
//而是先计算Integer.valueOf("FE", 16),再在结果前加上负
System.out.println(Integer.valueOf("-FE", 16));//-254 /* 所以如果要输入某个负数,我们只能先求出该数的绝对值的原码十六进制,再在前面加上负号,
* 例如求表示-128,则先对绝对值128求十六进制 80,再在前面加上负号 -80
*/
System.out.println(Integer.valueOf("-80", 16));//-128 /* 为什么说valueOf把所有数字串看成正的呢?请看下面三行代码,因为最大正数为2147483647,
* 如果再 在7fffffff基础上加上一个一,运行肯定会出错误(这与直接输出0x80000000不一样),
* 那么就可以证明
*/
System.out.println(Integer.valueOf("7fffffff", 16));//2147483647
//此句运行时会报错,因为最大正数为7fffffff,但如 -80000000 却又可以运行,因为没超出整数范围
//System.out.println(Integer.valueOf("80000000", 16));//不能运行,已注掉
System.out.println(Integer.valueOf("-80000000", 16));//-2147483648 /* 注,输出时不是负数,而是正,因为0xFE只有8位,而整数是32位,所以以int形式出现时前
* 面会自动补24个零,第一位是零,所以最后是正数
*/
System.out.println(0xFE);//254
System.out.println(-0xFE);//-254
//但0x80000000已满,无需补,第一位为一,所以最后为负数
System.out.println(0x80000000);//-2147483648
} public void testNegativeIntToBin() {
System.out.println(Integer.toBinaryString(-2));//11111111111111111111111111111110
//实质上0xFF会像转换成0x000000FF后再进行位运算
System.out.println(Integer.toBinaryString(-2 & 0xFF));//11111110
System.out.println(Integer.toBinaryString(-2 & 0x000000FF));//11111110 //与上面十六进制是一样的
System.out.println(Integer.valueOf("1111111111111111111111111111111", 2));//2147483647
//下面语句运行会出错,已注掉
//System.out.println(Integer.valueOf("10000000000000000000000000000000", 2));
System.out.println(Integer.valueOf("-10000000000000000000000000000000", 2));//-2147483648
System.out.println(Integer.valueOf("11111110", 2));//254
System.out.println(Integer.valueOf("-11111110", 2));//-254 /* 注,Java中没有直接使用二进制表示一个数(目前只支持八与十六进制直接表示法),下面其实是一个
* 八进制的数与十进制的数
*/
System.out.println(010);//8
System.out.println(10);//10
} public void testByteToHex() { byte negativeByte = -2;
byte positiveByte = 2; /* toHexString方法类型为int型,所以转Hex前参数会提升成整型后再进行转换,过程如下:
* 10000010(原码)->11111110(补码)->11111111 11111111 11111111 11111110(提升)
* ->FFFFFFFE(转Hex进制输出)
*/
System.out.println(Integer.toHexString(negativeByte).toUpperCase());// FFFFFFFE /* 第一步把-2转成整型:
* 10000010(原码)->11111110(补码)->11111111 11111111 11111111 11111110(转整型)
* 第二步把 0xFF 前补24个零:
* 00000000 00000000 00000000 11111111
* 第三步:把第一二步结果进行与位运算:
* 00000000 00000000 00000000 11111110
* 最后一步:转十六进制结果为 FE
*/
System.out.println(Integer.toHexString(negativeByte & 0xFF).toUpperCase());// FE //另一种转换,可以针对负数与正数的byte都可以以完整的单字节输出
System.out.println(Integer.toHexString((negativeByte & 0x000000ff) | 0xffffff00)
.substring(6).toUpperCase());//FE
System.out.println(Integer.toHexString((positiveByte & 0x000000ff) | 0xffffff00)
.substring(6).toUpperCase());//02
} /**
* 位运算与算术运行中的类型提升机制是一样的
*/
public void testBiteMathematical() {
System.out.println(0x8000000000000000L);//-9223372036854775808
System.out.println((int) 0x8000000000000000L);//0
System.out.println(0x8000000000000010L);//-9223372036854775792
System.out.println(0x80000000);//-2147483648
System.out.println(0x80000010);//-2147483632 //0x00000010提升成长整型,最后结果为长整型0x8000000000000010L
System.out.println(0x00000010 | 0x8000000000000000L);//-9223372036854775792
//0x0010提升成整形,最后结果为整型0x80000010
System.out.println(0x0010 | 0x80000000);//-2147483632
}
}

Java中十六进制转换 Integer.toHexString()的更多相关文章

  1. 【java】Java中十六进制转换 Integer.toHexString()到底做了什么?什么时候会用到它?为什么要用它?byte为什么要&0xff?为什么要和0xff做与运算?

    参考地址:http://www.cnblogs.com/think-in-java/p/5527389.html 参考地址:https://blog.csdn.net/scyatcs/article/ ...

  2. Java中byte转换int时与0xff进行与运算的原因

    http://w.baike.com/LGAdcWgJBBQxRAHUf.html 转帖 java中byte转换int时为何与0xff进行与运算 在剖析该问题前请看如下代码 public static ...

  3. Java中String转换Double类型 Java小数点后留两位

    Java中String转换Double类型 double num1 = 0.0; String qq = "19.987"; num1 = Double.valueOf(qq.to ...

  4. Java中List、integer[]、int[]之间的转化

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...

  5. java中int和Integer比较

    java中int和Integer比较 一,类型区别 我们知道java中由两种数据类型,即基本类型和对象类型,int就是基本数据类型,而Integer是一个class,也习惯把Integer叫做int的 ...

  6. java中String,int,Integer,char、double类型转换

    java中String,int,Integer,char.double类型转换----https://www.cnblogs.com/kangyu222/p/5866025.html

  7. java中byte转换int时为何与0xff进行与运算

    在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) {  String ret = "";  for (int ...

  8. [转]java中byte转换int时为何与0xff进行与运算

    在剖析该问题前请看如下代码public static String bytes2HexString(byte[] b) {  String ret = "";  for (int ...

  9. java-整型数值 用 16进制转换、2进制转换-Integer.toHexString

    负数为什么要用补码表示 可以将符号位和其它位统一处理 减法也可按加法来处理 另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃 正数:原码.反码.补码相同. 负数:反码符号位不变 ...

随机推荐

  1. configure,make,make install作用和关系的一些理解

    一. 整体关系 为求直观,画了一张大致关系图: 我个人的理解是这样的,将编译安装比作做菜的话, △ configure的作用,以厨师的构想以参数的形式作为输入,生成并输出菜谱,菜谱包含两个部分---- ...

  2. VS code自定义用户代码片段snippet

    打开VS code,“文件-首选项-用户代码片段-选择新建全局代码片段文件 “ 属性介绍:prefix   就是你自定义的快捷键 body    就是你自定义的代码片段 description 就是这 ...

  3. VMware要不要装在固态SSD上,虚拟机系统文件要不要放固态SSD上,虚拟机伤不伤固态SSD

    先说结论:VMware建议装在固态上运行快,系统文件最好放在机械硬盘上(有钱除外),虚拟机会伤固态. 今天在学淘淘商城中的搜索项目,克隆了一个虚拟机,这个虚拟机开机贼慢,令人无法忍受,我觉得我再也受不 ...

  4. jmeter入门简介(一)

    简介 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试CS/BS的软件.它可以用来测试静态和动态资源的性能,可用于模拟大量负载来测试一台服务器,网络或者对象的健壮性或者分析 ...

  5. java百度云推送

    实体类: import java.io.Serializable; import javax.persistence.Entity; /** * * @Version : 1.0 * @Author ...

  6. 操作CSS样式公共方法库

    项目中常用的一些方法,我们都封装到公共方法库 let utils = (function () { //=>获取元素的样式 let getCss = function (curEle, attr ...

  7. 牛客练习赛44C

    链接:https://ac.nowcoder.com/acm/contest/634/C来源:牛客网 题目描述 给出一个区间[L,R],求出[L,R]中孪生质数有多少对. 由于这是一个区间筛质数的模板 ...

  8. 大数据学习笔记4 - Hadoop的优化与发展(Hadoop 2.0)

    前面介绍了Hadoop核心组件HDFS和MapReduce,Hadoop发展之初在架构设计和应用性能方面仍然存在不足,Hadoop的优化与发展一方面体现在两个核心组件的架构设计改进,一方面体现在Had ...

  9. 缓存cache介绍

    1.  为何要用缓存.缓存的目的是为了什么?(https://my.oschina.net/u/3378039/blog/2986697) 一个程序的瓶颈在于数据库,内存的速度远远大于硬盘的速度,当我 ...

  10. vue项目两级全选(多级原理也一样),感觉有点意思,随手一记

    需求: 首先说一下思路:我首先把数据列表两级遍历了一下,增加了一个checked属性来控制勾选和不勾线 this.productList.forEach((item)=>{ this.$set( ...