/**
<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
*/
java、C/C++/Objective-c 进制转换
最新推荐文章于 2023-06-05 12:13:07 发布