java byte数组与16进制间的相互转换

CreationTime--2018年6月11日15点34分

Author:Marydon

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();
}

  方法五

/**
* 将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;
}

  方法二

/**
* 将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;
}

  方法三:

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(二进制数位)的缩写,意为“位”或“比特”,也就是二进制。

 

java byte数组与16进制间的相互转换的更多相关文章

  1. C# byte数组与16进制间的相互转换

      1.byte数组转16进制字符串 /// <summary> /// 将一个byte数组转换成16进制字符串 /// </summary> /// <param na ...

  2. java字节数组和16进制之间的转换

    /* * To change this template, choose Tools | Templates * and open the template in the editor. */ pac ...

  3. BYTE数组与16进制字符串互转

    //字节数组转换为HEX 字符串const string Byte2HexString(const unsigned char* input, const int datasize) { ]; ; j ...

  4. 加密算法使用(二):使用MD5加密字符串(另:byte数组转16进制自动补零方法写法)

    public static void main(String args[]) throws NoSuchAlgorithmException { String s = new String(" ...

  5. byte数组转16进制 输出到文件

    try { File file = new File(Environment.getExternalStorageDirectory(),"shuju2"); if(!file.e ...

  6. Java中byte与(16进制)字符串的互相转换

    java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示,所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16 ...

  7. java中把字节数组转换为16进制字符串

    把字符串数组转换为16进制字符串 import java.security.MessageDigest; public class StringUtil { public StringUtil() { ...

  8. C#//字节数组转16进制字符串

    //字节数组转16进制字符串 private static string byteToHexStr(byte[] bytes,int length) { string returnStr = &quo ...

  9. Java中字符串转为16进制表示

    Java中字符串转为16进制表示 String str = "鲸"; char[] chars = "0123456789ABCDEF".toCharArray ...

随机推荐

  1. PyGreSQL入门,pg模块,pgdb模块

    安装:http://www.pygresql.org/contents/install.html PyGreSQL入门 ——简单整理翻译自官方文档:http://www.pygresql.org/co ...

  2. 访问修饰符(C# 编程指南)

    所有类型和类型成员都具有可访问性级别,该级别可以控制是否可以从你的程序集或其他程序集中的其他代码中使用它们. 可以使用以下访问修饰符在进行声明时指定类型或成员的可访问性: public同一程序集中的任 ...

  3. Guava CompoundOrdering

    概述 CompoundOrdering是Ordering的子类,它用来存储比较器链, Ordering的compound()内部实现就是使用 CompoundOrdering(Comparator&l ...

  4. 洛谷P1284 三角形牧场

    题目描述 和所有人一样,奶牛喜欢变化.它们正在设想新造型的牧场.奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场.她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有 ...

  5. 自适应尺寸变化的meanshift跟踪

    近期在看meanshift方面的文章,看了一篇博文对这篇文章<Robust scale-adaptive meanshift for tracking>寄予非常高的评价,所以把这篇文章简要 ...

  6. 接口隔离原则(Interface Segregation Principle,ISP)

    接口隔离原则: 1.使用多个专门的接口比使用单一的总接口要好. 2.一个类对另外一个类的依赖性应当是建立在最小的接口上的. 3.一个接口代表一个角色,不应当将不同的角色都交给一个接口.没有关系的接口合 ...

  7. xml获取配置DataTable

    在CSDN写博客时,经常遇到需要绑定数据源的时候,可是自己从数据库获取数据的函数都是已经封装好了的,这样别人复制你的代码,要想看到结果,还得修改修改,很是麻烦,博客实例,数据源简单点就好,这样别人写你 ...

  8. [算法导论]quicksort algorithm @ Python

    算法导论上面快速排序的实现. 代码: def partition(array, left, right): i = left-1 for j in range(left, right): if arr ...

  9. CSS-div高度100%设置问题

    div常用的属性width和height,有的时候如果我们需要让div的高度是整个屏幕的高度,设置height:100%发现并没有什么作用,并不是这样设置不对,而是w3c规范中关于百分比的设置是相对于 ...

  10. 自定义View 水印布局 WaterMark 前景色 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...