关闭

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

5496人阅读 评论(0) 收藏 举报
分类:

为了显示一个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
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

怎么用Integer.toHexString(int)得到byte类型的十六进制字符串形式?

在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) {   String ret = "";   for (int i = ...
  • scyatcs
  • scyatcs
  • 2013-11-22 17:03
  • 11280

bufToHexStr的C++实现------将buffer转为对应的16进制形式(与坑同在)

bufToHexStr还是很常见的, 也非常常用, 写个代码玩玩(别乱拷贝如下代码): #include #include using namespace std; string bufToHe...
  • stpeace
  • stpeace
  • 2016-06-26 23:24
  • 1512

JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)

今天看JS书籍,看到一个toString()方法,在JS中,定义的所有对象都具有toString()方法。 Number类型的toString()方法比较特殊,有默认模式和基模式两种。  ...
  • sarck3
  • sarck3
  • 2013-12-24 13:45
  • 2089

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

为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码,请使用: Integer.toHexString((byteVar & 0x000000FF) | 0xFFFFFF00).subs...
  • xiangnideshen
  • xiangnideshen
  • 2011-11-23 10:27
  • 707

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

Java中十六进制转换 Integer.toHexString()关键字: integer.tohexstring为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码,请使用:Intege...
  • liubing_2010
  • liubing_2010
  • 2011-06-10 17:28
  • 746

Integer.toHexString(int)得到byte类型的十六进制字符串形式

剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) { String ret = ""; for (int i = 0...
  • han_huayi
  • han_huayi
  • 2015-06-11 09:06
  • 787

怎么用Integer.toHexString(int)得到byte类型的十六进制字符串形式?

在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) {   String ret = "";   for (int i = 0; ...
  • u010648159
  • u010648159
  • 2016-05-12 15:04
  • 1615

Integer源码(toHexString).md

以下代码基于jdk1.8,jdk1.7源码没这么多层封装,所以更易于理解,但核心实现都是formatUnsignedInt()先来看一组方法: toHexString(int):String t...
  • twx843571091
  • twx843571091
  • 2017-07-22 21:24
  • 92

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

为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码,请使用: Integer.toHexString((byteVar & 0x000000FF) | 0xFFFFFF00).subs...
  • java_freshman01
  • java_freshman01
  • 2012-02-14 10:47
  • 3272

java中Integer包装类的详细讲解(java二进制操作,所有进制转换)

  • 2014-05-07 13:40
  • 7KB
  • 下载
    个人资料
    • 访问:544578次
    • 积分:6300
    • 等级:
    • 排名:第4491名
    • 原创:160篇
    • 转载:36篇
    • 译文:0篇
    • 评论:317条
    博客专栏
    最新评论