Java byte数组与十六进制字符串互转

  • 博客分类:
  • Java

Javajava 十六进制java hex

Java 加密解密基础

Java byte数组与十六进制字符串互转

Java BASE64加密解密

Java 加密解密之消息摘要算法(MD5 SHA MAC)

Java 加密解密之对称加密算法DES

Java 加密解密之对称加密算法DESede

Java 加密解密之对称加密算法AES

Java 加密解密之对称加密算法PBE

Java byte数组与十六进制字符串互转

Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示。

所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果new String(H) + new String(L)。

同理,相反的转换也是将两个16进制字符转换成一个byte,原理同上。

根据以上原理,我们就可以将byte[] 数组转换为16进制字符串了,当然也可以将16进制字符串转换为byte[]数组了。

Hex类代码如下:

Java代码

  1. /**
  2. * reference apache commons <a
  3. * href="http://commons.apache.org/codec/">http://commons.apache.org/codec/</a>
  4. *
  5. * @author Aub
  6. *
  7. */
  8. public class Hex {
  9. /**
  10. * 用于建立十六进制字符的输出的小写字符数组
  11. */
  12. private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5',
  13. '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
  14. /**
  15. * 用于建立十六进制字符的输出的大写字符数组
  16. */
  17. private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5',
  18. '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
  19. /**
  20. * 将字节数组转换为十六进制字符数组
  21. *
  22. * @param data
  23. *            byte[]
  24. * @return 十六进制char[]
  25. */
  26. public static char[] encodeHex(byte[] data) {
  27. return encodeHex(data, true);
  28. }
  29. /**
  30. * 将字节数组转换为十六进制字符数组
  31. *
  32. * @param data
  33. *            byte[]
  34. * @param toLowerCase
  35. *            <code>true</code> 传换成小写格式 , <code>false</code> 传换成大写格式
  36. * @return 十六进制char[]
  37. */
  38. public static char[] encodeHex(byte[] data, boolean toLowerCase) {
  39. return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
  40. }
  41. /**
  42. * 将字节数组转换为十六进制字符数组
  43. *
  44. * @param data
  45. *            byte[]
  46. * @param toDigits
  47. *            用于控制输出的char[]
  48. * @return 十六进制char[]
  49. */
  50. protected static char[] encodeHex(byte[] data, char[] toDigits) {
  51. int l = data.length;
  52. char[] out = new char[l << 1];
  53. // two characters form the hex value.
  54. for (int i = 0, j = 0; i < l; i++) {
  55. out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
  56. out[j++] = toDigits[0x0F & data[i]];
  57. }
  58. return out;
  59. }
  60. /**
  61. * 将字节数组转换为十六进制字符串
  62. *
  63. * @param data
  64. *            byte[]
  65. * @return 十六进制String
  66. */
  67. public static String encodeHexStr(byte[] data) {
  68. return encodeHexStr(data, true);
  69. }
  70. /**
  71. * 将字节数组转换为十六进制字符串
  72. *
  73. * @param data
  74. *            byte[]
  75. * @param toLowerCase
  76. *            <code>true</code> 传换成小写格式 , <code>false</code> 传换成大写格式
  77. * @return 十六进制String
  78. */
  79. public static String encodeHexStr(byte[] data, boolean toLowerCase) {
  80. return encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
  81. }
  82. /**
  83. * 将字节数组转换为十六进制字符串
  84. *
  85. * @param data
  86. *            byte[]
  87. * @param toDigits
  88. *            用于控制输出的char[]
  89. * @return 十六进制String
  90. */
  91. protected static String encodeHexStr(byte[] data, char[] toDigits) {
  92. return new String(encodeHex(data, toDigits));
  93. }
  94. /**
  95. * 将十六进制字符数组转换为字节数组
  96. *
  97. * @param data
  98. *            十六进制char[]
  99. * @return byte[]
  100. * @throws RuntimeException
  101. *             如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常
  102. */
  103. public static byte[] decodeHex(char[] data) {
  104. int len = data.length;
  105. if ((len & 0x01) != 0) {
  106. throw new RuntimeException("Odd number of characters.");
  107. }
  108. byte[] out = new byte[len >> 1];
  109. // two characters form the hex value.
  110. for (int i = 0, j = 0; j < len; i++) {
  111. int f = toDigit(data[j], j) << 4;
  112. j++;
  113. f = f | toDigit(data[j], j);
  114. j++;
  115. out[i] = (byte) (f & 0xFF);
  116. }
  117. return out;
  118. }
  119. /**
  120. * 将十六进制字符转换成一个整数
  121. *
  122. * @param ch
  123. *            十六进制char
  124. * @param index
  125. *            十六进制字符在字符数组中的位置
  126. * @return 一个整数
  127. * @throws RuntimeException
  128. *             当ch不是一个合法的十六进制字符时,抛出运行时异常
  129. */
  130. protected static int toDigit(char ch, int index) {
  131. int digit = Character.digit(ch, 16);
  132. if (digit == -1) {
  133. throw new RuntimeException("Illegal hexadecimal character " + ch
  134. + " at index " + index);
  135. }
  136. return digit;
  137. }
  138. public static void main(String[] args) {
  139. String srcStr = "待转换字符串";
  140. String encodeStr = encodeHexStr(srcStr.getBytes());
  141. String decodeStr = new String(decodeHex(encodeStr.toCharArray()));
  142. System.out.println("转换前:" + srcStr);
  143. System.out.println("转换后:" + encodeStr);
  144. System.out.println("还原后:" + decodeStr);
  145. }
  146. }

https://www.iteye.com/blog/aub-1129228

参考org.apache.commons.codec.binary.Hex
下载地址: http://commons.apache.org/codec/download_codec.cgi

Java byte数组与十六进制字符串互转相关推荐

  1. 如何将字节数组转换为十六进制字符串,反之亦然?

    如何将字节数组转换为十六进制字符串,反之亦然? #1楼 在此不谈很多答案,但我发现十六进制字符串解析器的实现相当理想(比公认的要好约4.5倍),直接实现. 首先,我的测试输出(第一批是我的实现): G ...

  2. java byte数组与String互转

    java byte数组与String互转 CreationTime--2018年7月6日14点53分 Author:Marydon 1.String-->byte[] 方法:使用String.g ...

  3. Java中字节数组和十六进制字符串之间的转换

    1. 概述 在本教程中,我们将看看将字节数组转换为十六进制字符串,反之亦然的不同方法. 我们还将了解转换机制并编写我们的实现来实现这一点. 2. 字节和十六进制之间的转换 首先,我们来看看字节和十六进 ...

  4. VB 二进制数组与十六进制字符串相互转换

    1.VB 二进制Byte()数组转换成十六进制字符串函数: Private Function BytesToHex(bytB() As Byte) As String Dim strTmp As St ...

  5. java byte数组转int数组_Java任意长度byte数组转换为int数组的方法

    前言 嗯.最近工程上遇到一个byte数组转换为int的问题,解决过程中遇到了几个坑,经过各种查资料终于还是解决了.撒花. Java的位运算以及byte数组与其他类型数据的转换比c/c++感觉麻烦一些. ...

  6. 如何在Java中将字节数组转换为十六进制字符串?

    我有一个用十六进制数字填充并打印的字节数组,简单的方法是毫无意义的,因为有许多不可打印的元素. 我需要的是以下形式的确切十六进制代码: 3a5f771c #1楼 最简单的解决方案,没有外部库,没有数字 ...

  7. java byte数组转化为流_java中字节数组和字符串、IO流和字节数组之间的转换

    在实际开发中经常会碰到乱码问题: 首先查看系统支持的编码方式,默认的编码方式 //检查java支持的编码 System.out.println(Charset.availableCharsets(). ...

  8. android byte转16进制字符串,如何将字节数组转换为十六进制字符串,反之亦然?...

    我通过一些粗略的Stopwatch性能测试运行了各种转换方法,一个带有随机句子的运行(n = 61,1000次迭代)和一个带有Project Gutenburg文本的运行(n = 1,238,957, ...

  9. java的byte[]数组转成字符串并且再转回byte[]数组

    byte[] bytes=new byte[] {-58,-85,55,7}; Arrays.toString(bytes) /*** 解码byte[]数组的字符串变成byte[]* @param b ...

最新文章

  1. 数字双胞胎技术和物联网如何帮助企业取得成功
  2. 修改系统默认区域语言日期格式
  3. STM32的同步规则模式使用
  4. 不要被约束的意思_俗话说:“娶妻不娶颧骨高,嫁汉不嫁连眉梢”,到底什么意思?...
  5. P2327 [SCOI2005]扫雷
  6. php递归删除文件,PHP 递归删除文件夹
  7. 规则管理平台系列(二)
  8. Linux pid_t 类型的定义
  9. AVL Cruise 2020安装教程
  10. freemaker word转html,ftl文件-word文档转化成ftl文件
  11. JavaScript之document对象获取元素
  12. 用stata计算同比增长率的两种方法
  13. 强制退出Mac程序的六种方法
  14. Win11如何录屏?压箱底的录屏工具分享给你
  15. macOS Monterey 12.5 (21G72) 正式版 ISO、IPSW、PKG 下载
  16. 亚马逊和Global Optimism欢迎汉高和昕诺飞加入《气候宣言》
  17. 龙与地下城用户名_多用户地下城如何教我编程
  18. VOCBENCH声码器评价基准
  19. 【Fiori系列】为什么SAP Fiori活的如此精致
  20. pyqt5可以写手机apk吗_不需要写代码,直接在unity实现手机可以跑的毛发效果

热门文章

  1. Zabbix server: Utilization of http poller processes over 75% 问题解决。
  2. 大一c语言课程报告报书模板,C语言课程设计实验报模板.doc
  3. ThreadPoolExecutor使用
  4. 明解C语言示例代码5-1 数组
  5. Unity3d笔记——利用Animator使模型动起来
  6. window7设置无线WIFI,手机用笔记本上网(解决流量不够用问题)
  7. c语言oops_C ++编程oops概念能力问答
  8. 新公司第一周上班体验
  9. 四款好看实用的CSS表格样式分享
  10. [detectron2 ] Mask R-CNN代码笔记