四字节的数组转化为float的问题

FaneAnn 2005-07-19 03:56:42
从delphi编写的通讯服务器处得到4个字节的数据,该数据代表一个浮点数值,但是查看了JDK的API以后没有找到相应的方法,请大家帮帮忙!!
数据格式如下(标准)

D31 D30-D23 D22-D0
浮点数符号位 阶码 尾数



010000001 010000000 00000000000000 就是浮点数5.0的字节码表示

现在问题就是怎么从010000001 010000000 00000000000000得到float
...全文
657 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
FaneAnn 2005-07-20
  • 打赏
  • 举报
回复
我给了分数了阿,怎么看不到
FaneAnn 2005-07-20
  • 打赏
  • 举报
回复
不好意思,写错了,结贴
kingfish(八百里秦川@龙城异客)
TO: MOEA(MOS)
都是对的
MOEA(MOS)要改成
int a = ((rec[3] << 24)
| ((rec[2] & maskInt) << 16)
| ((rec[1] & maskInt) << 8) | (rec[0] & maskInt));
FaneAnn 2005-07-20
  • 打赏
  • 举报
回复
不明白啊??

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??????
kingfish 2005-07-20
  • 打赏
  • 举报
回复
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]);
FaneAnn 2005-07-20
  • 打赏
  • 举报
回复
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)

出错信息!!!!!!!!!!!!!!!!!!!!!!
FaneAnn 2005-07-20
  • 打赏
  • 举报
回复

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做例子讲解一下,多谢
JUSTHELP 2005-07-20
  • 打赏
  • 举报
回复
请教一下!
& 0xff有什么用,和全1与运算,不是不变吗?
是不是为了保证是8位。
kingfish 2005-07-20
  • 打赏
  • 举报
回复
不好意思,看错位数,是5.0
byte转int通过楼上MOEA的方法就行了

float f = Float.intBitsToFloat(0x40A00000);
FaneAnn 2005-07-20
  • 打赏
  • 举报
回复
实际上就是怎么从byte[0],byte[1],byte[2],byte[3]得到一个float的问题
FaneAnn 2005-07-20
  • 打赏
  • 举报
回复
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)
你的方法我会试一下,先谢了
kingfish 2005-07-19
  • 打赏
  • 举报
回复
是5.0吗,觉得像是12.0
humanity 2005-07-19
  • 打赏
  • 举报
回复
不可以 new DataInputStream(socket.getInputStream()).readFloat() 么?

laughsmile 2005-07-19
  • 打赏
  • 举报
回复
你的D30位是1,怎么010000001001000000000000000000000 就是浮点数5.0的字节码表示
mofeir 2005-07-19
  • 打赏
  • 举报
回复
有人给答案了,那我就不做了
mofeir 2005-07-19
  • 打赏
  • 举报
回复
哇,好多分数啊,我来研究一下。呵呵。有结果了就给你答案。
MOEA 2005-07-19
  • 打赏
  • 举报
回复
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[]时要一致,你自己试试。
  • 打赏
  • 举报
回复
沙发 帮你顶

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧