1. 程式人生 > >二進位制和16進位制的轉化與輸出

二進位制和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;
//	}
}