3

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

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

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

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

4

2 回答 2

5

http://scodec.org/ (代码)可能是你想要的。本视频中的一些示例:使用 scodec 的应用程序介绍 Shapeless

来自文档的示例:通过 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)))
于 2015-04-24T09:56:37.087 回答
1

由于 Scala 仍然可以依赖 java 类:

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

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

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

于 2015-04-24T08:50:42.660 回答