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