java、C/C++/Objective-c 进制转换方法



java、C/C++/Objective-c 进制转换方法。

  1.     /**
  2.     <p>
  3.     最近遇到一个问题 C/C++/Objective-c中的数据类型 16进制数据到java中进行转换</p><p>
  4.     在java总转换 C 中无符号好办,直接用java中的类型转换就行了如 c中无符号Int32 java中 Long.parseLong(“FFFF”,16)即可</p><p>
  5.     但是碰到一个有符号的 ,就是C中 int类型负数的情况</p><p>
  6.     这里我的解决方案是可以转过来的,但是有个限制(java、c中的int值都在 -128~127这个
  7.     取值范围 通过&位与操作可以得到这个范围中的正确数据)</p><p>
  8.     java中 -3:fffffffd; -83:ffffffad(int:16进制)</p><p>
  9.     C中 -3:fdff ;-83:adff</p><p>
  10.     发现很郁闷的事情 转换的时候需要异位一下才可以,下面贴上代码来验证处理结果</p>
  11.     */
  12.     public static void main(String[] args) {
  13.         /*
  14.          * 正数处理
  15.          */
  16.         System.out.println(Integer.toHexString(127)); // 转换成16进制为 7f 传到C++那边必须是 7fff才能保持一致
  17.         System.out.println(parseInt(“7fff”)); // 在java中通过异位 即ff7f转换回来就是 127
  18.         /*
  19.          * 负数处理
  20.          * <p>负数十六进制转换也同样可以(但是注意int值必须在-128~127这个取值范围, 因为通过byte范围是-128~127超出的部分处理出来的就是脏数据)</p>
  21.          */
  22.         System.out.println(Integer.toHexString(-5)); // 16进制为fffffffb
  23.         System.out.println(parseInt(“fbff”)); // 转换回来就是 -5
  24.         /*
  25.          * 中文16进制直接转换 网上看到的感觉比较不错
  26.          */
  27.         System.out.println(encode(“中文”)); // D6D0CEC4十六进制
  28.         System.out.println(decode(encode(“中文”)));
  29.     }
  30.     /**
  31.      * 有符号转换
  32.      *
  33.      * @param data
  34.      *            4位大小
  35.      * @return
  36.      */
  37.     private static int parseInt(String data) {
  38.         String dd = data.substring(2) + data.substring(0, 2);
  39.         int temp = 0;
  40.         try {
  41.             temp = Integer.valueOf(dd, 16);
  42.         } catch (Exception e) {
  43.             e.printStackTrace();
  44.         }
  45.         return (byte) (temp & 0xFF);
  46.     }
  47.     /**
  48.      * <span style=”color:blue”>数据异位 与C/C++中16进制数据保持一致</span>
  49.      *
  50.      * @param data
  51.      * @return
  52.      */
  53.     private String convertHexString(String data) {
  54.         int sum = data.length();
  55.         switch (sum) {
  56.         case 1:
  57.             return ”0″ + data + ”00″;
  58.         case 2:
  59.             return data + ”00″;
  60.         case 3:
  61.             return data.substring(1) + ”0″ + data.substring(0, 1);
  62.         case 4:
  63.             return data.substring(2) + data.substring(0, 2);
  64.         case 8:
  65.             return data.substring(6) + data.substring(4, 6);
  66.         default:
  67.             break;
  68.         }
  69.         return null;
  70.     }
  71.     /*
  72.      * 将16进制数字解码成字符串,适用于所有字符(包括中文)
  73.      */
  74.     public static String decode(String bytes) {
  75.         ByteArrayOutputStream baos = new ByteArrayOutputStream(
  76.                 bytes.length() / 2);
  77.         // 将每2位16进制整数组装成一个字节
  78.         for (int i = 0; i < bytes.length(); i += 2)
  79.             baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString
  80.                     .indexOf(bytes.charAt(i + 1))));
  81.         return new String(baos.toByteArray());
  82.     }
  83.     /*
  84.      * 16进制数字字符集
  85.      */
  86.     private static String hexString = ”0123456789ABCDEF”;
  87.     /*
  88.      * 将字符串编码成16进制数字,适用于所有字符(包括中文)
  89.      */
  90.     public static String encode(String str) {
  91.         // 根据默认编码获取字节数组
  92.         byte[] bytes = str.getBytes();
  93.         StringBuilder sb = new StringBuilder(bytes.length * 2);
  94.         // 将字节数组中每个字节拆解成2位16进制整数
  95.         for (int i = 0; i < bytes.length; i++) {
  96.             sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
  97.             sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
  98.         }
  99.         return sb.toString();
  100.     }
  101. /*
  102.     下面那个网站找到的 感觉挺不错
  103.     十进制转成十六进制:
  104.     Integer.toHexString(int i)
  105.     十进制转成八进制
  106.     Integer.toOctalString(int i)
  107.     十进制转成二进制
  108.     Integer.toBinaryString(int i)
  109.     十六进制转成十进制
  110.     Integer.valueOf(“FFFF”,16).toString()
  111.     八进制转成十进制
  112.     Integer.valueOf(“876″,8).toString()
  113.     二进制转十进制
  114.     Integer.valueOf(“0101″,2).toString()
  115.     有什么方法可以直接将2,8,16进制直接转换为10进制的吗?
  116.     java.lang.Integer类
  117.     parseInt(String s, int radix)
  118.     使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
  119.     examples from jdk:
  120.     parseInt(“0″, 10) returns 0
  121.     parseInt(“473″, 10) returns 473
  122.     parseInt(“-0″, 10) returns 0
  123.     parseInt(“-FF”, 16) returns -255
  124.     parseInt(“1100110″, 2) returns 102
  125.     parseInt(“2147483647″, 10) returns 2147483647
  126.     parseInt(“-2147483648″, 10) returns -2147483648
  127.     parseInt(“2147483648″, 10) throws a NumberFormatException
  128.     parseInt(“99″, throws a NumberFormatException
  129.     parseInt(“Kona”, 10) throws a NumberFormatException
  130.     parseInt(“Kona”, 27) returns 411787
  131.     进制转换如何写(二,八,十六)不用算法
  132.     Integer.toBinaryString
  133.     Integer.toOctalString
  134.     Integer.toHexString
  135.     */