Java Byte Hex转换
不少人在处理Java字节与十六进制转换时,常会遇到一个关键细节:为什么byte转Hex要用“& 0xFF”?这背后隐藏着Java数据类型的特性与常见陷阱。下面通过图示直观理解。

字节(byte)转十六进制(Hex)详解
先介绍单个字节转Hex的核心逻辑。Java中的byte类型是有符号的,取值范围为-128到127,而十六进制Hex是无符号表示。若直接使用Integer.toHexString(),负数会扩展为32位整数,导致结果错误。因此需要执行“& 0xFF”操作,将高24位清零,仅保留低8位,即原始字节的真实值。
另一个细节:十六进制通常以两位字符表示,如0A、FF。若转换后的值小于16(例如10对应A),则只得到一个字符,容易与相邻字符串混淆。例如字符串“11”可能代表两个字节1和1,或一个字节11。因此必须补0,确保结果始终为两位。代码实现如下:
/**
* Byte转Hex
* @param b 字节
* @return Hex
*/
public static String byteToHex(byte b)
{
String hexString = Integer.toHexString(b & 0xFF);
//十六进制由0~9、A~F表示1~16,若Byte转Hex后结果小于16,则仅得到一个字符(如A=10)。通常使用两个字符表示十六进制位,
//若只有一个字符,遇到字符串“11”时,无法区分是1和1两个字节还是11一个字节。补0后,1和1变为0101,11则明确表示一个字节。
if (hexString.length() < 2)
{
hexString = new StringBuilder(String.valueOf(0)).append(hexString).toString();
}
return hexString.toUpperCase();
}
字节数组(byte[])转十六进制(Hex)实现
批量转换的实现相对简单:遍历字节数组,对每个字节调用上述方法,再拼接结果。需注意处理null和空数组的情况,代码中已做了周全判断:
/**
* 字节数组转Hex
* @param bytes 字节数组
* @return Hex
*/
public static String bytesToHex(byte[] bytes)
{
StringBuffer sb = new StringBuffer();
if (bytes != null && bytes.length > 0)
{
for (int i = 0; i < bytes.length; i++) {
String hex = byteToHex(bytes[i]);
sb.append(hex);
}
}
return sb.toString();
}
十六进制(Hex)转字节(byte)反向转换
反向转换更为直接:使用Integer.parseInt()解析字符串,再强制转换为byte。注意parseInt接收的字符串需为合法十六进制,例如“A”或“FF”:
/**
* Hex转Byte字节
* @param hex 十六进制字符串
* @return 字节
*/
public static byte hexToByte(String hex)
{
return (byte) Integer.parseInt(hex,16);
}
十六进制(Hex)转字节数组(byte[])注意事项
批量转换时存在一个常见陷阱:Hex字符串长度可能为奇数。例如“A”实际表示0x0A,但若直接按两位一组截取会出错。因此代码先判断长度,若为奇数则在前面补0,确保长度为偶数。然后每两位一组调用上述方法转换为字节,依次存入数组:
/**
* Hex转Byte字节数组
* @param hex 十六进制字符串
* @return 字节数组
*/
public static byte[] hexToBytes(String hex)
{
int hexLength = hex.length();
byte[] result;
//判断Hex字符串长度,若为奇数需在前边补0以保证长度为偶数
//因为Hex字符串通常为两个字符,截取时按两位一组转换为Byte
if (hexLength % 2 ==1)
{
//奇数
hexLength++;
hex = "0"+hex;
}
result = new byte[(hexLength/2)];
int j = 0;
for (int i = 0; i < hexLength; i+=2) {
result[j] = hexToByte(hex.substring(i,i+2));
j++;
}
return result;
}
总结与要点
综上所述,Byte与Hex互转的核心在于正确处理符号位扩展与长度对齐。在日常开发中,可将上述代码封装为工具类直接复用。关键要点仅两个:转Hex时务必使用“& 0xFF”,转回Byte时注意奇数长度补0。掌握这些要点,即可避免常见错误。
