编程语言
首页 > 编程语言> > java-将double转换为32位表示形式(以及相反的过程)

java-将double转换为32位表示形式(以及相反的过程)

作者:互联网

[背景]
我目前正在研究探测气球.我的通信仅限于12字节的消息,在该消息中我必须传输几条信息. (海拔,最高温度,经度,纬度,平均加速度).
该探针基于树莓pi 2 b.

[题]
我目前正在构建数据报,并希望将纬度和经度存储为32位double(有损).可以用浮点数或定点数进行存储
是否有进行这种转换的工具?我还能怎么做? (尤其是在四舍五入的聚会上)
我最初计划使用Java,但可以迁移到python.

先感谢您

解决方法:

如果要将双精度转换为64位,可以使用long Double.doubleToLongBits(double value)double Double.longBitsToDouble(long bits)将其转换回.

如果要将32位值转换为Float值并返回,则相应的函数为floatToIntBits(…)和intBitsToFloat(…).

对于双精度到32位,我将使用两步转换,首先转换为浮点数:

double val = ...;
int bits = Float.floatToIntBits( (float) val );

然后回来:

int bits = ...;
double val = (double) Float.intBitsToFloat(bits);

直接打包和解包到缓冲区:

ByteArrayOutputStream baos = new ByteArrayOutputStream(20);
DataOutputStream dos = new DataOutputStream( ... );
dos.writeFloat( altitude );
dos.writeFloat( max_temperature );
dos.writeFloat( longitude );
dos.writeFloat( latitude );
dos.writeFloat( average_acceleration);
byte[] data = baos.toByteArray();

当然,这将创建一个20字节的缓冲区(5 x 32位浮点数),而不是12字节的缓冲区,因此您需要弄清楚哪些值需要为32位,以及哪些值可以填充到较小的空间中.

打开包装,使用DataInputStream和readFloat().

ByteArrayInputStream bais = ...
DataInputStream dis = new DataInputStream(bais);
altitude = dis.readFloat();
max_temperature = dis.readFloat();
...etc...

标签:data-conversion,precision,iot,java
来源: https://codeday.me/bug/20191108/2009983.html