天天看點

十六進制字元串與位元組數組的轉換

十六進制字元串與位元組數組的轉換

十六進制(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