hex字符串与byte数组互转


Toolkit类中的工具方法

package org.sl.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

public class Toolkit {
	public static final File logFile = new File(".", "app_sl.log");
	public static final SimpleDateFormat dateFormat = new SimpleDateFormat("[yyyy/MM/dd HH:mm:ss]");
//	/**
//	 * 8位长的随机码
//	 */
//	static final String secret8 = "Iv}7xlJ^";
	
	
	/**
	 * logger 
	 * @param log 日志内容
	 * @param std 是否向控制台打印
	 */
	public static void logger(String log, boolean std){
		OutputStream out = null;
		String dt = null;
		
		try{
			dt = dateFormat.format(new Date());
			
			if(std) System.out.println(dt+log);
			
			if(logFile.length()>1024*1024*20){
				logFile.delete();
			}
			out = new FileOutputStream(logFile, true);			
			out.write(dt.getBytes());
			out.write(log.getBytes());
			out.write('\n');
			out.flush();
		}catch(Exception ex){			
		}finally{
			try {
				if(null!=out)out.close();
			} catch (Exception e) {			
			}
		}
	}	
		
	/**
	 * logger
	 * @param log
	 */
	public static void logger(String log){		
		logger(log, false);
	}
	
//	/**
//	 * 异或加密	
//	 * @param src
//	 * @return
//	 */
//	public static byte[] xor(byte[] src){
//		byte[] res = new byte[src.length];
//		
//		for(int i=0; i<src.length; i++){
//			res[i] = (byte) (src[i] ^ secret80[i]);
//		}
//		
//		return res;
//	}
	
	/**
	 * 验证摘要与数据一致性
	 * @param digest 摘要
	 * @param src 数据源
	 * @param offset 偏移量
	 * @param len 数据源长度
	 * @return true:一致,false:不一致
	 */
	public static boolean checkDigest(byte[] digest, byte[] src, int offset, int len){
		boolean ok = false;
		final int secret_size = 8;
		byte[] sign = new byte[secret_size+16];		
		
		try{
			System.arraycopy(digest, 0, sign, 0, secret_size);
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			md5.update(digest,0,secret_size);
			md5.update(src,offset,len);
			md5.digest(sign,secret_size,sign.length-secret_size);
			ok = Toolkit.bytes2Hex(digest).equals(Toolkit.bytes2Hex(sign));
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
		return ok;
	}
	
	/**
	 * 生成包含8位随机码+16位MD5的消息摘要
	 * @param src 数据源
	 * @param offset 偏移量
	 * @param len 长度
	 * @return 如果执行成功则返回8+16位的字节摘要,否则返回null
	 */
	public static byte[] digest(byte[] src, int offset, int len){
		final int secret_size = 8;
		byte[] secret = new byte[secret_size];
		byte[] sign = new byte[secret_size+16];		
		new Random().nextBytes(secret);		
		
		try{
			System.arraycopy(secret, 0, sign, 0, secret_size);
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			md5.update(secret);
			md5.update(src,offset,len);
			md5.digest(sign,secret_size,sign.length-secret_size);
		}catch(Exception ex){
			ex.printStackTrace();
			sign = null;
		}
		
		return sign;
	}
	
	/**
	 * hex字符串转byte数组<br/>
	 * 2个hex转为一个byte
	 * @param src
	 * @return
	 */
	public static byte[] hex2Bytes1(String src){
		byte[] res = new byte[src.length()/2];
		char[] chs = src.toCharArray();
		int[] b = new int[2];

		for(int i=0,c=0; i<chs.length; i+=2,c++){			
			for(int j=0; j<2; j++){
				if(chs[i+j]>='0' && chs[i+j]<='9'){
					b[j] = (chs[i+j]-'0');
				}else if(chs[i+j]>='A' && chs[i+j]<='F'){
					b[j] = (chs[i+j]-'A'+10);
				}else if(chs[i+j]>='a' && chs[i+j]<='f'){
					b[j] = (chs[i+j]-'a'+10);
				}
			} 
			
			b[0] = (b[0]&0x0f)<<4;
			b[1] = (b[1]&0x0f);
			res[c] = (byte) (b[0] | b[1]);
		}
		
		return res;
	}
	
	/**
	 * hex字符串转byte数组<br/>
	 * 2个hex转为一个byte
	 * @param src
	 * @return
	 */
	public static byte[] hex2Bytes(String src){
		byte[] res = new byte[src.length()/2];		
		char[] chs = src.toCharArray();
		for(int i=0,c=0; i<chs.length; i+=2,c++){
			res[c] = (byte) (Integer.parseInt(new String(chs,i,2), 16));
		}
		
		return res;
	}
	
	/**
	 * byte数组转hex字符串<br/>
	 * 一个byte转为2个hex字符
	 * @param src
	 * @return
	 */
	public static String bytes2Hex(byte[] src){       
        char[] res = new char[src.length*2];  
        final char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};  
        for(int i=0,j=0; i<src.length; i++){  
            res[j++] = hexDigits[src[i] >>>4 & 0x0f];  
            res[j++] = hexDigits[src[i] & 0x0f];  
        }  
          
        return new String(res);  
    } 
	
	/**
	 * 生成安全签字
	 * @param src
	 * @return
	 */
	public static String signature(String src){
		final String secret8 = "Iv}7xlJ^";
		return sha1Hex(secret8+src); 
	}
	
	/**
	 * 返回16进制sha-1加密后信息
	 * @param btInput
	 * @return
	 */
	public static String sha1Hex(byte[] btInput){
		final char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
		try {
			MessageDigest mdInst = MessageDigest.getInstance("SHA-1");
			mdInst.update(btInput);
			byte[] md = mdInst.digest();
			// 把密文转换成十六进制的字符串形式
            int j = md.length;
            char str[] = new char[j * 2];
            
            for (int i=0,k=0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            
            return new String(str);            
		} catch (Exception e) {		
			return "";
		}
	}
	
	/**
	 * 返回16进制sha-1加密后信息
	 * @param src
	 * @return
	 */
	public static String sha1Hex(String src){
		return sha1Hex(src.getBytes());
	}	
}


测试类:

      static void t16(){
		byte[] src = new byte[1024];
		new Random().nextBytes(src);
		byte[] digest = digest(src,0,src.length);
//		digest[3]='2';
		System.out.println(checkDigest(digest, src,0,src.length));
	}

      static void t15(){
		byte[] src = new byte[10];
		new Random().nextBytes(src);
//		byte[] src = "12345qwert".getBytes();
		for(byte b: src){
			System.out.print((byte)b+" ");
		}
		System.out.println("----src---");
		String hex = Toolkit.bytes2Hex(src);
		System.out.println(hex);
		
		src = Toolkit.hex2Bytes1(hex);
		for(byte b: src){
			System.out.print(b+" ");
		}
		System.out.println("----src---");
		hex = Toolkit.bytes2Hex(src);
		System.out.println(hex);
		
		src = Toolkit.hex2Bytes1(hex);
		for(byte b: src){
			System.out.print(b+" ");
		}
		System.out.println("----src---");
	}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值