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

标签 algorithm language-agnostic hex number-formatting

假设一个 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/

相关文章:

algorithm - N以下有多少个数是N的互质数?

根据最终销售额订购 'tag line' 事件的算法

algorithm - 有没有一种有效的方法来计算一组给定线段之间的交点数?

language-agnostic - 命名包含文件名的变量?

c - C 中十六进制的 8 字节数

r - 如何将十六进制字符串转换为 R 中的文本?

image - 为什么 GIF 格式不是最紧凑的自然图像格式?

c - 不相交集查找和 union 操作的复杂性

language-agnostic - 为什么要使用基于消息的系统?

Python - 十进制到十六进制,反转字节顺序,十六进制到十进制