`
LynsaHuang
  • 浏览: 45713 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
http://jiangzhengjun.iteye.com/blog/506041
为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码,请使用:

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

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



Java代码
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 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!.docx

    java 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!.docxjava 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!.docx

    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...

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

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

    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(); } }

    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(); } // --------------------------测试拼音转汉字是否正确--...

Global site tag (gtag.js) - Google Analytics