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

网友投稿 357 2022-11-16


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

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

}zuxzXqf

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 < zuxzXqfhexString.length() / 2; i++) {

// 每次截取2位

hex = hexString.substring(i * 2, i * 2 + 2);

// 16进制-->十进制

bytes[i] = (byte) Integer.parseInt(hex, 16http://);

}

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://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"));

}

补充

1B=8b,也就是1byte=8bit;

1KB=1024B;

1MB=1024KB;

1GB=1024MB;

1TB=1024GB

bit是计算机最小的存储单元,只能存储0和1,是Binary digit(二进制数位)的缩写,意为“位”或“比特”,也就是二进制。

以上就是java byte数组与16进制间相互转换的示例的详细内容,更多关于java byte数组与16进制间的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解SpringBoot整合MyBatis详细教程
下一篇:ssm整合之Spring整合MyBatis框架配置事务的详细教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~