天天看点

十六进制字符串与字节数组的转换

十六进制字符串与字节数组的转换

十六进制(hex):0-9,A-F组成,不区分大小写,与十进制对应关系:0-9对应0-9,A-F对应10-15

位(bit):java语言中1个bit  用0或1表示

字节(byte):java语言中1个byte=8个bit,1个bit=1个二进制位

十进制:10-->二进制:1010-->十六进制:A

1 hex = 4 bit; 1 byte = 8 bit --> 1 byte = 2 hex

即1个字节需要用2个十六进制字符表示

工具代码

package constxiong.xtools.convert;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

/**
 * 十六进制字符串与字节数组的转换
 * 十六进制(hex):0-9,A-F组成,不区分大小写,与十进制对应关系:0-9对应0-9,A-F对应10-15
 * 位(bit):java语言中1个bit  用0或1表示
 * 字节(byte):java语言中1个byte=8个bit,1个bit=1个二进制位
 * 十进制:10-->二进制:1010-->十六进制:A
 * 1 hex = 4 bit; 1 byte = 8 bit --> 1 byte = 2 hex
 * 即1个字节需要用2个十六进制字符表示
 * @author ConstXiong
 * @date 2019-03-08 10:50:53
 */
public class HexConverter {
	
	/**
	 * 十六进制字符
	 */
	private static char[] hexChars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
			'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F'};
	
	/**
	 * 字节数组 转 十六进制字符串
	 * @param bytes 字节数组
	 * @param toUpper 
	 * @return 十六进制字符串,默认字母是小写
	 */
	public static String byteArrayToHexString(byte[] bytes, boolean toUpper) {
		if (ArrayUtils.isNotEmpty(bytes)) {
			StringBuilder builder = new StringBuilder();
			for (byte b : bytes) {
				String hexStr = Integer.toHexString(b & 0xFF);
				if (hexStr.length() < 2) {
					builder.append(0);
				}
				builder.append(hexStr);
			}
			return toUpper ? builder.toString().toUpperCase() : builder.toString();
		}
		return null;
	}
	
	/**
	 * 十六进制字符串,转单个字节(取最后两位字符)
	 * "1A"=26,"11A"=26,"11110"=16
	 * @param hexStr 十六进制字符串
	 * @return
	 */
	public static byte hexStringToByte(String hexStr) {
		return (byte)Integer.parseInt(hexStr, 16);
	}
	
	/**
	 * 十六进制字符串转字节数组
	 * @param hexStr 十六进制字符串
	 * @return
	 */
	public static byte[] hexStringToByteArray(String hexStr) {
		byte[] bytes = null;
		if (isHexStr(hexStr)) {
			int length = hexStr.length() / 2;
			bytes = new byte[length];
			for (int i = 0; i < length; i++) {
				bytes[i] = (byte)Integer.parseInt(hexStr.substring(i*2, (i+1) * 2), 16);
			}
		}
		return bytes;
	}
	
	/**
	 * 判断是否为十六进制字符
	 * @param c 十六进制字符
	 * @return
	 */
	public static boolean isHexChar(char c) {
		for (char hChar : hexChars) {
			if (c == hChar) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 判断是否为十六进制字符串
	 * @param hexStr 十六进制字符串
	 * @return
	 */
	public static boolean isHexStr(String hexStr) {
		if (StringUtils.isNotEmpty(hexStr)) {
			char[] hexChars = hexStr.toCharArray();
			if (hexChars.length % 2 != 0) {
				System.out.println(hexStr + "[奇数位十六进制字符串]");
				return false;
			}
			for (char hexChar : hexChars) {
				if (!isHexChar(hexChar)) {
					return false;
				}
			}
		}
		return true;
	}
}
           

测试代码

package constxiong.xtools.convert;

import java.util.Arrays;

import org.junit.Assert;
import org.junit.Test;

/**
 * 十六进制转换测试
 * @author ConstXiong
 * @date 2019-03-08 14:52:42
 */
public class HexConverterTest {

	private static final String TEST_HEX_STR = "2A0F";
	private static final byte[] TEST_HEX_BYTES = new byte[]{42, 15};
	
	/**
	 * 测试 字节数组 转 十六进制字符串
	 */
	@Test
	public void testByteArrayToHexString() {
		boolean toUpper = true;
		Assert.assertEquals(TEST_HEX_STR, HexConverter.byteArrayToHexString(TEST_HEX_BYTES, toUpper));
	}
	
	/**
	 * 测试 十六进制字符串,转单个字节
	 */
	@Test
	public void testHexStringToByte() {
		String hexStr = "0B";
		byte b = 11;
		Assert.assertTrue(b == HexConverter.hexStringToByte(hexStr));
		
		hexStr = "A0B";
		Assert.assertTrue(b == HexConverter.hexStringToByte(hexStr));//只取最后两个字符"0B"
	}
	
	/**
	 * 测试 十六进制字符串转字节数组
	 */
	@Test
	public void testHexStringToByteArray() {
		Assert.assertTrue(Arrays.equals(TEST_HEX_BYTES, 
				HexConverter.hexStringToByteArray(TEST_HEX_STR)));
	}
	
	/**
	 * 测试 判断是否为十六进制字符
	 */
	@Test
	public void testIsHexChar() {
		char c = 'a';
		Assert.assertTrue(HexConverter.isHexChar(c));
		
		c = 'k';
		Assert.assertFalse(HexConverter.isHexChar(c));
	}
	
	/**
	 * 测试 判断是否为十六进制字符串
	 */
	@Test
	public void testIsHexStr() {
		String hexStr = "0Abd";
		Assert.assertTrue(HexConverter.isHexStr(hexStr));
		
		hexStr = "10Abd";
		Assert.assertFalse(HexConverter.isHexStr(hexStr));
		
		hexStr = "k10Abd";
		Assert.assertFalse(HexConverter.isHexStr(hexStr));
	}
}
           

完整源码:https://github.com/ConstXiong/xtools

【Java面试题与答案】整理推荐

  • 基础与语法
  • 集合
  • 网络编程
  • 并发编程
  • Web
  • 安全
  • 设计模式
  • 框架
  • 算法与数据结构
  • 异常
  • 文件解析与生成
  • Linux
  • MySQL
  • Oracle
  • Redis
  • Dubbo