四字节的数组转化为float的问题
从delphi编写的通讯服务器处得到4个字节的数据,该数据代表一个浮点数值,但是查看了JDK的API以后没有找到相应的方法,请大家帮帮忙!!
数据格式如下(标准)
D31 D30-D23 D22-D0
浮点数符号位 阶码 尾数
010000001 010000000 00000000000000 就是浮点数5.0的字节码表示
现在问题就是怎么从010000001 010000000 00000000000000得到float
问题点数:100、回复次数:17Top
1 楼Lx_KingTran_81(土豆丝炒肉)回复于 2005-07-19 16:22:10 得分 0
沙发 帮你顶Top
2 楼MOEA(MOS)回复于 2005-07-19 16:36:18 得分 50
int maskInt = 0xff;
byte [] rec = new byte[4];
int a = ((rec[3] << 24)
| ((rec[3] & maskInt) << 16)
| ((rec[1] & maskInt) << 8) | (rec[0] & maskInt));
Float.intBitsToFloat(a);
先转成int ,再转成float,转byte[]->int时高低位排列,要和原来int ->byte[]时要一致,你自己试试。Top
3 楼mofeir(损人专家)回复于 2005-07-19 16:37:39 得分 0
哇,好多分数啊,我来研究一下。呵呵。有结果了就给你答案。Top
4 楼mofeir(损人专家)回复于 2005-07-19 16:38:54 得分 0
有人给答案了,那我就不做了
Top
5 楼laughsmile(海边的星空)回复于 2005-07-19 17:51:48 得分 0
你的D30位是1,怎么010000001001000000000000000000000 就是浮点数5.0的字节码表示Top
6 楼humanity(城市边缘的狼)回复于 2005-07-19 21:38:22 得分 0
不可以 new DataInputStream(socket.getInputStream()).readFloat() 么?
Top
7 楼kingfish(工作很忙,很少来csdn...)回复于 2005-07-19 21:59:34 得分 0
是5.0吗,觉得像是12.0Top
8 楼FaneAnn(十年等待)回复于 2005-07-20 09:13:29 得分 0
5.0肯定没错,我在Delphi下试过的
回:humanity(总是偷窥 Java & XML)
这个方法我查看了一下JDK,在处理的时候有一定的问题
我把问题再讲清楚一点,我的socket与服务器连接,我打算用BufferedInputStream来读取数据
使用read(byte,int,int)方法得到byte[],在这个byte[]里包含整数信息,浮点数,和中文字符
整数我使用Byte的intValue()方法得到,中文字符那段byte[]我把它截取出来使用new String(byte[],"GBK")重新编码得到,上面思路不知道如何,各位有什么更好的方法不??
TO: MOEA(MOS)
你的方法我会试一下,先谢了
Top
9 楼FaneAnn(十年等待)回复于 2005-07-20 09:19:50 得分 0
实际上就是怎么从byte[0],byte[1],byte[2],byte[3]得到一个float的问题Top
10 楼kingfish(工作很忙,很少来csdn...)回复于 2005-07-20 09:31:20 得分 0
不好意思,看错位数,是5.0
byte转int通过楼上MOEA的方法就行了
float f = Float.intBitsToFloat(0x40A00000);Top
11 楼JUSTHELP(卧式蔡鸟)回复于 2005-07-20 09:47:48 得分 0
请教一下!
& 0xff有什么用,和全1与运算,不是不变吗?
是不是为了保证是8位。Top
12 楼FaneAnn(十年等待)回复于 2005-07-20 09:59:00 得分 0
public class FloatTest
{
public static void main(String[] args)
{
int maskInt = 0xff;
byte [] rec = new byte[4];
/*用01000000101000000000000000000000也就是5.0来测试*/
rec[3] = (new Byte("40")).byteValue();
rec[2] = (new Byte("A0")).byteValue();
rec[1] = (new Byte("00")).byteValue();
rec[0] = (new Byte("00")).byteValue();
int a = ((rec[3] << 24)
| ((rec[3] & maskInt) << 16)
| ((rec[1] & maskInt) << 8) | (rec[0] & maskInt));
float myFloat = Float.intBitsToFloat(a);
System.out.println(Float.toString(myFloat));
}
}
这里的new Byte(string) 的string不知道该怎么写(格式,要求),请过路的就以上面的5.0做例子讲解一下,多谢Top
13 楼FaneAnn(十年等待)回复于 2005-07-20 09:59:49 得分 0
Exception in thread "main" java.lang.NumberFormatException: For input string: "A
0"
at java.lang.NumberFormatException.forInputString(NumberFormatException.
java:48)
at java.lang.Integer.parseInt(Integer.java:468)
at java.lang.Byte.parseByte(Byte.java:122)
at java.lang.Byte.<init>(Byte.java:296)
at person.fane.test.FloatTest.main(FloatTest.java:19)
出错信息!!!!!!!!!!!!!!!!!!!!!!Top
14 楼kingfish(工作很忙,很少来csdn...)回复于 2005-07-20 10:09:18 得分 50
byte[] b = new byte[4];
b[0] = 0x40;
b[1] = (byte)0xA0;
b[2] = 0;
b[3] = 0;
float f = Float.intBitsToFloat((b[0]<<24)&0xFF000000|(b[1]<<16)&0xFF0000|(b[2]<<8)&0xFF00|b[3]);Top
15 楼FaneAnn(十年等待)回复于 2005-07-20 10:32:28 得分 0
不明白啊??
int a = (rec[3]<<24)&0xFF00|(rec[3]<<16)&0xFF00|(rec[1]<<8)&0xFF00|rec[0];
System.out.println(a);
float f = Float.intBitsToFloat((rec[3]<<24)&0xFF000000|(rec[2]<<16)&0xFF0000|(rec[1]<<8)&0xFF00|rec[0]);
float myFloat = Float.intBitsToFloat(a);
System.out.println(Float.toString(myFloat));
System.out.println(Float.toString(f));
输出:
0
0.0
5.0
int a的值丢失了??WHY??????Top
16 楼FaneAnn(十年等待)回复于 2005-07-20 10:49:09 得分 0
不好意思,写错了,结贴
kingfish(八百里秦川@龙城异客)
TO: MOEA(MOS)
都是对的
MOEA(MOS)要改成
int a = ((rec[3] << 24)
| ((rec[2] & maskInt) << 16)
| ((rec[1] & maskInt) << 8) | (rec[0] & maskInt));Top
17 楼FaneAnn(十年等待)回复于 2005-07-20 10:53:57 得分 0
我给了分数了阿,怎么看不到Top




