binrep公司:直接在类型中编码精确的二进制表示

[数据泛型图书馆麻省理工学院序列化][建议标签]

请参阅README.md。


[跳到自述]

旗帜

手动标记

姓名描述违约
重症监护室

使用text-icu包(需要icu库)

启用

使用-f<标志>启用标志,或-f-<标志>禁用该标志。更多信息

下载

维修人员角落

包装维护人员

对于包维护者和黑客托管者

候选人

  • 没有候选人
版本[RSS(RSS)] 0.1.00.2.00.3.00.3.10.5.00.6.00.7.00.8.0
更改日志 CHANGELOG.md公司
依赖关系 基础(>=4.14 && <5)字节删除(>=0.11 && <0.13)字节映射(>=1.2.0 && <1.3)deepseq公司(>=1.4.6.1 && <1.6)拆芯(>=0.1&&<0.2)扁平解析(>=0.5.0.2 && <0.6)通用数据函数(>=0.5.0 && <0.6)通用型插入(>=0.3.0 && <0.4)泛型类型函数(>=0.1.0 && <0.2)解析器组合子(>=1.3.0 && <1.4)细化1(>=0.9&&<0.10)强弱(>=0.6.0 && <0.7)文本(>=1.2.5.0 && <2.1)文本-icu(>=0.7.0.0 && <0.9)类型级别字节字符串(>=0.1.0 && <0.2)[细节]
许可证 麻省理工学院
作者 本·乌节(Ben Orchard)
维护人员 本·乌节(Ben Orchard)<thefirstmuffinman@gmail.com>
类别 数据序列化泛型
主页 https://github.com/raehik/binrep#自述文件
Bug跟踪器 https://github.com/raehik/binrep/issues网站
源回购 头部:git克隆https://github.com/raehik/binrep
已上传 通过瑞希克2024-04-13T00:51:09Z
分配
反向依赖关系 1直接,0间接[细节]
下载 总计332(过去30天内有26个)
额定值 (尚未投票)[估算人贝叶斯平均]
您的评分
  • λ
  • λ
  • λ
状态 用户上传的文档
生成状态未知[还没有报告]

binrep-0.8.0自述文件

[返回包描述]

binrep公司

binrep是一个Haskell库,用于精确建模二进制模式尤其是面向字节的文件格式,并有效地使用它们。以下是它有用的原因:

  • 明确的:使用二进制模式“烘焙”定义Haskell数据类型。使用高度参数化的二进制表示原语,包括空终止数据(例如C型字符串)、Pascal型数据(长度前缀)、大小显式引擎整数、空填充数据。写入如果你想的话,可以使用你自己的原语(如果是这样,请考虑制作一个PR!)。
  • 低样板:通过泛型释放性能分析器和序列化器。(请参见通用二进制表示.)
  • 易于验证:使用强弱图书馆设计模式来定义未验证的数据类型,以便于内部转换,并免费获得验证代码。
  • 表演者:分析和序列化是速度极快,使用字节映射扁平解析.

用法

依赖关系

你需要ICU图书馆。对于运行,您只需要运行时。对于构建时,还需要开发文件(标题等)。或者,您可以使用阴谋集团标志关闭ICU功能。

哲学

建模,而非序列化

binrep擅长对二进制数据格式进行建模。这不是一个平原“序列化”库,其中隐藏了实际的二进制表示用户(故意,有充分理由)。二进制和谷物库是很好的选择。他们对定义高效的二进制编解码器感兴趣用于Haskell数据。然而,他们的编解码器类型类隐藏表示法决定来自用户。在谷物中,

这些都是很好的决定。但它们对类型并不准确。持久性是实施决策。

binrep拒绝处理机器整数,除非它知道结束。字节串分为C型(以空结尾)和Pascal型(长度前缀)。这加强了对二进制数据的仔细考虑已建模。

无样板验证

C样式字节字符串不得包含任何0x00个空字节。Pascal风格字节串必须足够短,以便能够在长度中对其长度进行编码前缀机器整数。但是检查这样的不变量是一项乏味的工作真的要把所有东西包装在一堆新类型中,并强制用户调用每次都有一堆检查函数?

是和否。是的,binrep广泛使用newtypes,尽管大多数是类型同义词超过精炼 的尼基塔·沃尔科夫的精彩新作精炼 的库。不,binrep不想让你每天与这些人争吵。一个解决方案是定义一个简化的“弱”类型,并在它和二进制安全的“强”类型。我的强弱图书馆提供支持此模式的定义,以及将工作的通用派生程序使用binrep的二进制表示原语。

通用二进制表示

(泛型现在由处理通用数据函数。此信息基本相同,但代码在其他地方。)

binrep的泛型派生很少做出决定:

  • 构造函数是通过对每个封闭字段进行顺序编码来进行编码的。
    • 空构造函数因此序列化为0字节。
  • 总和类型通过从构造函数名称获得的标记进行编码。
    • 这与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网站

酷,面向位,而不是面向字节。

许可证

根据麻省理工学院许可证提供。请参见许可证用于许可证文本。