【问题标题】:Scala library to convert numbers (Int, Long, Double) to/from Array[Byte]Scala 库将数字(Int、Long、Double)与 Array[Byte] 相互转换
【发布时间】:2012-04-06 06:57:39
【问题描述】:

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

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

如果您恰好知道我需要什么以及在哪里可以找到它,那么一行 SBT 和一行示例就足够了! :)

如果没有我要找的东西,Java 中最接近的东西也可以工作......

【问题讨论】:

    标签: scala serialization


    【解决方案1】:

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

    不需要额外的依赖项。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 为什么在我之前没有人投票给最短的答案。纯 Scala 解决方案!恕我直言最佳答案
      • 请注意,在使用 BigInt 将整数类型转换为字节数组时应注意填充,因为 BigInt(1).toByteArray == Array(1),而不是 (Array(0,0, 0,1))
      【解决方案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
        

        【讨论】:

          【解决方案5】:

          以下使用 Scala 对我有用:

          import org.apache.kudu.client.Bytes
          
          Bytes.getFloat(valueToConvert)
          

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-11-15
              • 2023-01-21
              • 2015-02-04
              • 2013-01-20
              • 2016-05-25
              • 2014-04-18
              • 2016-06-10
              相关资源
              最近更新 更多