1 个不稳定版本

0.0.0 2024年4月2日

#79 in #compact

CC0 许可证

9KB
66

datacode

Datacode 是一种在纯文本中视觉紧凑地编码二进制数据的方法。

它建议将 65,536 个 Unicode 平面中的四个码点,U+40000–4FFFF,分配给所有可能的 16 位值的视觉表示,并将码点 U+1FF00–1FFFF 分配给所有可能的 8 位值的视觉表示。

这两个字符范围将允许视觉紧凑的纯文本二进制数据表示。使用码点 U+40000–4FFFF 表示前两个字节,可选的 U+1FF00–1FFFF 码点用于最后一个字节,如果字节数是奇数。

动机

二进制数据的文本表示无处不在,使用各种不同的表示方式。用途包括加密散列、公钥、网页内容 ID,例如 YouTube 视频 ID 等。

二进制到文本编码方案的示例包括

  • 十六进制,使用集合 [0-9a-f] 中的字符来编码四位。

  • Base64,使用多种 64 个字符集来编码六位。 [0-9a-zA-Z+/] 是常见的字符选择,但存在许多变体。由于每个字符编码六位,有时会使用填充字符(通常为 =)来表示编码后应丢弃的最终位。

  • bech32,主要用于编码比特币地址,它在字符 [qpzry9x8gf2tvdw0s3jn54khce6mua7l] 上实现 BCH 码,每个字符编码五位。

然而,没有为表示二进制数据而专门设计的字符集。

提议

码点 U+40000–4FFFF 被分配给所有 65,536 个可能的两位值的视觉表示,并称为 "paircodes"。码点 1FF00–1FFFF 被分配给所有 256 个一位值的视觉表示,并称为 "bytecodes"。

然后可以使用 N / 2 个 paircode 字符来表示 N 字节序列,如果 N 是奇数,则后面跟一个 bytecode。

使用 datacode 编码的二进制数据比十六进制少 75% 的字符,比 Base64 少 62.5% 的字符。

与十六进制相同的 32 字节哈希值

4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b

与 Base64 相比

Sl4eS6q4nzoyUYqIwxvIf2GPdmc+LMd6shJ7ev3tozs=

与 datacode 相比,使用 字符作为占位符

❑❑❑❑❑❑❑❑❑❑❑❑❑❑❑❑

渲染

每个 paircode 表示为四个单元格的四乘四网格,空单元格表示二进制数字 0,填充单元格表示二进制数字 1

┏━━━━┓
┃....┃
┃....┃
┃....┃
┃....┃
┗━━━━┛

对码网格的每一列代表4位,列从左到右按从低到高的顺序排列,列内位从上到下按从低到高的顺序排列。

每个字节码同样被表示为一个2x4的单元格网格

┏━━┓
┃..┃
┃..┃
┃..┃
┃..┃
┗━━┛

以十六进制编码为 4a5e1e 的三个字节

┏━━━━┓┏━━┓
┃...┃┃█.┃
┃..█┃┃.█┃
┃█.██┃┃.█┃
┃..█┃┃.█┃
┗━━━━┛┗━━┛

填充的单元格以实心方块表示,空单元格以空心方块表示。字符边框可以包含或省略。

数据码字符的字体易于生成,因为所有字符都可以通过程序生成。可能并非所有字体都包含数据码字符,渲染将由专门的后备字体处理代码点范围。

为了便于直观比较数据码字符串,每一列可以渲染为16种颜色之一,每一列对可以渲染为256种颜色之一,具体取决于其值。

应用

数据码可用于在向最终用户暴露文本数据的二进制数据的程序中紧凑地表示二进制数据。由于数据码代码点的大小,它不适合用于面向非用户的程序,因为数据码作为UTF-8的实际编码比等效的二进制或十六进制编码要大。

备注

数据码的一个显著缺点是,它不能被不太积极的用户轻松输入。然而,在几乎所有使用文本表示二进制数据的程序中,几乎在所有情况下,这些表示都不旨在被输入,而且更有可能仅存在于URL和其他主要交互形式是复制和粘贴文本的地方。

数据码的二进制数据更紧凑的编码允许它更容易地复制和粘贴,并更紧凑地嵌入到其他文本中。

此外,文本界面可以为数据码序列提供特殊处理,例如,在序列中的任何位置单击一次即可选择整个连续的数据码字符序列。

数据码还可以通过清楚地划分人类可读文本和二进制数据的文本表示来提高可访问性。

编码

编码和解码很简单。提供了一个Rust实现

无运行时依赖