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

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

十六进制(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面试题与答案】整理推荐

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值