如何用少于2*n个字符表示n字节数组

yam*_*pog 3 language-agnostic algorithm hex number-formatting

假设n字节数组可以用十六进制表示为2*n字符串,有没有办法用少于2*n个字符表示n字节数组?

例如,通常,整数(int32)可以被视为4字节数据数组

Mat*_*ery 8

hex的优点是将8位字节拆分为两个相等的一半是将字节映射到可打印ASCII字符所能做的最简单的事情.更有效的方法将多个字节视为块:


Base-64使用64个ASCII字符一次表示6位.每3个字节(即24位)被分成4个6位base-64位,其中"数字"为:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Run Code Online (Sandbox Code Playgroud)

(如果输入不是3个字节长的倍数,则第65个字符" ="用于末尾的填充).请注意,base-64的一些变体形式对最后两个"数字"使用不同的字符.


Ascii85是另一种表示方式,它在某种程度上不太为人所知,但常用:它通常是在PostScript和PDF文件中编码二进制数据的方式.这将每4个字节(big-endian)视为无符号整数,在base 85中表示为5位数字,每个base-85数字编码为ASCII码33 + n(即" !"表示0,最多" u"代表84) - 加上一个特殊情况,其中z可以使用单个字符" "(而不是" !!!!!")来表示4个零字节.

(为什么85?因为84 5 <2 32 <85 5.)