二進位制和16進位制的轉化與輸出
阿新 • • 發佈:2019-01-30
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; // } }