Scala库将数字(Int、Long、Double)转换为数组[字节]

Scala库将数字(Int、Long、Double)转换为数组[字节],scala,serialization,Scala,Serialization,正如标题所说,是否有任何Scala库可以导出函数,以便将字节数组转换为Int、Long或Double,最好是流畅地转换 我需要与2.9.1和FOSS兼容的东西 如果您恰好知道我需要什么以及在哪里可以找到它,一行SBT和一行示例就足够了!:) 如果没有我正在寻找的东西,那么Java中最接近的东西也可以使用…您可以使用: 不需要额外的依赖项。Java的nio.ByteBuffer是目前的发展方向: val bb = java.nio.ByteBuffer.allocate(4) val i = 5

正如标题所说,是否有任何Scala库可以导出函数,以便将字节数组转换为Int、Long或Double,最好是流畅地转换

我需要与2.9.1和FOSS兼容的东西

如果您恰好知道我需要什么以及在哪里可以找到它,一行SBT和一行示例就足够了!:)

如果没有我正在寻找的东西,那么Java中最接近的东西也可以使用…

您可以使用:


不需要额外的依赖项。

Java的
nio.ByteBuffer
是目前的发展方向:

val bb = java.nio.ByteBuffer.allocate(4)
val i = 5
bb.putInt(i)
bb.flip  // now can read instead of writing
val j = bb.getInt
bb.clear // ready to go again
您还可以
put
字节数组等

记住小/大端的事情
bb.order(java.nio.ByteOrder.nativeOrder)
可能就是您想要的。

对于双字节数组,您可以使用java.lang.Double.Double-tolongbits和java.lang.Double.longBitsToDouble

import java.lang.Double

def doubleToByteArray(x: Double) = {
    val l = java.lang.Double.doubleToLongBits(x)
    val a = Array.fill(8)(0.toByte)
    for (i <- 0 to 7) a(i) = ((l >> ((7 - i) * 8)) & 0xff).toByte
    a
}

def byteArrayToDouble(x: Array[scala.Byte]) = {
    var i = 0
    var res = 0.toLong
    for (i <- 0 to 7) {
        res +=  ((x(i) & 0xff).toLong << ((7 - i) * 8))
    }
    java.lang.Double.longBitsToDouble(res)
}

scala> val x = doubleToByteArray(12.34)
x: Array[Byte] = Array(64, 40, -82, 20, 122, -31, 71, -82)

scala> val y = byteArrayToDouble(x)
y: Double = 12.34

您还可以使用scala标准库中的
BigInt

import scala.math.BigInt
val bytearray = BigInt(1337).toByteArray
val int = BigInt(bytearray)
您还可以使用: 字节.toInt(字节数组)
工作得很有魅力

使用Scala,以下内容对我有效:

import org.apache.kudu.client.Bytes
字节数。getFloat(valueToConvert)

为什么在我之前没有人投票支持最短的答案。纯Scala解决方案!请注意,在使用BigInt将整数类型转换为字节数组时,应该注意填充,因为BigInt(1)。toByteArray==数组(1),而不是(数组(0,0,0,1))
import java.nio.ByteBuffer
def doubleToByteArray(x: Double) = {
  val l = java.lang.Double.doubleToLongBits(x)
  ByteBuffer.allocate(8).putLong(l).array()
}

def byteArrayToDouble(x:Array[Byte]) = ByteBuffer.wrap(x).getDouble
import scala.math.BigInt
val bytearray = BigInt(1337).toByteArray
val int = BigInt(bytearray)