进制转换

java语言中各种进制和ASCII乱转,硬件通信中常用

Posted by tianhaoo on July 3, 2020 本文阅读量

最近被java里面的进制转换搞得头大,先贴四个函数,具体的以后整理




    /**
     * @return 二进制数组转换为二进制字符串   2-2
     */
    public static String bytes2BinStr(byte[] bArray){

        String outStr = "";
        int pos = 0;
        for(byte b:bArray){
            //高四位
            pos = (b&0xF0)>>4;
            outStr+=binaryArray[pos];
            //低四位
            pos=b&0x0F;
            outStr+=binaryArray[pos];
        }
        return outStr;
    }

    /**
     * @return 将二进制数组转换为十六进制字符串  2-16
     */
    public static String bin2HexStr(byte[] bytes){

        String result = "";
        String hex = "";
        for(int i=0;i<bytes.length;i++){
            //字节高4位
            hex = String.valueOf(hexStr.charAt((bytes[i]&0xF0)>>4));
            //字节低4位
            hex += String.valueOf(hexStr.charAt(bytes[i]&0x0F));
            result +=hex;  //+" "
        }
        return result;
    }

    /**
     * @return 将十六进制转换为二进制字节数组   16-2
     */
    public static byte[] hexStr2BinArr(String hexString){
        //hexString的长度对2取整,作为bytes的长度
        int len = hexString.length()/2;
        byte[] bytes = new byte[len];
        byte high = 0;//字节高四位
        byte low = 0;//字节低四位
        for(int i=0;i<len;i++){
            //右移四位得到高位
            high = (byte)((hexStr.indexOf(hexString.charAt(2*i)))<<4);
            low = (byte)hexStr.indexOf(hexString.charAt(2*i+1));
            bytes[i] = (byte) (high|low);//高地位做或运算
        }
        return bytes;
    }

    /**
     * @return 将十六进制转换为二进制字符串   16-2
     */
    public static String hexStr2BinStr(String hexString){
        return bytes2BinStr(hexStr2BinArr(hexString));
    }

    // 接受一个192位的二进制字符串,调整一下高低位的顺序
    // 每八位反转一下
    public static String modifyOrder(String str){
        // System.out.println("#############before" + str);
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<24; i++){
            String reverse = new StringBuffer(str.substring(i*8, i*8+8)).reverse().toString();
            sb.append(reverse);
        }
        //System.out.println("#############afterr" + sb.toString());
        return sb.toString();
    }


    // 16进制转化成ASCII码
    public static String convertHexToString(String hex) {
        if(hex == null){
            return "";
        }
        hex = hex.trim();
        StringBuilder sb = new StringBuilder();
        StringBuilder temp = new StringBuilder();
        // 564e3a322d302e312e34 split into two characters 56, 4e, 3a...
        for (int i = 0; i < hex.length() - 1; i += 2) {
            // grab the hex in pairs
            String output = hex.substring(i, (i + 2));
            // convert hex to decimal
            int decimal = Integer.parseInt(output, 16);
            // convert the decimal to character
            sb.append((char) decimal);
            temp.append(decimal);
        }
        // System.out.println(sb.toString());
        return sb.toString().trim();
    }


(之前博客里的话 一语成谶

一旦走上了编程之路,如果你不把编码问题搞清楚,那么它一定会像幽灵一般纠缠着你整个职业生涯,各种灵异事件会接踵而来,挥之不去。只有发挥程序员死磕到底的精神你才有可能彻底摆脱编码问题带来的烦恼。

https://tianhaoo.github.io/2019/04/04/%E7%BC%96%E7%A8%8B%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98/

害!