2012-03-21 37 views
30

Như tiêu đề cho biết, có thư viện Scala nào xuất các chức năng để chuyển đổi, tốt nhất là một mảng byte sang Int Dài hoặc đôi?Thư viện Scala để chuyển đổi các số (Int, Long, Double) thành/từ Array [Byte]

Tôi cần một cái gì đó tương thích với 2.9.1 và FOSS.

Nếu bạn tình cờ biết chính xác những gì tôi cần và nơi để tìm thấy nó, một dòng cho SBT và một dòng cho một ví dụ sẽ là đủ! :)

Nếu không có những điều như những gì tôi đang tìm kiếm, điều gần gũi nhất trong Java cũng sẽ làm việc ...

Trả lời

40

Bạn có thể sử dụng 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 

Không phụ thuộc yêu cầu thêm .

16

Java nio.ByteBuffer là con đường để đi cho bây giờ:

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 

Bạn cũng có thể put mảng byte vv

Hãy ghi nhớ những ít/điều lớn về cuối nhỏ. bb.order(java.nio.ByteOrder.nativeOrder) có lẽ là những gì bạn muốn.

2

Đối với Double < -> ByteArray, bạn có thể sử dụng java.lang.Double.doubleToLongBits và 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 

Hoặc ByteBuffer thể được sử dụng:

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 
18

Bạn cũng có thể sử dụng BigInt từ thư viện chuẩn scala.

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

Tại sao không ai bỏ phiếu cho câu trả lời ngắn nhất cho đến khi tôi. Giải pháp Pure Scala! Câu trả lời hay nhất IMHO – yerlilbilgin

+1

Xin lưu ý rằng bạn nên quan tâm đến việc đệm khi sử dụng BigInt để chuyển đổi các kiểu tích phân thành mảng byte, vì BigInt (1) .toByteArray == Array (1), không phải (Array (0,0,0,1)) –

Các vấn đề liên quan