Подтвердить что ты не робот

Scala библиотека для преобразования чисел (Int, Long, Double) в/из массива [Byte]

Как гласит название, есть ли какая-либо библиотека Scala, которая экспортирует функции для преобразования, предпочтительно бегло, массива байтов в Int, в Long или Double?

Мне нужно что-то совместимое с 2.9.1 и FOSS.

Если вам точно известно, что мне нужно и где его найти, будет достаточно строки для SBT и строки для примера!:)

Если нет такой вещи, как то, что я ищу, ближайшая вещь в Java также будет работать...

Заранее спасибо

4b9b3361

Ответ 1

Вы можете использовать Java NIO 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

Никаких дополнительных зависимостей не требуется.

Ответ 2

Вы также можете использовать BigInt из стандартной библиотеки scala.

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

Ответ 3

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), вероятно, то, что вы хотите.

Ответ 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