在 Apache Commons Codec 中提供了 Hex 工具类,该类用来转换十六进制字符串。可以设置用于某些操作的字符集,默认值在DEFAULT_CHARSET_NAME中设置。此类是线程安全的。
static Charset DEFAULT_CHARSET:默认字符集是 StandardCharsets.UTF_8。
static String DEFAULT_CHARSET_NAME:默认字符集名称为 CharEncoding.UTF_8。
Hex() 使用默认字符集名称 DEFAULT_CHARSET 创建一个新的编解码器
Hex(Charset charset) 使用给定的字符集创建一个新的编解码器
Hex(String charsetName) 使用给定的字符集名称创建一个新的编解码器
(1)使用 Hex 类的静态方法 encodeHexString() 和 decodeHex() 实现十六进制编码和解码。
import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; import java.nio.ByteBuffer; public class HexDemo { public static void main(String[] args) { byte[] bytes = "Hello World".getBytes(); String hexStr = "48656c6c6f20576f726c64"; // 创建字符数组 char[] chars = new char[hexStr.length()]; for(int i = 0; i < hexStr.length(); i++) { chars[i] = hexStr.charAt(i); } System.out.println("encodeHexString字节数组:" + Hex.encodeHexString(bytes)); System.out.println("encodeHexString字节数组:" + Hex.encodeHexString(bytes, false)); System.out.println("ByteBuffer参数:" + Hex.encodeHexString(ByteBuffer.wrap(bytes))); System.out.println("ByteBuffer参数:" + Hex.encodeHexString(ByteBuffer.wrap(bytes), false)); try { // 解析 System.out.println("decodeHex字符串参数:" + new String(Hex.decodeHex(hexStr))); System.out.println("decodeHex字符数组参数:" + new String(Hex.decodeHex(chars))); } catch (DecoderException e) { e.printStackTrace(); } } }
输出结果:
encodeHexString字节数组:48656c6c6f20576f726c64 encodeHexString字节数组:48656C6C6F20576F726C64 ByteBuffer参数:48656c6c6f20576f726c64 ByteBuffer参数:48656C6C6F20576F726C64 decodeHex字符串参数:Hello World decodeHex字符数组参数:Hello World
(2)使用 Hex 的实例方法 encode() 和 decode() 实现十六进制编码和解码。
import org.apache.commons.codec.binary.Hex; import java.nio.ByteBuffer; public class HexDemo2 { public static void main(String[] args) throws Exception { Hex hex = new Hex(); String str = "hello"; String hexStr = "68656c6c6f"; // 将 “hello” 字符串字节数组使用十六进制表示 byte[] bytes = hex.encode(str.getBytes()); System.out.println(new String(bytes)); // 68656c6c6f // 将 “hello” 字符串字节数组使用十六进制表示 ByteBuffer byteBuffer = ByteBuffer.allocate(str.getBytes().length); byteBuffer.put(str.getBytes()); byteBuffer.flip(); byte[] bytes2 = hex.encode(byteBuffer); System.out.println(new String(bytes2)); // 将十六进制字符串解析成字节数组 byte[] result = hex.decode(hexStr.getBytes()); System.out.println(new String(result)); // hello // 将十六进制字符串解析成字节数组 ByteBuffer byteBuffer1 = ByteBuffer.allocate(hexStr.getBytes().length); byteBuffer1.put(hexStr.getBytes()); byteBuffer1.flip(); byte[] result2 = hex.decode(byteBuffer1); System.out.println(new String(result2)); } }
输出结果:
68656c6c6f 68656c6c6f hello hello
(3)利用 Hex 类的 encodeHex() 和 decodeHex() 方法实现十六进制编码和解码。
import org.apache.commons.codec.binary.Hex; public class HexDemo3 { public static void main(String[] args) throws Exception { String str = "hello"; String hexStr = "68656c6c6f"; // 将 “hello” 字符串字节数组使用十六进制表示 System.out.println(new String(Hex.encodeHex(str.getBytes()))); // 将 “hello” 字符串字节数组使用十六进制表示 System.out.println(new String(Hex.decodeHex(hexStr.toCharArray()))); } }
输出结果:
68656c6c6f hello
查看 Hex 类的详细用法,请参考官网 API 文档,地址如下:
http://commons.apache.org/proper/commons-codec/apidocs/index.html