41 votes

Bibliothèque Scala pour convertir des nombres (Int, Long, Double) vers/depuis un tableau[Byte]

Comme le titre l'indique, existe-t-il une bibliothèque Scala qui exporte des fonctions pour convertir, de préférence couramment, un tableau d'octets en Int, en Long ou en Double ?

J'ai besoin de quelque chose de compatible avec 2.9.1 et FOSS.

S'il vous arrive de savoir exactement ce dont j'ai besoin et où le trouver, une ligne pour SBT et une ligne pour un exemple suffiront ! :)

S'il n'y a rien de tel que ce que je cherche, la chose la plus proche dans Java fonctionnera aussi...

57voto

Travis Brown Points 56342

Vous pouvez utiliser 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

Aucune dépendance supplémentaire requise.

39voto

Themerius Points 1034

Vous pouvez également utiliser BigInt de la bibliothèque standard scala.

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

22voto

Rex Kerr Points 94401

nio.ByteBuffer de Java est la solution pour le moment :

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

Vous pouvez également put tableaux d'octets, etc.

Gardez à l'esprit la petite/grande chose endienne. bb.order(java.nio.ByteOrder.nativeOrder) est probablement ce que vous voulez.

6voto

prosseek Points 22637

Pour Double <-> ByteArray, vous pouvez utiliser java.lang.Double.doubleToLongBits et 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

Ou ByteBuffer peut être utilisé :

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

0voto

Jkulkarni Points 1

Ce qui suit a fonctionné pour moi en utilisant Scala :

import org.apache.kudu.client.Bytes

Bytes.getFloat(valueToConvert)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X