在加密算法中,经常会遇到将加密后得到的二进制字节数组转16进制字符串后返回;在解密算法中,则需要将字符串转二进制然后解密;下面将列举常用的几种转换方法,在文末会给出几种常用加解密算法示例。

1、二进制数组转十六进制

    /*** 将二进制转成16进制,加密时用(方式之一)** @param bytes 加密得到的二进制字节数组* @return*/public static String parseBytes2Hex(byte[] bytes) {StringBuffer sb = new StringBuffer();for (int i = 0; i < bytes.length; i++) {String hex = Integer.toHexString(bytes[i] & 0xFF);if (hex.length() == 1) {hex = "0" + hex;}sb.append(hex.toUpperCase());}return sb.toString();}

该种方式是需要遍历字节数组,然后进行与运算后转16进制字符串,之后拼接。第二种方式原理上相似,不过采用的是字符格式处理,避免补0操作,更为高效,如下所示:

    /*** 将二进制转为16进制字符串,StringBuilder单线程安全,效率高(推荐)* @param bytes* @return*/public static String toHex(byte[] bytes) {StringBuilder sb = new StringBuilder();for (byte b : bytes) {sb.append(String.format("%02X", b));}return sb.toString();}

2、16进制字符串转二进制数组

    /*** 将16进制串转成二进制数组,用于解密(方式1)** @param hexStr* @return*/public static byte[] parseHexStr2bytes(String hexStr) {if (hexStr.length() < 1) {return null;}byte[] result = new byte[hexStr.length() / 2];for (int i = 0; i < result.length; i++) {int high = Integer.parseInt(hexStr.substring(2 * i, 2 * i + 1), 16);int low = Integer.parseInt(hexStr.substring(2 * i + 1, 2 * i + 2), 16);result[i] = (byte)(high * 16 + low);}return result;}/*** 将16进制字符串转为二进制数据(方式2)** @param strIn* @return* @throws Exception*/public static byte[] hexStr2ByteArr(String strIn) throws Exception {byte[] bytes = strIn.getBytes();int length = bytes.length;byte[] outs = new byte[length / 2];int skip = 2;for (int i = 0; i < length; i = i + skip) {String tmp = new String(bytes, i, 2);outs[i / 2] = (byte)Integer.parseInt(tmp, 16);}return outs;}/*** 16进制加密串转二进制数据(方式3)-推荐*/public static byte[] decodeHex(String encryptedHexString) throws Exception{return Hex.decodeHex(encryptedHexString.toCharArray());}

第一第二种转换方式相当于上述二进制转16进制的逆操作,从写法上和理解上比较难懂。这里推荐第三种方式:该方式是利用commons-codec包中的提供的方法直接进行转换。

下面是AES和BASE64加解密的简单算法示例:

public class EncryptUtils {private static final String CHARSET = "gbk";/*** 不可逆加密算法:MD5* 对称加密算法:AES(更安全)与DES* 加密过程是将得到的二进制字节数据转成16进制并得到字符串** @param str 待加密串* @param key 秘钥* @return 加密后的字符串* @throws Exception*/public static byte[] aesEncrypt(String str, String key) throws Exception {if (str == null || key == null) {return null;}Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(CHARSET), "AES"));byte[] bytes = cipher.doFinal(str.getBytes(CHARSET));return bytes;}/*** 加密得到16进制字符串* @param data* @param password* @return*/public static String encryptToHexString(String data, String password) throws Exception{return toHex(aesEncrypt(data, password));}/*** AES解密* 解密过程是将16进制字符串先转成二进制字节数组,然后执行解密操作** @param str 带解密的字符串* @param key 秘钥* @return 原串*/public static String aesDecrypt(String str, String key) throws Exception {if (str == null || key == null) {return null;}Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes(CHARSET), "AES"));byte[] strBytes = decodeHex(str);byte[] bytes = cipher.doFinal(strBytes);return new String(bytes, CHARSET);}/*** 将二进制转为16进制字符串,StringBuilder单线程安全,效率高(推荐)* @param bytes* @return*/public static String toHex(byte[] bytes) {StringBuilder sb = new StringBuilder();for (byte b : bytes) {sb.append(String.format("%02X", b));}return sb.toString();}/*** 16进制加密串转二进制数据(方式3)-推荐*/public static byte[] decodeHex(String encryptedHexString) throws Exception{return Hex.decodeHex(encryptedHexString.toCharArray());}/*** base64加密,产生的字节位数是8的倍数,不足位“=”填充* <p>base64加解密属于一种编码格式,不是严格意义上的加密算法</p>** @param str* @return*/public static String base64Encrypt(String str) throws Exception {byte[] bytes = str.getBytes(CHARSET);BASE64Encoder base64Encoder = new BASE64Encoder();return base64Encoder.encodeBuffer(bytes);}/*** base64解密,生成字节数组* <p>new String():根据参数是字节数组,解码为对应字符</p>* <p>toString():打印对象,hash码</p>** @param key* @return* @throws Exception*/public static String base64Decrypt(String key) throws Exception {BASE64Decoder base64Decoder = new BASE64Decoder();byte[] bytes = base64Decoder.decodeBuffer(key);return new String(bytes, CHARSET);}public static void main(String[] args) throws Exception {//base64加解密String base64EncryptStr = base64Encrypt("张三");System.out.println(base64EncryptStr);String base64DecryptStr = base64Decrypt(base64EncryptStr);System.out.println(base64DecryptStr);//AES加密,转16进制测试byte[] bytes = aesEncrypt("zhangsan", "*(&^!#$^#@2f%&9$");String hexStr2 = toHex(bytes);System.out.println(hexStr2);//AES解密String decryptStr = aesDecrypt(hexStr2, "*(&^!#$^#@2f%&9$");System.out.println(decryptStr);}
}

二进制字节数组与十六进制字符串间的转换相关推荐

  1. Java中字节数组和十六进制字符串之间的转换

    1. 概述 在本教程中,我们将看看将字节数组转换为十六进制字符串,反之亦然的不同方法. 我们还将了解转换机制并编写我们的实现来实现这一点. 2. 字节和十六进制之间的转换 首先,我们来看看字节和十六进 ...

  2. java二进制 字节数组 字符 十六进制 BCD编码转换

    // 整数到字节数组转换 public static byte[] int2bytes(int n) { byte[] ab = new byte[4]; ab[0] = (byte) (0xff & ...

  3. 如何将字节数组转换为十六进制字符串,反之亦然?

    如何将字节数组转换为十六进制字符串,反之亦然? #1楼 在此不谈很多答案,但我发现十六进制字符串解析器的实现相当理想(比公认的要好约4.5倍),直接实现. 首先,我的测试输出(第一批是我的实现): G ...

  4. 如何在Java中将字节数组转换为十六进制字符串?

    我有一个用十六进制数字填充并打印的字节数组,简单的方法是毫无意义的,因为有许多不可打印的元素. 我需要的是以下形式的确切十六进制代码: 3a5f771c #1楼 最简单的解决方案,没有外部库,没有数字 ...

  5. android byte转16进制字符串,如何将字节数组转换为十六进制字符串,反之亦然?...

    我通过一些粗略的Stopwatch性能测试运行了各种转换方法,一个带有随机句子的运行(n = 61,1000次迭代)和一个带有Project Gutenburg文本的运行(n = 1,238,957, ...

  6. java 打印16进制数组_如何在Java中将字节数组转换为十六进制字符串?

    从这里的讨论,特别是这个答案,这是我目前使用的功能:private final static char[] hexArray = "0123456789ABCDEF".toChar ...

  7. Java byte数组与十六进制字符串互转

    Java byte数组与十六进制字符串互转 博客分类: Java Javajava 十六进制java hex Java 加密解密基础 Java byte数组与十六进制字符串互转 Java BASE64 ...

  8. VB 二进制数组与十六进制字符串相互转换

    1.VB 二进制Byte()数组转换成十六进制字符串函数: Private Function BytesToHex(bytB() As Byte) As String Dim strTmp As St ...

  9. C#中字节数组(byte[])和字符串相互转换

    转换过程主要使用到System.Text.Encoding命名空间下的类 1. 字符串转换成字节数组byte[]: string str = "This is test string&quo ...

最新文章

  1. 吴恩达Deeplearning.ai国庆节上新:生成对抗网络(GAN)专项课程
  2. vsftpd安装及虚拟用户认证
  3. “让技术做好事”,最特殊的创投在大湾区成立
  4. excel常用公式整理
  5. C#中使用Process调取Windows中的进程(应用程序)
  6. 自主招生计算机论文,自主招生
  7. equals()与==的区别
  8. ELECTRA模型精讲
  9. cisco 2960 VLAN MAC_Mac翻译系列软件推荐一:欧路词典 for Mac
  10. 2017.4.24 聪明的质检员 思考记录
  11. php mongo 认证,MongoDB 认证机制升级
  12. 详解MySQL的用户密码过期功能
  13. SQL 2008 FileStream数据类型
  14. gvf snake matlab,GVF Snake 学习的分析总结
  15. OpenCV图像处理专栏六 | 来自何凯明博士的暗通道去雾算法(CVPR 2009最佳论文)
  16. 拼多多商家推广常见问题解答!
  17. 连获国际大奖创下史上第一,这家耳机品牌凭什么与众不同?
  18. 【网络】正向代理和反向代理
  19. 在app中关闭第三方app
  20. php 超出整形范围,频率超出范围怎么办

热门文章

  1. 谁拿了最多奖学金 C++
  2. 生物信息学所需的计算机知识,生物信息学专业计算机课程的探讨
  3. Cannot create PoolableConnectionFactory (Access denied for user ''@'localhost' (using password: YES)
  4. 第八次作业——Excel制作工资表
  5. VirtualBox 安装 Ubuntu16.04服务器版系统
  6. 有赞产品经理一面面试
  7. 腾讯云增强型SSD云硬盘性能方面有哪些特点?
  8. FTP 文件传输协议
  9. FTP:文件传输协议
  10. 计算机视觉中的注意力机制