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

时间:2012-03-21 17:46:01

标签: scala serialization

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

>)

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

如果您碰巧确切地知道我需要什么以及在哪里找到它,那么SBT的一条线和一条线就足够了! :)

如果没有我想要的东西,那么Java中最接近的东西也会起作用......

6 个答案:

答案 0 :(得分:46)

您可以使用Java NIO's ByteBuffer

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

不需要额外的依赖项。

答案 1 :(得分:24)

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

import scala.math.BigInt
val bytearray = BigInt(1337).toByteArray
val int = BigInt(bytearray)

答案 2 :(得分:19)

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)可能就是你想要的。

答案 3 :(得分:4)

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
可以使用

或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

答案 4 :(得分:0)

以下内容使用Scala为我工作:

import org.apache.kudu.client.Bytes

Bytes.getFloat(valueToConvert)

答案 5 :(得分:-1)

您还可以使用: Bytes.toInt(byteArray) 像魅力一样工作!