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

补充

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

  1KB=1024B;

  1MB=1024KB;

  1GB=1024MB;

  1TB=1024GB

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

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

(0)

相关推荐

  • Java 字节数组类型(byte[])与int类型互转方法

    代码如下: public class CommonUtils { //高位在前,低位在后 public static byte[] int2bytes(int num){ byte[] result = new byte[4]; result[0] = (byte)((num >>> 24) & 0xff);//说明一 result[1] = (byte)((num >>> 16)& 0xff ); result[2] = (byte)((num >

  • Java任意长度byte数组转换为int数组的方法

    前言 嗯.最近工程上遇到一个byte数组转换为int的问题,解决过程中遇到了几个坑,经过各种查资料终于还是解决了.撒花. Java的位运算以及byte数组与其他类型数据的转换比c/c++感觉麻烦一些.这里简单说明一下byte数组和int的转换吧. 总所周知,int类型数据在Java中占据32 bit,byte占据8 bit,这样的话,正常情况下4个byte可以转换成一个int类型数据. 当然,不正常情况下,3个byte或者2个byte甚至1个byte都可以转换为int数据,只需要高位补上就行.

  • Java中字符串与byte数组之间的相互转换

    前言 Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成byte数组型,java在字符与数组转换也是非常方便的.下面跟我一起来了解一下字符串与byte之间转换的原理 原理 我们都知道,在Java里byte类型是占用1个字节,即8位的,而16进制的字符占用4位,所以每个byte可以用两个字符来表示,反之亦然. 举个例子 byte = 123 用二进制表示:0111 1011 每4位用字符表示: 7 b 是的,原理就这么简单,接下来用代码实现: byte[] 转1

  • 基于java中byte数组与int类型的转换(两种方法)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形int转换成byte数组,同时如何把一个长度为4的byte数组转换为int类型.下面有两种方式. public static byte[] int2byte(int res) { byte[] targets = new byte[4]; targets[0] = (byte) (res & 0xf

  • Java基本类型与byte数组之间相互转换方法

    Java基本类型与byte数组之间相互转换,刚刚写的 package cn.teaey.utils; import java.nio.charset.Charset; public class ByteUtil { public static byte[] getBytes(short data) { byte[] bytes = new byte[2]; bytes[0] = (byte) (data & 0xff); bytes[1] = (byte) ((data & 0xff00)

  • Java中byte、byte数组与int、long的转换详解

    一.Java 中 byte 和 int 之间的转换源码: //byte 与 int 的相互转换 public static byte intToByte(int x) { return (byte) x; } public static int byteToInt(byte b) { //Java 总是把 byte 当做有符处理:我们可以通过将其和 0xFF 进行二进制与得到它的无符值 return b & 0xFF; } 测试代码: //测试 int 转 byte int int0 = 234

  • Java整型数与网络字节序byte[]数组转换关系详解

    本文实例讲述了Java整型数与网络字节序byte[]数组转换关系.分享给大家供大家参考,具体如下: 工作项目需要在java和c/c++之间进行socket通信,socket通信是以字节流或者字节包进行的,socket发送方须将数据转换为字节流或者字节包,而接收方则将字节流和字节包再转换回相应的数据类型.如果发送方和接收方都是同种语言,则一般只涉及到字节序的调整.而对于java和c/c++的通信,则情况就要复杂一些,主要是因为java中没有unsigned类型,并且java和c在某些数据类型上的长

  • Java 图片与byte数组互相转换实例

    实例如下: //图片到byte数组 public byte[] image2byte(String path){ byte[] data = null; FileImageInputStream input = null; try { input = new FileImageInputStream(new File(path)); ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buf = new byte[

  • java对象转成byte数组的3种方法

    java对象转成byte数组,在使用netty进行通信协议传输的场景中是非常常见的.比如,协议有一些定好的协议头.classid,messageid等等信息,还有一个关键的内容是payload.不同的协议内容都会放到payload中,而这个payload往往就是一个byte数组. 那么,如何方便的将一个java对象构造成一个byte数组呢? 1 bytebuf填充 我们以下面这个对象举例: public class UgvData implements Serializible{ private

  • java中两个byte数组实现合并的示例

    今天在于硬件进行交互的过程中,要到了了需要两个数组进行合并,然后对数组进行反转和加密操作,以下是两个byte数组合并的方法. /** * * @param data1 * @param data2 * @return data1 与 data2拼接的结果 */ public static byte[] addBytes(byte[] data1, byte[] data2) { byte[] data3 = new byte[data1.length + data2.length]; Syste

随机推荐