java byte数组与16进制间的相互转换 202511054编辑
Heaven helps those who help themselves
资深码农+深耕理财=财富自由
欢迎关注![](https://files.cnblogs.com/files/Marydon20170307/gzh3.bmp)
资深码农+深耕理财=财富自由
欢迎关注
![](https://files.cnblogs.com/files/Marydon20170307/gzh3.bmp)
java byte数组与16进制间的相互转换
Created by Marydon on 2018-06-11 15:37
1.准备工作
import java.util.Arrays; /** * Byte[]与hex的相互转换 * @explain * @author Marydon * @creationTime 2018年6月11日下午2:29:11 * @version 1.0 * @since * @email marydon20170307@163.com */ public class ByteUtils { // 16进制字符 private static final char[] HEX_CHAR = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; }
2.byte类型数组转化成16进制字符串
方法一
/** * 方法一:将byte类型数组转化成16进制字符串 * @explain 字符串拼接 * @param bytes * @return */ public static String toHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); int num; for (byte b : bytes) { num = b < 0 ? 256 + b : b; sb.append(HEX_CHAR[num / 16]).append(HEX_CHAR[num % 16]); } return sb.toString(); }
方法二
/** * 方法二: byte[] to hex string * @explain 使用数组 * @param bytes * @return */ public static String toHexString2(byte[] bytes) { // 一个byte为8位,可用两个十六进制位表示 char[] buf = new char[bytes.length * 2]; int a = 0; int index = 0; // 使用除与取余进行转换 for (byte b : bytes) { if (b < 0) a = 256 + b; else a = b; // 偶数位用商表示 buf[index++] = HEX_CHAR[a / 16]; // 奇数位用余数表示 buf[index++] = HEX_CHAR[a % 16]; } // char[]-->String return new String(buf); }
方法三
/** * 方法三: byte[]-->hexString * @explain 使用位运算 * @param bytes * @return */ public static String toHexString3(byte[] bytes) { char[] buf = new char[bytes.length * 2]; int index = 0; // 利用位运算进行转换,可以看作方法二的变型 for (byte b : bytes) { buf[index++] = HEX_CHAR[b >>> 4 & 0xf]; buf[index++] = HEX_CHAR[b & 0xf]; } return new String(buf); }
方法四
/** * 方法四:byte[]-->hexString * @param bytes * @return */ public static String toHexString4(byte[] bytes) { StringBuilder sb = new StringBuilder(bytes.length * 2); // 使用String的format方法进行转换 for (byte b : bytes) { sb.append(String.format("%02x", new Integer(b & 0xff))); } return sb.toString(); }
方法五
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /** * 将byte数组转换成16进制字符串 * * @param src * @return */ private static String bytesToHexString( byte [] src) { StringBuilder sb = new StringBuilder(); for ( int i = 0 ; i < src.length; i++) { int v = src[i] & 0xFF ; String hv = Integer.toHexString(v); if (hv.length() < 2 ) { sb.append( 0 ); } sb.append(hv); } return sb.toString(); } |
3.16进制字符串转换为byte[]
方法一
/** * 将16进制字符串转换为byte[] * @explain 16进制字符串不区分大小写,返回的数组相同 * @param hexString * 16进制字符串 * @return byte[] */ public static byte[] fromHexString(String hexString) { if (null == hexString || "".equals(hexString.trim())) { return new byte[0]; } byte[] bytes = new byte[hexString.length() / 2]; // 16进制字符串 String hex; for (int i = 0; i < hexString.length() / 2; i++) { // 每次截取2位 hex = hexString.substring(i * 2, i * 2 + 2); // 16进制-->十进制 bytes[i] = (byte) Integer.parseInt(hex, 16); } return bytes; }
方法二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /** * 将16进制转换为byte[] * @param hexStr * @return */ public static byte [] fromHex(String hexStr) { if (hexStr.length() < 1 ) return null ; byte [] result = new byte [hexStr.length() / 2 ]; for ( int i = 0 ; i < hexStr.length() / 2 ; i++) { int high = Integer.parseInt(hexStr.substring(i * 2 , i * 2 + 1 ), 16 ); int low = Integer.parseInt(hexStr.substring(i * 2 + 1 , i * 2 + 2 ), 16 ); result[i] = ( byte ) (high * 16 + low); } return result; } |
方法三:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public static byte [] toByteArray(String data) { if (data == null ) { return new byte [] {}; } if (data.length() == 0 ) { return new byte [] {}; } while (data.length() < 2 ) { data = "0" + data; } if (data.substring( 0 , 2 ).toLowerCase().equals( "0x" )) { data = data.substring( 2 ); } if (data.length() % 2 == 1 ) { data = "0" + data; } data = data.toUpperCase(); byte [] bytes = new byte [data.length() / 2 ]; String hexString = "0123456789ABCDEF" ; for ( int i = 0 ; i < bytes.length; i++) { int byteConv = hexString.indexOf(data.charAt(i * 2 )) * 0x10 ; byteConv += hexString.indexOf(data.charAt(i * 2 + 1 )); bytes[i] = ( byte ) (byteConv & 0xFF ); } return bytes; } |
4.测试
public static void main(String[] args) throws Exception { String json = "{\"name\":\"Marydon\",\"website\":\"http://www.cnblogs.com/Marydon20170307\"}"; byte[] bytes = json.getBytes("utf-8"); System.out.println("字节数组为:" + Arrays.toString(bytes)); System.out.println("byte数组转16进制之方法一:" + toHexString(bytes)); System.out.println("byte数组转16进制之方法二:" + ByteUtils.toHexString2(bytes)); System.out.println("byte数组转16进制之方法三:" + ByteUtils.toHexString3(bytes)); System.out.println("byte数组转16进制之方法四:" + ByteUtils.toHexString4(bytes)); System.out.println("=================================="); String str = "7b226e616d65223a224d617279646f6e222c2277656273697465223a22687474703a2f2f7777772e636e626c6f67732e636f6d2f4d617279646f6e3230313730333037227d"; System.out.println("转换后的字节数组:" + Arrays.toString(fromHexString(str))); System.out.println(new String(fromHexString(str), "utf-8")); }
20200520补充
1B=8b,也就是1byte=8bit;
1KB=1024B;
1MB=1024KB;
1GB=1024MB;
1TB=1024GB
bit是计算机最小的存储单元,只能存储0和1,是Binary digit(二进制数位)的缩写,意为“位”或“比特”,也就是二进制。
与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。
您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!
↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/9167339.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
· C# 深度学习框架 TorchSharp 原生训练模型和图像识别
· 这或许是全网最全的 DeepSeek 使用指南,95% 的人都不知道的使用技巧(建议收藏)
· 拒绝繁忙!免费使用 deepseek-r1:671B 参数满血模型
· 本地搭建DeepSeek和知识库 Dify做智能体Agent(推荐)
· Sdcb Chats 重磅更新:深度集成 DeepSeek-R1,思维链让 AI 更透明!
· DeepSeek-R1本地部署如何选择适合你的版本?看这里