用little endian写浮点到文件?

时间:2014-06-09 16:04:37

标签: java endianness

public static void writeShortLE(DataOutputStream out, short value) {
  out.writeByte(value & 0xFF);
  out.writeByte((value >> 8) & 0xFF);
}

public static void writeIntLE(DataOutputStream out, int value) {
  out.writeByte(value & 0xFF);
  out.writeByte((value >> 8) & 0xFF);
  out.writeByte((value >> 16) & 0xFF);
  out.writeByte((value >> 24) & 0xFF);
}

我正在使用上述两种方法撰写shortint

我的问题是:如何撰写float

2 个答案:

答案 0 :(得分:2)

您可以使用Float.floatToRawIntBits获取由给定int参数的位组成的float,然后通过writeIntLE

public static void writeFloatLE(DataOutputStream out, float value) {
    writeIntLE(Float.floatToRawIntBits(value));
}

要回读float,您可以阅读int并使用Float.intBitsToFloat从中获取float值。


来自Float.floatToRawIntBits的链接文档:

  

根据IEEE 754浮点"单一格式&#34>返回指定浮点值的表示形式。位布局,保留非数字(NaN)值。

     

位31(掩码0x80000000选择的位)表示浮点数的符号。位30-23(掩码0x7f800000选择的位)代表指数。位22-0(由掩码0x007fffff选择的位)表示浮点数的有效位数(有时称为尾数)。

答案 1 :(得分:0)

对于Kotlin的用户来说,这只是对arshajii的补充回答:

fun writeFloat32LE(out: DataOutputStream, valToAdd: Float) {
    writeIntLE(out, valToAdd.toRawBits())
}


fun writeIntLE(out: DataOutputStream, value: Int) {
    out.writeByte(value and 0xFF)
    out.writeByte(value shr 8 and 0xFF)
    out.writeByte(value shr 16 and 0xFF)
    out.writeByte(value shr 24 and 0xFF)
}

读取功能可以简化为:

fun readFloat32LE(): Float {
    val nInt = readIntLE()
    return Float.fromBits(nInt)
}