我正在寻找一种仅使用笔和纸来传输文件的方法。
这有点类似于纸包,但我想要的密度要低得多,而且我不想使用打印机或扫描仪。
显然,第一个答案是Base64编码。但写入和读取如此多的字符必然会导致错误。就我的目的而言,任何错误都是不可接受的。
第二个答案可能是Reed-Solomon 纠错码(例如,使用韋斯特)。然而,这也是一个问题,因为据我所知,Reed-Solomon 码不能纠正插入/删除错误,在这种情况下,这些错误比替换错误更有可能发生。
是否有任何程序可以使用插入/删除感知纠错码对任意文件进行编码/解码?最好它能在 Windows、Linux 和 Mac OS X 上运行
显然,对于这个普遍问题的任何其他解决方案都是受欢迎的。
答案1
如果希望人们能够读取和写入数据,Base64 和许多文本编码的问题在于它们使用 I、l、1、|、/、0、O、o 等字符,人们会相互混淆。
调查道格拉斯·克罗克福德的Base32编码。它的字母表是经过特别选择的,以避免出现相似的字符,并且它包括错误检测。
答案2
我怀疑otherwise transcribing it will be too difficult
这是否会是个问题。
假设您有红色、绿色、蓝色和黑色。您可以编写一个脚本,将您的数据转换为字母集合RGBY
,例如:(RGBYGBRYBGBYRYYBYBRYYG
或甚至Red Green Blue Black Green Blue Red Black...
在 Excel 表中),然后再转回来。这只是将您的二进制数据从基数 2(或基数 16)转换为您采用的颜色数量(本例中为 4)的基数的问题。
现在,最合理的方法是获得 16 种颜色。这样,你必须使用点数减少 4 倍这使得在笔之间切换是值得的。如果需要,您可以在纸上写下 4 倍的数据,或者在放置点时精度可能会降低 4 倍,缩放比例由您决定。我真的不建议画出每一个点。
例如,5565 bytes
必须乘以二才能得到可以放入网格的十六进制数11130 hexadecimals
(而不是) 。44520 bits
106 x 106
根据数据类型,您可能需要进行一些优化......
暗示:尝试选择最独特(最具对比性)的颜色......
可以使用单支笔的替代方案:
用不同的符号表示不同的十六进制数
-
,,,,,,.../
|
\
+
用小像素字体表示不同的十六进制,见我的头像。
这使得使用 Base 32(或 Base 36)之类的东西变得非常有用。请注意和
Q
是9
相同的,因此您需要将的右上角像素Q
设为白色,以便清晰区分。Base 32 只需要一个53 x 53
网格(例如),再加上一点间距即可区分字母。
答案3
读了你的评论后,这听起来更合理了。我只是不确定你是否打算像这样编码兆字节的数据。
我建议,按照 Oliver 的建议,你可以借用以下页面来增加数据密度:培根的密码监狱帮派经常使用这两种字体来编码信件中的隐藏信息,这些字体通常使用大写字母和小写字母,或者使用印刷体和草书字符,例如
Hey mOM, WHAT's FOR diNNeR TODAY? = ABBBA AAAAA BAAAB BAABA AAAAA
= P A S T A
但是,由于您的目标不是隐写术,因此您只需使用它来扩展您的字形集。这样做,您可以仅使用印刷体和草书字母数字字符就拥有最多 114 个字形,或者使用双字符编码拥有 12996 个代码点。
但是,由于对于二进制数据的直接密码来说,所有大于 15 且小于 256 的字形数量基本相同(这意味着,您仍然需要 2 个字符来表示每个字节,在所有情况下每个字符的数据密度为 4 位),您可以使用额外的 98 个字形/12740 个代码点进行错误检测/纠正。
实现此目的的方法包括:
- 选择一组最容易读写的 256 个字符组合。如果出现任何其他字符组合,则表明这是复制错误。
- 使用两个版本的结束字符作为奇偶校验位。
创建 50 个不同的 16 个字符的字形集。然后您可以使用它们对纠错数据进行密码编码。
例如,
{set 1}{set 1}
表示接下来的 3 个半字节相等0x000
、{set 1}{set 2}
相等0x001
,等等。您可以用它来表示 4096 个可能的 1.5 字节值中的 2500 多个。同样,您可以只使用 16 个集合来表示下一个字节的所有值,从而为您提供 100% 的冗余度,而不会增加编码数据的长度。
或者,您可以使用额外的字形进行额外的压缩:
- 通过选择 98 个单字符代码点来实现可变宽度编码。这将使平均编码内容大小减少约 20%。
- 通过使用不同的字形集或字形集组合来表示重复的半字节/字节,实现类似于游程编码的功能。例如
Ab
=aba
;aB
=abab
;AB
=ababab
... - 使用额外的字形或代码点来表示数据中重复的“单词”和“短语”。虽然预压缩数据可能具有较高的熵,所以我不知道这会有多有效。
为了进一步减少复制错误,我会将编码内容显示在网格线中,然后复制到方格纸上。如果您可以使用具有交替列/行颜色的自定义文具或棋盘式方格网格(带有字母列和编号行)以便快速查找,这将进一步提高复制准确性。
您还可以将交替网格布局与交替字符样式相结合,作为一种简单的错误检测形式。例如,如果奇数列始终为大写,如果抄写员发现自己在奇数列中写小写字母,那么他们就知道自己犯了错误,并且可以开始追溯以查看错误发生的位置。
虽然如果你的首要任务是准确性,我会使用二进制编码+汉明码。在标准方格纸上使用 (12, 8) 缩短的汉明码,可能只能容纳 187 个字节,仅编码 124 个字节的数据。但它可以非常快速地转录(斜线表示 1,无表示 0)并提供单错误校正。添加额外的奇偶校验位 (13, 8) 将提供 SECDED(单错误校正,双错误检测)。使用标准汉明码(如 (15, 11) 或 (31, 26)),您可以获得更高的效率,每张纸分别有 137 和 156 个字节的数据。甚至可以实现更高的代码速率,具体取决于您认为转录器的准确度。
二进制编码也更易于阅读(大声朗读)和 OCR/OMR。