十六進制字元串與位元組數組的轉換
十六進制(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