em7*_*m70 35 serialization scala
正如标题所说,是否有任何Scala库导出函数,以便将字节数组转换为Int,Long或Double?
我需要与2.9.1和FOSS兼容的东西.
如果您碰巧确切地知道我需要什么以及在哪里找到它,那么SBT的一条线和一条线就足够了!:)
如果没有我正在寻找的东西,那么Java中最接近的东西也会起作用......
Tra*_*own 48
您可以使用Java NIOByteBuffer:
import java.nio.ByteBuffer
ByteBuffer.wrap(Array[Byte](1, 2, 3, 4)).getInt
ByteBuffer.wrap(Array[Byte](1, 2, 3, 4, 5, 6, 7, 8)).getDouble
ByteBuffer.wrap(Array[Byte](1, 2, 3, 4, 5, 6, 7, 8)).getLong
Run Code Online (Sandbox Code Playgroud)
不需要额外的依赖项.
The*_*ius 28
您也可以使用BigIntscala标准库.
import scala.math.BigInt
val bytearray = BigInt(1337).toByteArray
val int = BigInt(bytearray)
Run Code Online (Sandbox Code Playgroud)
Rex*_*err 20
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
Run Code Online (Sandbox Code Playgroud)
您还可以put使用字节数组等.
请记住小/大端的事情. bb.order(java.nio.ByteOrder.nativeOrder)可能就是你想要的.
对于Double <-> ByteArray,可以使用java.lang.Double.doubleToLongBits和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
Run Code Online (Sandbox Code Playgroud)
或者可以使用ByteBuffer:
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
Run Code Online (Sandbox Code Playgroud)