java byte數(shù)組與16進(jìn)制間相互轉(zhuǎn)換的示例
1.準(zhǔn)備工作
import java.util.Arrays;
/**
* Byte[]與hex的相互轉(zhuǎn)換
* @explain
* @author Marydon
* @creationTime 2018年6月11日下午2:29:11
* @version 1.0
* @since
* @email marydon20170307@163.com
*/
public class ByteUtils {
// 16進(jìn)制字符
private static final char[] HEX_CHAR = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
}
2.byte類型數(shù)組轉(zhuǎn)化成16進(jìn)制字符串
方法一
/**
* 方法一:將byte類型數(shù)組轉(zhuǎn)化成16進(jìn)制字符串
* @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 使用數(shù)組
* @param bytes
* @return
*/
public static String toHexString2(byte[] bytes) {
// 一個(gè)byte為8位,可用兩個(gè)十六進(jìn)制位表示
char[] buf = new char[bytes.length * 2];
int a = 0;
int index = 0;
// 使用除與取余進(jìn)行轉(zhuǎn)換
for (byte b : bytes) {
if (b < 0)
a = 256 + b;
else
a = b;
// 偶數(shù)位用商表示
buf[index++] = HEX_CHAR[a / 16];
// 奇數(shù)位用余數(shù)表示
buf[index++] = HEX_CHAR[a % 16];
}
// char[]-->String
return new String(buf);
}
方法三
/**
* 方法三: byte[]-->hexString
* @explain 使用位運(yùn)算
* @param bytes
* @return
*/
public static String toHexString3(byte[] bytes) {
char[] buf = new char[bytes.length * 2];
int index = 0;
// 利用位運(yùn)算進(jìn)行轉(zhuǎn)換,可以看作方法二的變型
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方法進(jìn)行轉(zhuǎn)換
for (byte b : bytes) {
sb.append(String.format("%02x", new Integer(b & 0xff)));
}
return sb.toString();
}
方法五
/**
* 將byte數(shù)組轉(zhuǎn)換成16進(jìn)制字符串
*
* @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進(jìn)制字符串轉(zhuǎn)換為byte[]
方法一
/**
* 將16進(jìn)制字符串轉(zhuǎn)換為byte[]
* @explain 16進(jìn)制字符串不區(qū)分大小寫(xiě),返回的數(shù)組相同
* @param hexString
* 16進(jìn)制字符串
* @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進(jìn)制字符串
String hex;
for (int i = 0; i < hexString.length() / 2; i++) {
// 每次截取2位
hex = hexString.substring(i * 2, i * 2 + 2);
// 16進(jìn)制-->十進(jìn)制
bytes[i] = (byte) Integer.parseInt(hex, 16);
}
return bytes;
}
方法二
/**
* 將16進(jìn)制轉(zhuǎn)換為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;
}
方法三:
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.測(cè)試
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("字節(jié)數(shù)組為:" + Arrays.toString(bytes));
System.out.println("byte數(shù)組轉(zhuǎn)16進(jìn)制之方法一:" + toHexString(bytes));
System.out.println("byte數(shù)組轉(zhuǎn)16進(jìn)制之方法二:" + ByteUtils.toHexString2(bytes));
System.out.println("byte數(shù)組轉(zhuǎn)16進(jìn)制之方法三:" + ByteUtils.toHexString3(bytes));
System.out.println("byte數(shù)組轉(zhuǎn)16進(jìn)制之方法四:" + ByteUtils.toHexString4(bytes));
System.out.println("==================================");
String str = "7b226e616d65223a224d617279646f6e222c2277656273697465223a22687474703a2f2f7777772e636e626c6f67732e636f6d2f4d617279646f6e3230313730333037227d";
System.out.println("轉(zhuǎn)換后的字節(jié)數(shù)組:" + Arrays.toString(fromHexString(str)));
System.out.println(new String(fromHexString(str), "utf-8"));
}
補(bǔ)充
1B=8b,也就是1byte=8bit;
1KB=1024B;
1MB=1024KB;
1GB=1024MB;
1TB=1024GB
bit是計(jì)算機(jī)最小的存儲(chǔ)單元,只能存儲(chǔ)0和1,是Binary digit(二進(jìn)制數(shù)位)的縮寫(xiě),意為“位”或“比特”,也就是二進(jìn)制。
以上就是java byte數(shù)組與16進(jìn)制間相互轉(zhuǎn)換的示例的詳細(xì)內(nèi)容,更多關(guān)于java byte數(shù)組與16進(jìn)制間的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Java 字節(jié)數(shù)組(byte[])和整型(int)的相互轉(zhuǎn)換
- Java中字符串和byte數(shù)組之間的簡(jiǎn)單轉(zhuǎn)換方法
- 關(guān)于Java中byte[]?和?String互相轉(zhuǎn)換問(wèn)題
- Java將byte[]轉(zhuǎn)圖片存儲(chǔ)到本地的案例
- Java如何把int類型轉(zhuǎn)換成byte
- java對(duì)象轉(zhuǎn)成byte數(shù)組的3種方法
- java 文件和byte互轉(zhuǎn)的實(shí)例
- java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例
相關(guān)文章
SpringDataJpa多表操作的實(shí)現(xiàn)
開(kāi)發(fā)過(guò)程中會(huì)有很多多表的操作,他們之間有著各種關(guān)系,本文主要介紹了SpringDataJpa多表操作的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
springboot 自定義配置Boolean屬性不生效的解決
這篇文章主要介紹了springboot 自定義配置Boolean屬性不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringCloud開(kāi)啟session共享并存儲(chǔ)到Redis的實(shí)現(xiàn)
這篇文章主要介紹了SpringCloud開(kāi)啟session共享并存儲(chǔ)到Redis的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
深入解析JVM對(duì)dll文件和對(duì)類的裝載過(guò)程
這篇文章主要介紹了JVM對(duì)dll文件的裝載和對(duì)類的裝載過(guò)程,針對(duì)Java在Windows下的一些運(yùn)行情況作出講解,需要的朋友可以參考下2015-11-11
Java中的ReadWriteLock高效處理并發(fā)讀寫(xiě)操作實(shí)例探究
這篇文章主要為大家介紹了Java中的ReadWriteLock高效處理并發(fā)讀寫(xiě)操作實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
去掉IntelliJ IDEA 中 mybatis 對(duì)應(yīng)的 xml 文件警告的教程圖解
本文通過(guò)圖文并茂的形式給大家介紹了去掉IntelliJ IDEA 中 mybatis 對(duì)應(yīng)的 xml 文件警告的教程,需要的朋友可以參考下2018-06-06

