import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
/**
* 编码工具类,包括: <br>
* 1)MD5/SHA编码 <br>
* 2)Base64编码 <br>
* 3)DES/ThreeDES编码 <br>
* 4)GBK/UTF-8/ISO-8859-1/UNICODE转换 <br>
*/
public class CoderUtil
{
public static final String ALGORITHM_MD5 = "MD5";
/**
* MD5 编码,返回本地编码字符串
*
* @param src 源串
* @param encoding 编码
* @return 目标串
*/
public static String md5Encoder(String src, String encoding)
{
if (src == null)
return null;
byte[] destBytes = md5EncoderByte(src, encoding);
String dest = "";
for (int i = 0; i < 16; i++)
{
dest += byteToHEX(destBytes[i]);
}
return dest;
}
/**
* MD5 编码,返回本地编码字符串
*
* @param src 源串 默认使用UTF-8编码
* @return 目标串
*/
public static String md5Encoder(String src)
{
return md5Encoder(src, "UTF-8");
}
/**
* MD5编码,返回byte数组,本地编码
*
* @param src 源串 默认使用UTF-8编码
* @return 目标编码
*/
public static byte[] md5EncoderByte(String src)
{
return md5EncoderByte(src, "UTF-8");
}
/**
* MD5编码,返回byte数组
*
* @param src 源串
* @param encoding 编码
* @return 目标编码
*/
public static byte[] md5EncoderByte(String src, String encoding)
{
if (src == null)
return null;
try
{
if (encoding == null)
return md5EncoderByte(src.getBytes());
else
return md5EncoderByte(src.getBytes(encoding));
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
return null;
}
}
/**
* MD5编码,返回byte数组
*
* @param buf 源byte数组
* @return 目标编码
*/
public static byte[] md5EncoderByte(byte[] buf)
{
if (buf == null)
return null;
try
{
MessageDigest md5Temp = MessageDigest.getInstance(ALGORITHM_MD5);
return md5Temp.digest(buf);
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
/**
* Base64 编码
*
* @param src 源串
* @return 目标串
*/
public static String base64Encode(String src)
{
if (src == null)
return null;
return base64Encode(src.getBytes());
}
/**
* Base64 编码
*
* @param src 源串
* @return 目标串
*/
public static String base64Encode(byte[] src)
{
if (src == null)
return null;
return new String(Base64.encodeBase64(src));
}
/**
* Base64 编码
*
* @param src 源串
* @return 目标串
*/
public static String base64Encode(String src, String encoding)
{
if (src == null)
return null;
try
{
byte[] dest = Base64.encodeBase64(src.getBytes(encoding));
return new String(dest, encoding);
}
catch (UnsupportedEncodingException e)
{
throw new IllegalArgumentException(e);
}
}
/**
* Base64 解码
*
* @param dest 目标串
* @return 源编码
*/
public static byte[] base64DecodeBytes(String dest)
{
if (dest == null)
return null;
return Base64.decodeBase64(dest.getBytes());
}
/**
* Base64 解码
*
* @param dest 目标串
* @return 源串
*/
public static String base64Decode(String dest)
{
if (dest == null)
return null;
byte[] b = Base64.decodeBase64(dest.getBytes());
return new String(b);
}
/**
* Base64 解码
*
* @param dest 目标串
* @return 源串
*/
public static String base64Decode(String dest, String encoding)
{
if (dest == null)
return null;
try
{
byte[] b = Base64.decodeBase64(dest.getBytes(encoding));
return new String(b, encoding);
}
catch (UnsupportedEncodingException e)
{
throw new IllegalArgumentException(e);
}
}
/**
* Base64 解码
*
* @param dest 目标串
* @return 源编码
*/
public static byte[] base64DecodeBytes(String dest, String encoding)
{
if (dest == null)
return null;
try
{
return Base64.decodeBase64(dest.getBytes(encoding));
}
catch (UnsupportedEncodingException e)
{
throw new IllegalArgumentException(e);
}
}
/**
* 把字节转换为16进制字符
*
* @param ib
* @return
*/
public static String byteToHEX(byte ib)
{
char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char [] ob = new char[2];
ob[0] = Digit[(ib >>> 4) & 0X0F];
ob[1] = Digit[ib & 0x0F];
String s = new String(ob);
return s;
}
/**
* 给定一个url,和key,取得value
* 此方法仅供参考,不作解释
* @param url
* @param key
* @return String 给定一个url,和key,取得value
*/
public static String getURLValue(String url,String key)
{
if(isEmpty(url) || isEmpty(key))
return "";
int p = url.indexOf("?");
if (p != -1)
url = url.substring(p);
if (!url.startsWith("?"))
url = "?" + url;
int index = url.indexOf(key);
if(index == -1)
return "";
if ((url.charAt(index-1) != '?' && url.charAt(index-1) != '&')
|| index+key.length()>=url.length() || url.charAt(index+key.length()) != '=')
return "";
int point = index + key.length();
int valueIndex = url.indexOf('&',point);
if (valueIndex == -1)
return url.substring(point+1,url.length());
return url.substring(point+1,valueIndex);
}
/** 检查字符串是否为空 */
private static boolean isEmpty(String s)
{
return ((s == null) || (s.trim().length() == 0));
}
/**
* 读取XML中字段的值,允许没有field时返回空字符串
* 此方法仅供参考,不作解释
* @param xml XML字符串
* @param field 字段名
* @return 返回XML中字段中的值
* @throws Exception 如果字段内容不符合要求,则抛出此异常
*/
public static String getXmlField(String xml, String field) throws Exception
{
if (xml.length() < field.length() * 2 + 5)
{
throw new Exception("xml tag #"+field+"# format error");
}
String lField = "<"+field+">";
String rField = "</"+field+">";
int iLeft = xml.indexOf(lField);
int iRight = xml.indexOf(rField);
if (iLeft == -1 && iRight == -1)
return "";
if ((iLeft == -1 && iRight != -1) || (iLeft != -1 && iRight == -1))
{
throw new Exception("xml tag #"+field+"# format error");
}
int valueLen = iRight - iLeft - lField.length();
if (valueLen <= 0)
return "";
return xml.substring(iLeft + lField.length(), iRight);
}
/**
* 读取XML中字段的int值
* 此方法仅供参考,不作解释
* @param xml XML字符串
* @param field 字段名
* @return int 返回XML中字段中的int值
* @throws Exception 如果字段不是int或格式不正确,则抛出此异常
*/
public static int getXmlFieldInt(String xml, String field) throws Exception
{
if (xml.length() < field.length() * 2 + 5)
{
throw new Exception("xml tag #"+field+"# format error");
}
String lField = "<"+field+">";
String rField = "</"+field+">";
int iLeft = xml.indexOf(lField);
int iRight = xml.indexOf(rField);
if (iLeft == -1 || iRight == -1)
{
throw new Exception("xml tag #"+field+"# format error");
}
int valueLen = iRight - iLeft;
if (valueLen < 1)//nubmer不允许为空
{
throw new Exception("xml tag #"+field+"# format error");
}
String valueInt = xml.substring(iLeft + lField.length(), iRight);
if (!isInteger(valueInt))
{
throw new Exception("xml tag #"+field+"# format error");
}
return Integer.parseInt(valueInt);
}
/** 检查是否是整型 */
private static boolean isInteger(String s)
{
if (isEmpty(s))
return false;
// 逐个检查,如果出现一个字符不是数字则返回false
for (int i = 0; i < s.length(); i++)
{
if ("0123456789".indexOf(s.charAt(i)) == -1)
return false;
}
return true;
}
}