【问题标题】:Mapping C structs in Scala在 Scala 中映射 C 结构
【发布时间】:2015-07-02 16:29:54
【问题描述】:

在 Scala 中读写 C 风格字节结构的最佳方法是什么,如下所示:

    struct account {
            int id;
            char[10] data1;
            char[10] data2;
            float dataFloat;
    };

Python 中有 unpack 函数,可以将字符串解释为打包的二进制数据。但我在 Scala 中找不到任何类似物。

Scala 中这种映射的标准方法是什么?一个一个地读取字节是很不充分的。我需要解析的协议来自 1980 年代,并且包含不同的字段(short、int、float),因此逐字节读取它是非常不充分的。

【问题讨论】:

    标签: c scala parsing scodec


    【解决方案1】:

    http://scodec.org/ (code) 可能是你想要的。此视频中的一些示例:Introduction to Shapeless with applications from scodec

    来自文档的示例:通过 Shapeless HLists 支持自动案例类绑定:

    case class Point(x: Int, y: Int, z: Int)
    
    val pointCodec = (int8 :: int8 :: int8).as[Point]
    
    val encoded: Attempt[BitVector] = pointCodec.encode(Point(-5, 10, 1))
    // Successful(BitVector(24 bits, 0xfb0a01))
    
    val decoded: Attempt[DecodeResult[Point]] = pointCodec.decode(hex"0xfb0a01".bits)
    // Successful(DecodeResult(Point(-5,10,1),BitVector(empty)))
    

    【讨论】:

      【解决方案2】:

      因为 Scala 仍然可以依赖 java 类:

      您当然是使用InputStream 来读取字节, 将byte[] 转换为字符串应该与使用new String(byte[]) 的Java 相同。

      转换浮点数是in this SO question about byte to float conversion in Java回答的另一个问题。

      更简单的方法是使用java.nio.ByteBuffer,它有一个方便的getFloat 方法

      【讨论】:

      • 谢谢!非常好的纯语言变体。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      相关资源
      最近更新 更多