Java如何实现与xxd -r -p加openssl base64命令相同的转换效果
实现逻辑说明
先拆解原终端命令的执行步骤,对应Java操作如下:
- 第一步:把输入的带冒号分隔的十六进制字符串中的所有冒号删除,得到连续的纯十六进制字符序列
- 第二步:将纯十六进制序列转换为对应的二进制字节数组
- 第三步:对字节数组执行标准Base64编码,得到最终结果
Java 8+ 原生实现(无第三方依赖)
不需要引入任何外部包,直接用JDK自带工具类即可实现:
import java.util.Base64; public class HexToBase64Converter { public static void main(String[] args) { // 原输入的带冒号的十六进制字符串 String inputHex = "E4:C8:C1:51:1A:58:1E:A6:0A:DF:E0:59:CA:4E:60:66:0B:36:0F:24:EA:76:93:39:61:F7:79:60:B2:2F:DE:B6"; // 移除所有冒号,得到纯十六进制字符串 String pureHex = inputHex.replaceAll(":", ""); // 十六进制字符串转二进制字节数组 byte[] byteArray = hexStringToByteArray(pureHex); // 标准Base64编码得到结果 String result = Base64.getEncoder().encodeToString(byteArray); // 输出结果:5MjBURpYHqYK3+BZyk5gZgs2DyTqdpM5Yfd5YLIv3rY= System.out.println(result); } // 十六进制转字节数组工具方法,兼容大小写十六进制字符 private static byte[] hexStringToByteArray(String hex) { int len = hex.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + Character.digit(hex.charAt(i+1), 16)); } return data; } }
可选:Apache Commons Codec简化实现
如果项目已经引入了Commons Codec工具包,可以省略手写十六进制转换方法:
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Hex; public class HexToBase64Converter { public static void main(String[] args) throws Exception { String inputHex = "E4:C8:C1:51:1A:58:1E:A6:0A:DF:E0:59:CA:4E:60:66:0B:36:0F:24:EA:76:93:39:61:F7:79:60:B2:2F:DE:B6"; String pureHex = inputHex.replaceAll(":", ""); byte[] byteArray = Hex.decodeHex(pureHex); String result = Base64.encodeBase64String(byteArray); System.out.println(result); } }
注意事项
不要使用Base64.getUrlEncoder()进行编码,该方法生成的是URL安全格式的Base64,会把+替换为-、/替换为_,和openssl的输出结果不一致。
内容的提问来源于stack exchange,提问作者Oreoluwa
相关产品推荐
相关产品推荐

