还有一个与此类似的线程,但它不是此的重复,因此请不要将其标记为这样。
我有一个通信模拟,它获取测试数据 - 浮点数和整数 - 并将它们转换为二进制字符串,然后通过管道发送它们,并由另一端的侦听器接收它们。然后将它们“解包”并转换回数字。
但是,使用 Integer.parseInt() 进行的转换会引发异常,即使消息中的 Binary 显然是正确形成的 IEEE-754 binary32 单精度格式。
float flt = -45732.9287f;
int intFloat = Float.floatToRawIntBits(flt);
String str = Integer.toBinaryString(intFloat);
System.out.println("------- Now do the Reverse -------");
int revint = Integer.parseInt(str, 2);
.... Throws java.lang.NumberFormatException: For input string: "11000111001100101010010011101110"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
在没有基数的情况下使用 parseInt() 会引发类似的异常:
"int revint = Integer.parseInt(str);" throws an exception too, "java.lang.NumberFormatException: For input string: "11000111001100101010010011101110"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)".
因此,这不仅仅是 Radix 使用问题。
使用 Long 和 BigInt 转换回来是不正确的,因为它们是 64 位 IEEE-754 格式,适用于有符号双精度,而不是像浮点这样的有符号单精度数据类型。
我有一个解决方案来掩盖 Java 转换方法中的不对称性,但让我觉得不协调的是没有原生 API:
System.out.println("------- Now do the Reverse -------");
int revSign = str.substring(0,1).equals("1") ? -1: 1;
System.out.println("The passed-in sign is:"+revSign);
int revint = Integer.valueOf(str.substring(1), 2);
float revFloat = Float.intBitsToFloat(revint)*revSign;
我肯定错过了什么。
月关宝盒
相关分类