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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CCriticalSection与CSingleLock

    CCriticalSection与CSingleLockCCriticalSectionAnobjectofclassCCriticalSectionrepresentsa“criticalsection”—asynchronizationobjectthatallowsonethreadatatimetoaccessaresourceorsectionofcode.Criticalse

    2022年7月21日
    11
  • 可拔插视图

    可拔插视图基于类的试图fromflask.viewsimportViewfromflaskimportrender_templateclassUserLogin(View):methods=[‘POST’,’GET’]defdispatch_request(self):returnrender_template(‘login.html’)基于方法的试图from

    2022年5月30日
    84
  • SqlBulkCopy 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 bit「建议收藏」

    SqlBulkCopy 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 bit「建议收藏」使用SqlBulkCopy批量插入,可以快速对大批量的数量插入,性能非常好在使用时出现“来自数据源的String类型的给定值不能转换为指定目标列的类型bit”异常为DataTable与要插入的数据表字段位置不一样所至DataTable与要插入的数据表要字段名,位置,数据类型都一至才可示例,使用使用SqlBulkCopy插入多个表publicbo…

    2022年7月20日
    19
  • golang 最新激活码(JetBrains全家桶)

    (golang 最新激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0BXA05X8YC-eyJsa…

    2022年3月30日
    281
  • drupal 6.0 入门教程 – 第一章

    drupal 6.0 入门教程 – 第一章
     
    由于工作项目的原因,需要采用drupal来部署,所以最近学习了drupalcms,天天到 drupal.org,drupalchina.org,zhupou.cn,5iphp.com上学习
     
     
    项目的核心是提供一款在线教学和互动社区,希望通过这个教程提供给大家一个比较全面的项目开发指导。首先,我近期的主要任务是熟悉drupalCMS,和设计主页的版式也就是themes。
     
    下面我们从drupal的介绍入手,开始讲解如果

    2022年5月29日
    34
  • python能开发arm_获得通用技能的方法

    python能开发arm_获得通用技能的方法看了很多资料介绍如何将python移植到嵌入式设备当中,但总感觉杂乱五章,还移植不成功,但是经过我的多方摸索,成功的探索出了一条阳光大道,供各位网友借鉴参考。我采用的方法可以成功移植python2.7以后的所有版本。第一步:从官网下载源码.并把解压放在/opt第二步:在/Python-3.4.5目录下新建一键移植脚本,并执行内容如下:(执行完会报错某某模块内没安装,这个不耽误,…

    2022年10月10日
    0

发表回复

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

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