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

来源:互联网 发布:wamp怎么打开php 编辑:程序博客网 时间:2024/06/06 10:58
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;//}}

原创粉丝点击