将Double转换为ByteArray或Array<Byte> Kotlin

13

有一个双精度浮点数

val double = 1.2345

我该如何将其转换为 Kotlin 的 ByteArrayArray<Byte>

在转换后,其内容将类似于以下内容的内容

00111111 11110011 11000000 10000011
00010010 01101110 10010111 10001101

在Java中,有一种解决方案涉及到 Double.doubleToLongBits() (java.lang.Double的一个静态方法),但在Kotlin中,Double指的是Kotlin.Double,它没有这样的方法(或者在这种情况下没有任何其他有用的方法)。

如果解决方案导致在此文件中无法访问Kotlin.Double,我也不介意。 :)

2个回答

22

尽管您需要使用完全限定名称,但仍然可以使用Java Double的方法:

val double = 1.2345
val long = java.lang.Double.doubleToLongBits(double)

然后将它转换为 ByteArray,可以使用 Java 中的任何方法,例如这里所述。

val bytes = ByteBuffer.allocate(java.lang.Long.BYTES).putLong(long).array()

(注意再次提到的完全限定名称)


然后你就可以为此创建一个扩展函数

fun Double.bytes() = 
    ByteBuffer.allocate(java.lang.Long.BYTES)
        .putLong(java.lang.Double.doubleToLongBits(this))
        .bytes()

使用方法:

val bytes = double.bytes()

3
考虑使用import java.lang.Double as JDoublejava.lang.Double转换为JDouble - Jire
bytes()方法似乎不存在。我需要导入什么吗? - Damn Vegetables
1
在多平台项目中,这是一个完美的分界点。 - Farid

4

看起来自从您的回答后,一些方便的方法已经被添加,您可以通过以下方法实现相同的效果:

val double = 1.2345
ByteBuffer.allocate(java.lang.Double.BYTES)
     .putDouble(double).array()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接