Base84:跨平台文件名编码的新解法
Base84 deserves a place in file names
TurboCrypt 工具原本使用 Base91 加密文件名,以适配 Unix 和 macOS 系统,但 Windows 对文件名字符有严格限制,导致兼容性问题。为了解决这一痛点,TurboCrypt 决定转向 Base84 编码。Base84 巧妙避开了 Windows 禁止的 9 个字符以及末尾的点号,仅保留 84 个在 Linux、macOS 和 Windows 上均安全的 ASCII 字符。这种编码方式每 5 个字符可容纳约 32 位数据,扩展率仅为 25.2%,优于 Base64。更妙的是,其编码规则天然避开了 Windows 的保留设备名(如 CON、NUL),无需额外处理。对于需要跨平台安全存储加密文件名的场景,Base84 提供了一个既高效又稳健的解决方案。
Base84 是一个完美的选择,适用于任何需要编码为可移植且文件系统安全名称的场景。
- abound
> 这是按编码顺序排列的字符集:
> ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&'()+,-;=@[]^_`{}~
> 如果我要在 shell 里对这些文件名做任何操作,我绝对不想让文件名里出现最后那 ~22 个字符。
- bensyverson
那些非字母数字字符简直就是麻烦的代名词。各种代理程序(agents)会无法正确转义它们,而且 $ 符号还可能触发变量展开。
Base62(或者用 -_ 扩展的 Base64)完全足够了。
- zahlman
> 它输出的是五字符一组。五这个数字恰到好处:84⁵ = 4,182,119,424,仅比 2³² 少 2.6%。
> 这意味着对于均匀随机输入,一个组大约 95% 的情况下能容纳 32 位,其余情况则是 31 位。
> 编码器会查看接下来的 31 位。如果它们的值小于 84⁵ - 2³¹,说明还有空间容纳第 32 位;否则,它只消耗这 31 位。无论哪种情况,该值都能塞进五个 Base-84 数字里。
> 看起来挺别扭的。