Java 十六进制(Hex)与byte数组之间的转换

Java 十六进制(Hex)与byte数组之间的转换

大家好,又见面了,我是全栈君。

一、十六进制(Hex)与字节(byte)的概念
十六进制(Hex):计算机中数据的一种表示方法,它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;A-F对应10-15。

字节(byte):   java中一个byte为8个二进制位。

转换原理:

    每个二进制位有两种状态,分别为0,1

    因此,两个二进制位有4种状态,分别为:00,01,10,11

    三个二进制位有8种状态,分别为000,001,010,011,100,101,110,111

    四个二进制位有十六种状态,0000,0001……1110,1111.   即十六进制

 

    一个十六进制数(Hex),正好为4个二进制位。一个字节(byte)为8个二进制位。因此,一个字节可表示为两个十六进制数字。

    因此,我们可以将一个byte用两个Hex表示,同理,我们也可以将两个Hex转换为一个byte。

二、Java中Hex与byte的相互转换
在java中,很多地方经常需要进行byte与Hex之间的转换,比如:某些加密的过程(MD5),通信的过程(TCP)。

1.byte转Hex

/** 
 * 字节转十六进制 
 * @param b 需要进行转换的byte字节 
 * @return  转换后的Hex字符串 
 */  
public static String byteToHex(byte b){  
    String hex = Integer.toHexString(b & 0xFF);  
    if(hex.length() < 2){  
        hex = "0" + hex;  
    }  
    return hex;  
}  

很多时候,我们需要转换的是一个byte数组,一个一个byte调用上面的方法显然太麻烦。

/** 
 * 字节数组转16进制 
 * @param bytes 需要转换的byte数组 
 * @return  转换后的Hex字符串 
 */  
public static String bytesToHex(byte[] bytes) {  
    StringBuffer sb = new StringBuffer();  
    for(int i = 0; i < bytes.length; i++) {  
        String hex = Integer.toHexString(bytes[i] & 0xFF);  
        if(hex.length() < 2){  
            sb.append(0);  
        }  
        sb.append(hex);  
    }  
    return sb.toString();  
}  

2.Hex转byte
需注意的是,Hex的字符串必须为十六进制的字符,否则会抛出异常。Hex的范围为0x00到0xFF。

/** 
 * Hex字符串转byte 
 * @param inHex 待转换的Hex字符串 
 * @return  转换后的byte 
 */  
public static byte hexToByte(String inHex){  
   return (byte)Integer.parseInt(inHex,16);  
}  

如果Hex超过0xFF,显然转换后结果不是一个byte,而是一个byte数组

/** 
 * hex字符串转byte数组 
 * @param inHex 待转换的Hex字符串 
 * @return  转换后的byte数组结果 
 */  
public static byte[] hexToByteArray(String inHex){  
    int hexlen = inHex.length();  
    byte[] result;  
    if (hexlen % 2 == 1){  
        //奇数  
        hexlen++;  
        result = new byte[(hexlen/2)];  
        inHex="0"+inHex;  
    }else {  
        //偶数  
        result = new byte[(hexlen/2)];  
    }  
    int j=0;  
    for (int i = 0; i < hexlen; i+=2){  
        result[j]=hexToByte(inHex.substring(i,i+2));  
        j++;  
    }  
    return result;   
}  

都是静态方法,复制粘贴直接用就可以了。喜欢的同学请点赞!

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112098.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • netstat 命令详解

    netstat 命令详解netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。语法选项netstat[选项]-a或–all:显示所有连线中的Socket;-A&amp;amp;amp;amp;amp;lt;网络类型&amp;amp;amp;amp;amp;gt;或–&amp;amp;amp;amp;amp;lt;网络类型&amp;amp;amp;amp;amp;gt;:列出该网络类型连线中的相关地址;

    2022年5月7日
    51
  • 三极管导通条件与电位关系

    三极管导通条件与电位关系npn管导通条件:Ub>Ue,通常e极接地,即Ue为0V。饱和导通是Ub>Ue(锗0.2V/硅0.7V)pnp管导通条件:Ub0V。饱和导通是Ub

    2022年6月29日
    35
  • Delphi XE3 下安装ActiveX控件「建议收藏」

    Delphi XE3 下安装ActiveX控件「建议收藏」http://blog.csdn.net/lee576/article/details/1770744此英文文章来自codegear官方网站,但是是讲在BDS2006 下如何安装,我在delphi2007下用此方法,一样通过,原文如下 Description:HowtoimportanActiveXcontrolinBDS2006?Answer/S

    2022年5月14日
    37
  • 程序连接mysql失败

    程序连接mysql失败

    2021年8月22日
    58
  • 10月22日Ajax培训日记

    10月22日Ajax培训日记今天还是由梁言兵老师讲解Ajax,根据昨天学员的反馈,觉得AjaxTable这个项目太大了,学习起来有点费劲,希望梁老师讲一个较小的综合案例。所以,梁老师先讲解XTree这个客户端JavaScript组件,然后结合XTree,buffalo,spring,hibernate这些框架开发一个Ajax的demo。小收获:varobj={a:’xxx’b:function(){}}定义…

    2025年10月30日
    11
  • 虚拟机桥接模式怎么都连不上网(桥接模式下不能连校园网)[通俗易懂]

    虚拟机桥接模式怎么都连不上网(桥接模式下不能连校园网)[通俗易懂]虚拟机桥接失败的坑——桥接模式下不能连校园网问题描述这天下午,我在将树莓派采集到的图片拷贝到虚拟机Ubuntu上的时候,发现用NAT模式根本ping不通虚拟机。所以就想配个桥接模式嘛…然后就陷入了一个坑——折腾了四个多小时的坑。。。搞了半天,发现怎么桥接都连接不上网,ping都ping不通,网上也找了好多帖子,浏览量7、8W的帖子都翻烂了还是没用。嘤嘤嘤…网上有说安装包没卸载干净的、也有说要把桥接改成自动的,VMware卸了装,装了卸,然并卵。。。问题原因原因嘛,说出来都丢人,就是——桥接模式下

    2022年5月18日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号