Java中十六进制转换 Integer.toHexString()

为了显示一个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  
    }  
}  
 
 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java学习

重要通知!小编出新的Java练习题已经公布答案了!!!

一、选择题和问答题 1、在一个java原文件中,import, class, package语句的顺序是(D)。 A. import classpackage ...

4168
来自专栏ccylovehs

JavaScript基础回顾一(类型、值和变量)

没有答对也不要灰心,本文会巩固你的基础知识,后续会有系列的基础回顾知识,以飨诸君!

772
来自专栏BestSDK

封装、私有,一文掌握Python关键代码

首先,什么是 Python?根据 Python 创建者 Guido van Rossum 所言,Python 是一种高级编程语言,其设计的核心理念是代码的易读性...

3853
来自专栏微信公众号:Java团长

Java习惯用法总结

在Java编程中,有些知识 并不能仅通过语言规范或者标准API文档就能学到的。在本文中,我会尽量收集一些最常用的习惯用法,特别是很难猜到的用法。

961
来自专栏和蔼的张星的图像处理专栏

655. 大整数加法

以字符串的形式给出两个非负整数 num1 和 num2,返回 num1 和 num2 的和。 注意事项: num1 和 num2 的长度都小于5100。 ...

1041
来自专栏deed博客

java的反射。。。

1733
来自专栏Android群英传

Swift vs. Kotlin 漫谈系列之类与继承

2074
来自专栏深度学习之tensorflow实战篇

字节码:ASCII编码:单字节编码,ANSI编码:多字节编码,UNICODE编码:宽字节编码

字符是人们常用的一些记号,比如”1”, “汉”, “お”,”℃”等等,包括各种语系的语言和一些符号都可以被称为字符。 字节是计算机存储数据的存储单元,是一个8位...

3096
来自专栏Python

python2/3中 将base64数据写成图片,并将图片数据转为16进制数据的方法、bytes/string的区别

python 3中最重要的新特性可能就是将文本(text)和二进制数据做了更清晰的区分。文本总是用unicode进行编码,以str类型表示;而二进制数据以byt...

4392
来自专栏大数据钻研

44 个 JavaScript 变态题解析

当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了…. 不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变态题到底变态不变态吧! 第1题...

3496

扫码关注云+社区

领取腾讯云代金券