MD5加密与byte[]数组与十六进制字符串与字符串的互相转换

本文分享了如何在Java中进行MD5加密,并详细阐述了byte[]数组与十六进制字符串以及普通字符串之间的转换方法。提供了源码链接供读者深入研究。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


概括为三种方式:
方式一:Integer.toHexString(int)   对应的是: Integer.parseInt(String, int)或者Integer.valueOf(String, int)
方式二:位运算(&  与  |)
方式三:算术运算

package com.example.md5utils;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.xml.sax.Parser;


public class MD5Utils {
 
 private static final int RADIX_16 = 16;//16进制
 public static String HASH_ALGORITHM = "MD5";
 
 public static String generate(String str) {
  byte[] md5 = getMD5(str.getBytes());
  BigInteger abs = new BigInteger(md5).abs();
  return abs.toString(Character.MAX_RADIX);
 }
 
 /**
  * 方式一:<br>
  * byte[] or byte转换16进制字符串<br>
  * 使用Integer.toHexString(int)
  * @param str
  * @return
  */
 public static String hexString(String str) {
  StringBuilder sb = new StringBuilder();
  byte[] md5 = getMD5(str.getBytes());
  for (int i = 0; i < md5.length; i++) {
   int temp = md5[i] & 0Xff;
   String hexString = Integer.toHexString(temp);
   if (hexString.length() < 2) {
    sb.append("0").append(hexString);
   } else {
    sb.append(hexString);
   }
  }
  return sb.toString();
 }
 
 /**
  * 方式二:<br>
  * byte[] or byte转换16进制字符串<br>
  * 使用Integer.toHexString(int)
  * @param str
  * @return
  */
 public static String hexString2(String str) {
// char[] chars = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  char[] chars = "0123456789ABCDEF".toCharArray();
  StringBuilder sb = new StringBuilder();
  byte[] md5 = getMD5(str.getBytes());
  for (int i = 0; i < md5.length; i++) {
   int heigh = (md5[i] & 0xF0)>>4;//高位值
   sb.append(chars[heigh]);//高位值对应的代表符号
   int low = (md5[i] & 0x0F);//低位值
   sb.append(chars[low]);//低位值对应的代表符号
  }
  return sb.toString();
 }
 
 /**
  * 方式三:<br>
  * byte[] or byte转换16进制字符串<br>
  * 使用Integer.toHexString(int)
  * @param str
  * @return
  */
 public static String hexString3(String str) {
  char[] chars = "0123456789ABCDEF".toCharArray();
  StringBuilder sb = new StringBuilder();
  byte[] md5 = getMD5(str.getBytes());
  for (int i = 0; i < md5.length; i++) {
   int temp = md5[i];//byte 8位 int 4字节 32位 小—>大 可以直接复制
   if (temp < 0) {//负数转换成int中正数
    temp =temp + 256;//byte的字节,8位,范围[-127~128],跨度256
   }
   int heigh = temp / 16;//高位值
   int low = temp % 16;//低位值
   sb.append(chars[heigh]);//高位值对应的代表符号
   sb.append(chars[low]);//低位值对应的代表符号
  }
  return sb.toString();
 }
 
 /**
  * 16进制字符串转成byte[] or byte </br>
  * 根据byte 8位 与16进制 4位关系,需要2个16进制字符组成一个byte
  * @param hex
  * @return
  */
 public static byte[] byteFormHex(String hex) {
  byte[] bytes = new byte[hex.length()/2];
  for (int i = 0; i < bytes.length; i++) {
   //16进制字符转换成int->位运算(取int(32位)低8位,即位与运算 &0xFF)->强转成byte
   bytes[i] = (byte) (0xFF & Integer.parseInt(hex.substring(i*2, i*2+2), RADIX_16));
  }
  return bytes;
 }
 
 /**
  * 16进制字符串转成byte[] or byte </br>
  * 根据byte 8位 与16进制 4位关系,需要2个16进制字符组成一个byte
  * @param hex
  * @return
  */
 public static byte[] byteFormHex2(String hex) {
  int length = hex.length()/2;
  char[] chars = hex.toCharArray();
  byte[] bytes = new byte[length];
  for (int i = 0; i < length; i++) {
   int position = i*2;
   //charToByte(chars[position])<<4 高位
   //charToByte(chars[position+1]) 低位
   //高位与低位进行或运算—>组成byte
   bytes[i] = (byte) (charToByte(chars[position])<<4 | charToByte(chars[position+1]));
  }
  return bytes;
 }
 
 /**
  * 16进制字符串转成byte[] or byte </br>
  * 根据byte 8位 与16进制 4位关系,需要2个16进制字符组成一个byte
  * @param hex
  * @return
  */
 public static byte[] byteFormHex3(String hex) {
  int length = hex.length()/2;
  char[] chars = hex.toCharArray();
  byte[] bytes = new byte[length];
  for (int i = 0; i < length; i++) {
   int position = i*2;
   //算术运算方式
   int temp = charToByte(chars[position])*16;
   temp = temp + charToByte(chars[position+1]);
   bytes[i] = (byte) (0xFF & temp);//取低8位
  }
  return bytes;
 }
 
 /**
  * 字符转成byte
  * @param c
  * @return
  */
 private static byte charToByte(char c) {
  String radix16Symbol = "0123456789ABCDEF";//16进制代表符号
  //获取Char的索引值,即是该字符的值,直接转成byte,该值(int类型)此时不会超过byte类型范围
  return (byte) radix16Symbol.indexOf(c);
 }
 
 private static byte[] getMD5(byte[] bytes) {
  byte[] tmp = null;
  try {
   MessageDigest digest = MessageDigest.getInstance(HASH_ALGORITHM);
   digest.update(bytes);
   tmp = digest.digest();
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  }
  return tmp;
 }
}


 

源码链接:http://download.youkuaiyun.com/detail/dennisruan/9491955

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值