如何将二进制网络数据包结构映射到 Haskell 标准数据类型(记录)?

How can I map a binary network packet structure to Haskell standard data types (records)?

我想用纯 Haskell 实现一个二进制协议(RFC3588,Diameter)。我需要知道有没有更好的方法(比例如 Data.Binary...)到 read/write 数据 from/to ByteStrings。我喜欢将 Haskell 记录映射到 ByteString,就像在 C# 中使用 StructLayout 属性(装饰器)一样。

Haskell 不给你任何关于内存布局的保证,所以你不能简单地将一组字节转换为结构 - 你必须使用二进制或类似的东西(谷物,attoparsec 等)解析它).

编辑:对于二进制文件的使用示例,请考虑:

{-# LANGUAGE DeriveGeneric #-}

import Data.Binary
import GHC.Generics (Generic)

data Foo = Foo Int | Bar String deriving (Eq, Ord, Show, Read, Generic)

instance Binary Foo

现在您可以 encodedecode Foo 类型来回字节。