项目过程中,总是要用到十进制与十六进制相互转换的方法,今天来总结记录一下。
十进制整数转十六进制
int i = -50; //int是4个字节,32位,取值范围为: -2^31——2^31-1
String r;
r = Integer.toHexString(i);
System.out.println(r);
正数转换后正常,负数转换完为8位
十进制转十六进制:ffffffce
十六进制转十进制整数
String s = "ffce";
//确定是正数的转换
int r1 = Integer.parseInt(s,16);
System.out.println("最普通的Integer.parseInt:"+r1);
//2字节16进制数,解析时用shortValue,第一位为f则为负数
int r2 = Integer.valueOf(s,16).shortValue();
System.out.println("2字节能解析出负数:"+r2);
//4字节16进制数,解析时用BigInteger,第一位为f则为负数
BigInteger bi = new BigInteger(s,16);
int r3 = bi.intValue();
System.out.println("4字节能解析出负数:"+r3);
结果如下:
最普通的Integer.parseInt:65486
2字节能解析出负数:-50
4字节能解析出负数:65486
单精度浮点型float十进制转为十六进制
float f = 123.45f;
String r;
int f1 = Float.floatToIntBits(f);
System.out.println("float转为32位浮点数:" + f1);
r = Integer.toHexString(f1);
System.out.println("float转十六进制:" + r);
如果float初值为0,r为0,否则r都有八位。
float转为32位浮点数:1123477094
float转十六进制:42f6e666
十六进制转为十进制单精度浮点型float
主函数里用到HexString2binaryString自定义函数,也是参考了网上大佬的代码。
我的代码适用于四字节的十六进制转为十进制float.
String s = "c2f6e666"; // -123.45
float r = BinaryStringToFloat(HexString2binaryString(s));
System.out.println(r);
HexString2binaryString
// 16进制字符串转化二进制字符串
public static String HexString2binaryString(String hexString) {
if (hexString == null || hexString.length() % 2 != 0)
return null;
String bString = "", tmp;
for (int i = 0; i < hexString.length(); i++) {
tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + 1), 16));
bString += tmp.substring(tmp.length() - 4);
}
return bString;
}
// 2进制字符串转Float数,包括正数和负数
static float BinaryStringToFloat(final String binaryString) {
// float是32位,将这个binaryString左边补0补足32位,如果是Double补足64位。
/* final String stringValue = LeftPad(binaryString, '0', 32); */
// 首位是符号部分,占1位。
// 如果符号位是0则代表正数,1代表负数
final int sign = binaryString.charAt(0) == '0' ? 1 : -1;
// 第2到9位是指数部分,float占8位,double占11位。
final String exponentStr = binaryString.substring(1, 9);
// 将这个二进制字符串转成整数,由于指数部分加了偏移量(float偏移量是127,double是1023)
// 所以实际值要减去127
final int exponent = Integer.parseInt(exponentStr, 2) - 127;
// 最后的23位是尾数部分,由于规格化数,小数点左边隐含一个1,现在加上
final String mantissaStr = "1".concat(binaryString.substring(9, 32));
// 这里用double,尽量保持精度,最好用BigDecimal,这里只是方便计算所以用double
double mantissa = 0.0;
for (int i = 0; i < mantissaStr.length(); i++) {
final int intValue = Character.getNumericValue(mantissaStr.charAt(i));
// 计算小数部分,具体请查阅二进制小数转10进制数相关资料
mantissa += (intValue * Math.pow(2, -i));
}
// 根据IEEE 754 标准计算:符号位 * 2的指数次方 * 尾数部分
return (float) (sign * Math.pow(2, exponent) * mantissa);
}
程序运行,得到-123.45.