java、C/C++/Objective-c 进制转换方法。
[java] view plaincopy
- /**
- <p>
- 最近遇到一个问题 C/C++/Objective-c中的数据类型 16进制数据到java中进行转换</p><p>
- 在java总转换 C 中无符号好办,直接用java中的类型转换就行了如 c中无符号Int32 java中 Long.parseLong(“FFFF”,16)即可</p><p>
- 但是碰到一个有符号的 ,就是C中 int类型负数的情况</p><p>
- 这里我的解决方案是可以转过来的,但是有个限制(java、c中的int值都在 -128~127这个
- 取值范围 通过&位与操作可以得到这个范围中的正确数据)</p><p>
- java中 -3:fffffffd; -83:ffffffad(int:16进制)</p><p>
- C中 -3:fdff ;-83:adff</p><p>
- 发现很郁闷的事情 转换的时候需要异位一下才可以,下面贴上代码来验证处理结果</p>
- */
- public static void main(String[] args) {
- /*
- * 正数处理
- */
- System.out.println(Integer.toHexString(127)); // 转换成16进制为 7f 传到C++那边必须是 7fff才能保持一致
- System.out.println(parseInt(“7fff”)); // 在java中通过异位 即ff7f转换回来就是 127
- /*
- * 负数处理
- * <p>负数十六进制转换也同样可以(但是注意int值必须在-128~127这个取值范围, 因为通过byte范围是-128~127超出的部分处理出来的就是脏数据)</p>
- */
- System.out.println(Integer.toHexString(-5)); // 16进制为fffffffb
- System.out.println(parseInt(“fbff”)); // 转换回来就是 -5
- /*
- * 中文16进制直接转换 网上看到的感觉比较不错
- */
- System.out.println(encode(“中文”)); // D6D0CEC4十六进制
- System.out.println(decode(encode(“中文”)));
- }
- /**
- * 有符号转换
- *
- * @param data
- * 4位大小
- * @return
- */
- private static int parseInt(String data) {
- String dd = data.substring(2) + data.substring(0, 2);
- int temp = 0;
- try {
- temp = Integer.valueOf(dd, 16);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return (byte) (temp & 0xFF);
- }
- /**
- * <span style=”color:blue”>数据异位 与C/C++中16进制数据保持一致</span>
- *
- * @param data
- * @return
- */
- private String convertHexString(String data) {
- int sum = data.length();
- switch (sum) {
- case 1:
- return ”0″ + data + ”00″;
- case 2:
- return data + ”00″;
- case 3:
- return data.substring(1) + ”0″ + data.substring(0, 1);
- case 4:
- return data.substring(2) + data.substring(0, 2);
- case 8:
- return data.substring(6) + data.substring(4, 6);
- default:
- break;
- }
- return null;
- }
- /*
- * 将16进制数字解码成字符串,适用于所有字符(包括中文)
- */
- public static String decode(String bytes) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream(
- bytes.length() / 2);
- // 将每2位16进制整数组装成一个字节
- for (int i = 0; i < bytes.length(); i += 2)
- baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString
- .indexOf(bytes.charAt(i + 1))));
- return new String(baos.toByteArray());
- }
- /*
- * 16进制数字字符集
- */
- private static String hexString = ”0123456789ABCDEF”;
- /*
- * 将字符串编码成16进制数字,适用于所有字符(包括中文)
- */
- public static String encode(String str) {
- // 根据默认编码获取字节数组
- byte[] bytes = str.getBytes();
- StringBuilder sb = new StringBuilder(bytes.length * 2);
- // 将字节数组中每个字节拆解成2位16进制整数
- for (int i = 0; i < bytes.length; i++) {
- sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
- sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
- }
- return sb.toString();
- }
- /*
- 下面那个网站找到的 感觉挺不错
- 十进制转成十六进制:
- Integer.toHexString(int i)
- 十进制转成八进制
- Integer.toOctalString(int i)
- 十进制转成二进制
- Integer.toBinaryString(int i)
- 十六进制转成十进制
- Integer.valueOf(“FFFF”,16).toString()
- 八进制转成十进制
- Integer.valueOf(“876″,8).toString()
- 二进制转十进制
- Integer.valueOf(“0101″,2).toString()
- 有什么方法可以直接将2,8,16进制直接转换为10进制的吗?
- java.lang.Integer类
- parseInt(String s, int radix)
- 使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
- examples from jdk:
- parseInt(“0″, 10) returns 0
- parseInt(“473″, 10) returns 473
- parseInt(“-0″, 10) returns 0
- parseInt(“-FF”, 16) returns -255
- parseInt(“1100110″, 2) returns 102
- parseInt(“2147483647″, 10) returns 2147483647
- parseInt(“-2147483648″, 10) returns -2147483648
- parseInt(“2147483648″, 10) throws a NumberFormatException
- parseInt(“99″, throws a NumberFormatException
- parseInt(“Kona”, 10) throws a NumberFormatException
- parseInt(“Kona”, 27) returns 411787
- 进制转换如何写(二,八,十六)不用算法
- Integer.toBinaryString
- Integer.toOctalString
- Integer.toHexString
- */