binrep公司
binrep是一个Haskell库,用于精确建模二进制模式尤其是面向字节的文件格式,并有效地使用它们。以下是它有用的原因:
- 明确的:使用二进制模式“烘焙”定义Haskell数据类型。使用高度参数化的二进制表示原语,包括空终止数据(例如C型字符串)、Pascal型数据(长度前缀)、大小显式引擎整数、空填充数据。写入如果你想的话,可以使用你自己的原语(如果是这样,请考虑制作一个PR!)。
- 低样板:通过泛型释放性能分析器和序列化器。(请参见通用二进制表示.)
- 易于验证:使用强弱图书馆设计模式来定义未验证的数据类型,以便于内部转换,并免费获得验证代码。
- 表演者:分析和序列化是速度极快,使用字节映射和扁平解析.
用法
依赖关系
你需要ICU图书馆。对于运行,您只需要运行时。对于构建时,还需要开发文件(标题等)。或者,您可以使用阴谋集团标志关闭ICU功能。
哲学
建模,而非序列化
binrep擅长对二进制数据格式进行建模。这不是一个平原“序列化”库,其中隐藏了实际的二进制表示用户(故意,有充分理由)。二进制和谷物库是很好的选择。他们对定义高效的二进制编解码器感兴趣用于Haskell数据。然而,他们的编解码器类型类隐藏表示法决定来自用户。在谷物中,
这些都是很好的决定。但它们对类型并不准确。持久性是实施决策。
binrep拒绝处理机器整数,除非它知道结束。字节串分为C型(以空结尾)和Pascal型(长度前缀)。这加强了对二进制数据的仔细考虑已建模。
无样板验证
C样式字节字符串不得包含任何0x00个
空字节。Pascal风格字节串必须足够短,以便能够在长度中对其长度进行编码前缀机器整数。但是检查这样的不变量是一项乏味的工作真的要把所有东西包装在一堆新类型中,并强制用户调用每次都有一堆检查函数?
是和否。是的,binrep广泛使用newtypes,尽管大多数是类型同义词超过精炼 的
尼基塔·沃尔科夫的精彩新作精炼 的库。不,binrep不想让你每天与这些人争吵。一个解决方案是定义一个简化的“弱”类型,并在它和二进制安全的“强”类型。我的强弱图书馆提供支持此模式的定义,以及将工作的通用派生程序使用binrep的二进制表示原语。
通用二进制表示
(泛型现在由处理通用数据函数。此信息基本相同,但代码在其他地方。)
binrep的泛型派生很少做出决定:
- 构造函数是通过对每个封闭字段进行顺序编码来进行编码的。
- 总和类型通过从构造函数名称获得的标记进行编码。
- 这与aeson的方法相同,但有一点灵活性:见下文。
总和类型(具有多个构造函数的数据类型)由第一个编码处理“标记字段”,其值指示要使用的构造函数。你必须提供从构造函数名称转换为(唯一)标记的函数。您可以将它们编码为以null结尾的ASCII字节串(这是默认值),或作为单个字节。为了缓解这个问题,你可以考虑把标签构造函数名称中的值:
数据二进制和类型=B1 | B2getConstructorTag::String->单词8getConstructorTag=已读。下降1-->>>获取ConstructorTag“B1”--1个--或者使用我们的通用助手,它采用十六进制值:---->>>cSumTagHex@Word8(drop.1)“BFF”--255个
类似项目
开泰构造
开泰构造是一个很棒的声明式解析器生成器项目。他们融合了一种表达式语言和大量的二进制智能在良好的YAML模式之上。它带有IDE和可视化工具,您可以将模式编译为各种不同语言的解析器(没有Haskell…)。
设计原则,如其独特的绝对偏移处理和语言中立性阻碍了序列化支持。虽然更像是他们强大的解析功能,可以解析无法编辑的格式天真地重新序列化,就像带有文件索引的档案一样。为了正确处理应该存储一个文件表,序列化生成索引。反过来说,你会想把它们结合起来。但它有点程序化。在binrep中,您是一种编程语言,所以这不是什么问题。。。但我不确定我们能不能在绝对补偿方面要非常高效。
实际上,开泰结构是快速迭代的最佳选择反转未知数据。binrep用于将数据直接加载到Haskell用于进一步处理,尤其是在更简单的格式之间进行转换。
伍夫斯
伍夫斯是对安全的疯狂探索通过强类型进行低级代码。你必须标注每一个可能的危险带有安全证明的声明。这是一个冗长,明确,非常安全,非常用于定义解析器和序列化程序的快速命令式语言。
Wuffs与其说是逆向工程师的工具,不如说是编解码工程师的工具。binrep公司对速度并不感兴趣,而作为Haskell库,我们需要关注以声明和函数的方式定义类型及其组合。作为因此,我们可以使用binrep更快地定义更有用的东西。虽然我们分享许多核心思想,例如细化类型。
如果你需要编写一系列编解码器,并且它们真的真的,真的,请查看Wuffs需要既快速又安全。当然,取舍是你的时间。
平的
https://hackage.haskell.org/package/flat网站
酷,面向位,而不是面向字节。
许可证
根据麻省理工学院许可证提供。请参见许可证
用于许可证文本。