zoukankan      html  css  js  c++  java
  • Java实现进制之间转换的工具类

    自己日常开发时遇到此类进制数据转换问题,总是要google回顾一下,麻烦又挺浪费时间的(我这人比较懒,哈哈哈哈~),所以临时起意,总结归纳一下进制之间互转换的方法,方便以后开发查找;
    目前归纳的转换方法并不多,以后会继续补充更新!
    不多啰嗦,代码如下:
    package com.sbp.util;
    
    import java.math.BigInteger;
    
    
    /*import org.junit.Test;*/
    
    /**
     * @Description 数据格式处理、转换
     * @author Liangjw
     * @date: 2021年3月13日 下午2:07:23
     * @version 1.0
     */
    public class DataTransform {
    
        /**
         * 将十六进制的字符串转换成字节数组
         * @param hexString
         * @return
         */
        public static byte[] hexStrToBinaryStr(String hexString) {
            if (hexString == null || "".equals(hexString)) {
                return null;
            }
            hexString = hexString.replaceAll(" ", "");
     
            int len = hexString.length();
            int index = 0;
     
            byte[] bytes = new byte[len / 2];
     
            while (index < len) {
                String sub = hexString.substring(index, index + 2);
                bytes[index/2] = (byte)Integer.parseInt(sub,16);
                index += 2;
            }
            return bytes;
        }
        
        /**
        * @function 将16进制的字符串转换为16进制int数组
        * @author Liangjw
        * @time 2021年4月8日16:53:45
        * @param hexString 16进制的字符串
        * @return 返回int数组
        */
        public static int[] hexStrToHexIntArray(String hexString) {
            hexString = hexString.replace(" ", "");
            // 如果长度不是偶数,就在后面添加空格
            if ((hexString.length() % 2) != 0) {
                hexString += " ";
            }
            // 定义一个数组,长度是待转换数组长度的一半
            int[] returnBytes = new int[hexString.length() / 2];
            for (int i = 0; i < returnBytes.length; i++) {
                returnBytes[i] = (0xff & Integer.parseInt(hexString.substring(i * 2, i * 2 + 2), 16));
            }
            return returnBytes;
        }
        
        /**
         * 将字节数组转换成十六进制的字符串
         * @return
         */
        public static String binaryToHexString(byte[] bytes) {
            String hexStr = "0123456789ABCDEF";
            String result = "";
            String hex = "";
            for (byte b : bytes) {
                hex = String.valueOf(hexStr.charAt((b & 0xF0) >> 4));
                hex += String.valueOf(hexStr.charAt(b & 0x0F));
                result += hex + " ";
            }
            return result;
        }
        
        /**
         * @function 将十六进制的字符串转换成二进制的字符串
         * @author Liangjw
         * @time 2021年4月1日17:38:36
         * @param hexString 16进制字符串
         * @return  4位二进制字符串
         */
        public static String hexStrToBinaryStr2(String hexString) {
     
            if (hexString == null || hexString.equals("")) {
                return null;
            }
            StringBuffer sb = new StringBuffer();
            // 将每一个十六进制字符分别转换成一个四位的二进制字符
            for (int i = 0; i < hexString.length(); i++) {
                String indexStr = hexString.substring(i, i + 1);
                String binaryStr = Integer.toBinaryString(Integer.parseInt(indexStr, 16));
                while (binaryStr.length() < 4) {
                    binaryStr = "0" + binaryStr;
                }
                sb.append(binaryStr);
            }
            return sb.toString();
        }
        
        /**
         * @function 二进制字符串转换为十六进制字符串
         * @author Liangjw
         * @time 2021年4月1日17:39:34
         * 二进制字符串位数必须满足是4的倍数
         * 
         * @param binaryStr 四位的二进制字符串
         * @return 一位的十六进制字符串
         */
        public static String binaryStrToHexStr(String binaryStr) {
     
            if (binaryStr == null || binaryStr.equals("") || binaryStr.length() % 4 != 0) {
                return null;
            }
     
            StringBuffer sbs = new StringBuffer();
            // 二进制字符串是4的倍数,所以四位二进制转换成一位十六进制
            for (int i = 0; i < binaryStr.length() / 4; i++) {
                String subStr = binaryStr.substring(i * 4, i * 4 + 4);
                String hexStr = Integer.toHexString(Integer.parseInt(subStr, 2));
                sbs.append(hexStr);
            }
     
            return sbs.toString();
        }
        
        /**
         * @function 十六进制转负数
         * @author Liangjw
         * @time 2021年4月8日17:16:48
         * @param num
         */
        public static String parseHex8(String num) {
            if (num.length() != 8) {
                throw new NumberFormatException("Wrong length: " + num.length() + ", must be 4.");
            }
            BigInteger in = new BigInteger(num,16);
            double in2 = in.doubleValue();
            return in2+"";
        }
        
        /**
         * @function 整数二进制相加
         * @author Liangjw
         * @time 2021年4月8日17:17:39
         * @param b1
         * @param b2
         */
        public static String add(String b1, String b2) {
              int len1 = b1.length();
              int len2 = b2.length();
              String s1 = b1;
              String s2 = b2;
              StringBuffer sb1 = new StringBuffer();
              //先将位数较少的二进制高位补零
              if(len1 > len2) {
                  for(int i = 0; i < (len1 - len2); i++) {
                      sb1.append(0);
                  }
                  sb1.append(b2);
                  s1 = b1;
                  s2 = sb1.toString();
              } else if(len1 < len2) {
                  for(int j = 0; j < (len2 - len1); j++) {
                      sb1.append(0);
                  }
                  sb1.append(b1);
                  s1 = sb1.toString();
                  s2 = b2;
              }
              //进位
              int flag = 0;
              StringBuffer sb2 = new StringBuffer();
              for(int z = s1.length() - 1; z >= 0; z--) {
                  //字符’0’的对应的ASCII十进制是48
                  //分情况判断
                  if((s1.charAt(z) - 48) == 0 && (s2.charAt(z) - 48) == 0) {
                      sb2.append(flag);
                      flag = 0;
                      continue;
                  }
                  if(((s1.charAt(z) - 48) == 0 && (s2.charAt(z) - 48) == 1 && flag == 0) || ((s1.charAt(z) - 48) == 1 && (s2.charAt(z) - 48) == 0 && flag == 0)) {
                      sb2.append(1);
                      flag = 0;
                      continue;
                  }
                  if(((s1.charAt(z) - 48) == 0 && (s2.charAt(z) - 48) == 1 && flag == 1) || ((s1.charAt(z) - 48) == 1 && (s2.charAt(z) - 48) == 0 && flag == 1)) {
                      sb2.append(0);
                      flag = 1;
                      continue;
                  }
                  if((s1.charAt(z) - 48) == 1 && (s2.charAt(z) - 48) == 1 && flag == 0) {
                      sb2.append(0);
                      flag = 1;
                      continue;
                  }
                  if((s1.charAt(z) - 48) == 1 && (s2.charAt(z) - 48) == 1 && flag == 1) {
                      sb2.append(1);
                      flag = 1;
                  }
                  
              }
              if(flag == 1) {
                  sb2.append(flag);
              }
              //倒置
              sb2.reverse();
              return sb2.toString();
              
          }
        
        /**
          * 
          * @function 除首位(符号位)之外,二进制取反
          * 注:函数实现过程,如果是负数,则先把符号位转为0,当做正数处理
          * @author Liangjw
          * @date 2021年4月2日下午6:42:18  
          * @param hex2
          * @return
          * String
         */
        public static String reverseHex2(String hex2) {
            //除了符号位,其余取反
            String hex2_firstChar = hex2.substring(0, 1);
            if("1".equals(hex2_firstChar)) { //如果符号位为1,表示是负数,那么先把符号位转为0,当做正数处理,注:后台返回值时在前面加上“-”负号便可
                hex2_firstChar = "0";
            }
            hex2 = hex2.substring(1,hex2.length());
            String hex2_temp = "";
            for (int i = 0; i < hex2.length(); i++) {
                if('0' == hex2.charAt(i)) {
                    hex2_temp = hex2_temp + "1";
                }else {
                    hex2_temp = hex2_temp + "0";
                }
            }
            return hex2_firstChar + hex2_temp;//返回:符号位+其余取反位
        }    
        
        /*@Test
        public static void main(String[] args) {
            String opera = DataTransform.hexStrToBinaryStr2("FF1DE66C".substring(0, 1)).substring(0, 1);
            System.out.println("二进制字符首位字符:" + opera);
            System.out.println("十六进制字符转成二进制字符:" + hexStrToBinaryStr2("FF1DE66C"));
            System.out.println("8位的十六进制字符分别转换成10进制字符:" + parseHex8("FF1DE66C"));
            System.out.println("FFB48FDF的二进制格式:" + hexStrToBinaryStr2("FF1DE66C"));
            System.out.println("FFB48FDF的二进制取反:" + reverseHex2(hexStrToBinaryStr2("FF1DE66C")));
            System.out.println("求FFB48FDF的原码(二进制取反+1)" + add(reverseHex2(hexStrToBinaryStr2("FF1DE66C")),"1"));
            System.out.println("二进制字符串转16进制字符串:"+binaryStrToHexStr(add(reverseHex2(hexStrToBinaryStr2("FF1DE66C")),"1").substring(8)));
            
            System.out.println("----------------------------------------------");
            String init_pull = DataTransform.add(DataTransform.reverseHex2(DataTransform.hexStrToBinaryStr2("FFF5")),"1").substring(1);
            System.out.println("拉力值二进制:" + init_pull);
            double pull = Long.parseLong(init_pull, 2) * 0.1;//转为10进制
            System.out.println("拉力值:" + "-" + String.valueOf(pull * 0.1));
        }*/
    }
     
  • 相关阅读:
    win_tc使用感受
    10进制转8进制(栈操作)
    动态栈
    数组
    单链表学习
    static用法
    基础2
    linux c first
    linux net command /uboot command
    opencv
  • 原文地址:https://www.cnblogs.com/4AMLJW/p/DataTransform20210415104655.html
Copyright © 2011-2022 走看看