`

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

    博客分类:
  • Java
阅读更多

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

 

分享到:
评论
3 楼 u014771876 2015-09-01  
   
2 楼 u014771876 2015-09-01  
   
1 楼 u014771876 2015-09-01  
  

相关推荐

    Java进制转换方法整理

    一、利用Integer将十进制的数进行进制转换 方法 十进制转换其他进制 使用方法 返回值 10进制转2进制 Integer.toBinaryString(n) 一个二进制字符串 10进制转8进制 Integer.toOctalString(n) 一个八进制字符...

    通过java编程得到.jpg图片16进制的数据

    通过java中IO流实现对.jpg与最后16进制的读取与写入,中间在利用Integer.toHexString()函数将字节数据转出16进制的数以便于观察。具体实现可将附件.java文件

    PHP中的integer类型使用分析

    integer 可以已10进制,8进制,16进制表示。 用八进制表示的时候,数字需要已0(零)开头; 用十六进制表示的时候,数字需要已0x(零x)或者0X(零大写X)开头; integer 溢出: integer溢出的时候,会自动的转化为float...

    ibmjdk-integer-to-string-nul-chars:一个最小的复制品,显示IBM JDK将前导nul字符'\ u0000'放入Integer.toHexString(int)的结果中

    在IBM JDK 8中, java.lang.Integer.toHexString(int)方法有时会返回以nul字符'\u0000'开头的字符串。 目前的项目在那里证明了这个问题。 重现步骤 获得IBM JDK8。我的情况是,确切的版本是 java -version java ...

    java MD5 jar包

    MD5jar包 源码如下 public class MD5 { ... builder.append( Integer.toHexString( (b >> 4) & 0xf ) ); builder.append( Integer.toHexString( b & 0xf ) ); } return builder.toString(); } }

    MD5加密与byte数组与16进制相互转换

    包含MD5加密,同时拥有多种方式进行byte或者byte[]与16进制相互转换 三种方式: 方式一:Integer.toHexString(int) 对应的是: Integer.parseInt(String, int)或者Integer.valueOf(String, int) 方式二:位运算(& ...

    hexify:十六进制转换工具

    六角化 十六进制转换工具。 例子: hexify . toHexString ( [ 0x00 , 0xFF , 0x6C , 0x0A ] ) === '00ff6c0a' hexify . toByteArray ( '00ff6c0a' ) === [ 0x00 , 0xFF , 0x6C , 0x0A ]

    BitmapDemo

    String ahx=Integer.toHexString(a); String bhx=Integer.toHexString(b); // Log.d("mainAct", ahx+"//"+bhx); String ared=ahx.substring(0, 2); String bred=bhx.substring(0, 2); String agreen=ahx....

    java计算器

    数制的转换是利用Integer类的方法实现的,其中将十进制转化为二进制是通过toBinaryString(n)方法实现的,十进制转换八进制是通过toOctalString(n)方法实现的,十进制转换十六进制toHexString(n)方法实现的。

    java md5 jar

    String s = Integer.toHexString(bytes[i] & 0xff); if(s.length()==1){ buf.append("0"); } buf.append(s); } } catch(Exception ex) { } return buf.toString(); }

    MD5加密测试_java类

    使用MD5对字符进行加密处理。 public MD5Test(String inStr1) { this.inStr = inStr1; try { this.mad5 = ... hexValue.append(Integer.toHexString(val)); } return hexValue.toString(); }

    DES对称分组密码系统的Java实现

    import java.security.spec.*; import javax.crypto.*;... + java.lang.Integer.toHexString(data[i]&0xFF); else str = str + java.lang.Integer.toHexString(data[i]&0xFF); } return str.toUpperCase(); } } }

    C#-DES_SAME_JAVA-DES.zip

    String hexString = Integer.toHexString(0x00ff & b); hexRetSB.append(hexString.length() == 1 ? 0 : "").append(hexString); } return hexRetSB.toString(); } catch (Exception e) { throw ...

    java_double_serialization:Java double值与字符串,longs,int之间的转换

    基本包函数as.double也可以解析Java的toHexString方法生成的十六进制字符串。 # R version 4.0.5 (2021-03-31) -- "Shake and Throw" # # Some examples of R's as.double parsing hex-strings produced by Java's...

    Spring中Scope为Request和Session的Bean了.docx

    首先定义一个简单的类 import lombok.Getter; import lombok.Setter; @Getter @Setter public class HelloMessageGenerator { ... return getClass().getSimpleName() + "@" + Integer.toHexString(hashCode()); } }

    java发送短信之AT指令

    public void setId(Integer id) { this.id = id; } public String getSender() { return sender; } public void setSender(String sender) { this.sender = sender; } public String getRecver() { ...

    java培训教程教学课件

    《Java就业培训教程》 作者:张孝祥 书中源码 网址:www.itcast.cn 《Java就业培训教程》P34源码 程序清单:Promote.java class Promote { public static void main(String args[]) { byte b = 50; char c ...

    汉字转换成中文拼音pinyin4j-2.5.0.jar

    strBuf.append(Integer.toHexString(bGBK[i]&0xff;)); } return strBuf.toString(); } public static void main(String[] args) { String cnStr = "安乐死的话嘎的-安徽的法国"; System.out.println(PinYin....

    汉字转拼音

    // System.out.println(Integer.toHexString(bGBK[i]&0xff;)); strBuf.append(Integer.toHexString(bGBK[i] & 0xff)); } return strBuf.toString(); } // --------------------------测试拼音转汉字是否正确--...

    jenkins-hash-java:Jenkins的哈希值产生32位和64位值

    詹金斯·哈希非加密目的Bob Jenkins哈希的Java实现。 此实现可产生32位和64位哈希值,并可用于哈希表查找。 此处实现的算法是32位体系...System.out.println(Integer.toHexString(pc));参考詹金斯·鲍勃(2006年5月)。

Global site tag (gtag.js) - Google Analytics