如何将二进制网络数据包结构映射到 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
现在您可以 encode
和 decode
Foo
类型来回字节。
我想用纯 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
现在您可以 encode
和 decode
Foo
类型来回字节。