二进制和16进制的转化与输出

package sha;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
 * 总结2进制<----->16进制
 * 注释的是sha的部分
 * @author liguobin
 *
 */
public class SHA1 {
	

	public static void main(String[] args) {
		// String string = "hello world";
		// String enString = SHA1.getSha1(string);
		// System.out.println(string + "加密->" + enString.toUpperCase());

		String i = "5F";// 1byte 8位,用16进制表示只占2位 最大128 最小-128 补码最高位是符号位
		System.out.println("16进制:" + i);
		byte[] bytes = toBytes(i);
		StringBuilder stringBuilder = new StringBuilder();
		for (byte b : bytes) {
			System.out.println("二进制01表示字符串:" + byteToBit(b));
			stringBuilder.append(b);
			
			/**
			 * 以字节数组的形式输出二进制01值
			 */
//			byte[] by = getBooleanArray(b);//得到二进制01数组
//			System.out.print("[");
//			int j=0;
//			for(byte bb : by) {
//				j++;
//				if (by.length != j)
//					System.out.print(bb+",");
//				else
//					System.out.print(bb);
//			}
//			System.out.println("]");
		}
		System.out.println("二进制字节数组输出值:" + stringBuilder.toString());
		String ss = null;
		ss = bytes2hex(bytes);
		System.out.println("二进制转化位16进制字符串:"+ss);
	}

	/**
	 * 将16进制转化为二进制
	 * @param str
	 * @return
	 */
	public static byte[] toBytes(String str) {
		if (str == null || str.trim().equals("")) {
			return new byte[0];
		}

		byte[] bytes = new byte[str.length() / 2];
		for (int i = 0; i < str.length() / 2; i++) {
			String subStr = str.substring(i * 2, i * 2 + 2);
			bytes[i] = (byte) Integer.parseInt(subStr, 16);
		}

		return bytes;
	}

	/**
	 * 2进制转16进制
	 */
	private static final String HEX = "0123456789abcdef";

	public static String bytes2hex(byte[] bytes) {
		StringBuilder sb = new StringBuilder(bytes.length * 2);
		for (byte b : bytes) { // 取出这个字节的高4位,然后与0x0f与运算,得到一个0-15之间的数据,通过HEX.charAt(0-15)即为16进制数
			sb.append(HEX.charAt((b >> 4) & 0x0f)); // 取出这个字节的低位,与0x0f与运算,得到一个0-15之间的数据,通过HEX.charAt(0-15)即为16进制数
			sb.append(HEX.charAt(b & 0x0f));
		}

		return sb.toString();
	}

	/**
	 * 把byte转为字符串的bit
	 */
	public static String byteToBit(byte b) {
		return "" + (byte) ((b >> 7) & 0x1) 
				+ (byte) ((b >> 6) & 0x1) 
				+ (byte) ((b >> 5) & 0x1)
				+ (byte) ((b >> 4) & 0x1)
				+ (byte) ((b >> 3) & 0x1) 
				+ (byte) ((b >> 2) & 0x1) 
				+ (byte) ((b >> 1) & 0x1)
				+ (byte) ((b >> 0) & 0x1);
	}

	/**
	 * 将byte转换为一个长度为8的byte数组,数组每个值代表1bit
	 */
	public static byte[] getBooleanArray(byte b) {
		byte[] array = new byte[8];
		for (int i = 7; i >= 0; i--) {
			array[i] = (byte) (b & 1);
			b = (byte) (b >> 1);
		}
		return array;
	}
	
/**
 * 与本文无关。
 */
//	public static String getSha1(String str) {
//		if (null == str || 0 == str.length()) {
//			return null;
//		}
//		char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
//		try {
//			// 得到SHA1的MessageDigest对象
//			MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
//			// 使用输入的字节更新摘要
//			mdTemp.update(str.getBytes("UTF-8"));
//			// 获得加密信息
//			byte[] md = mdTemp.digest();
//
//			int j = md.length;
//			char[] buf = new char[j * 2];
//			int k = 0;
//			// 将字节转化为16进制
//			for (int i = 0; i < j; i++) {
//				byte byte0 = md[i];
//				// hexDigits[byte0 >>> 4 & 0xf] ,byte0无符右移4位,取与获得高四位(<=15),
//				buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
//				// hexDigits[byte0 & 0xf]获取低四位,这也是char str[] = new char[j *
//				// 2];的原因,
//				buf[k++] = hexDigits[byte0 & 0xf];
//			}
//
//			return new String(buf);
//		} catch (NoSuchAlgorithmException e) {
//			e.printStackTrace();
//		} catch (UnsupportedEncodingException e) {
//			e.printStackTrace();
//		}
//		return null;
//	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值