假设一个 n 字节的数组可以用 2*n 的十六进制字符串表示,有没有办法用少于 2*n 个字符来表示这个 n 字节的数组?
例如,通常情况下,一个整数(int32)可以被认为是一个4字节的数据数组
最佳答案
十六进制的优点是,将一个 8 位字节分成相等的两半是将字节映射为可打印 ASCII 字符的最简单操作。更有效的方法将多个字节视为一个 block :
Base-64 使用 64 个 ASCII 字符一次表示 6 位。每 3 个字节(即 24 位)被分成 4 个 6 位 base-64 数字,其中“数字”是:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
(如果输入的长度不是 3 个字节的倍数,则第 65 个字符“=
”用于末尾的填充)。请注意,base-64 的一些变体形式对最后两个“数字”使用不同的字符。
Ascii85 是另一种表示形式,不太为人所知,但很常用:它通常是二进制数据在 PostScript 和 PDF 文件中的编码方式。这将每 4 个字节(big-endian)视为一个无符号整数,表示为 base 85 中的 5 位数字,每个 base-85 数字编码为 ASCII 代码 33+n(即“!
"表示 0,直到 "u
"表示 84)- 加上可以使用单个字符 "z
"的特殊情况(而不是 " !!!!!
") 来表示 4 个零字节。
(为什么是 85?因为 845 < 232 < 855。)
关于algorithm - 如何用少于 2*n 个字符表示一个 n 字节的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3964023/