1

这是一个新手提出的两部分问题。

首先,我需要一个简单文本的编码(没有小写/大写的区别),并且我需要它比 ASCII 更节省空间。所以我想创建自己的 5 位代码,包含 32 个字符(字母加上一些标点符号)。据我了解,所有现代计算都以字节为单位“思考”,因此如果不使用 8 位编码,我实际上无法定义自己的 5 位编码。

我想做的是:我定义自己的 5 位代码,并将文本保存在 3 个字符块中,每个块保存为 2 个字节。每个块将占用总共 15 位,将存储在两个字节内(保存 16 位)。我可能会使用额外的位进行奇偶校验,即使我实际上并不需要它。这种方法有意义吗?或者有没有更好的方法?或者,我可以定义一个 6 位编码,并将文本保存到每个 4 个字符的块中,每个块保存在 3 个字节中。

问题的第二部分是:假设随后将压缩文本(通过文本的标准无损算法,例如 zip),是否值得我自己创建编码的麻烦(如上所述)?或者压缩算法是否会处理 8 位编码的空间效率低下,使压缩文件与最初使用 5 位或 6 位编码编码的压缩文件一样高效?如果是这样,对预压缩文本使用 5/6 位编码将没有任何优势,因此我将完全跳过这一步。我需要从有经验的程序员那里知道,这是什么情况?

感谢大家

4

2 回答 2

1

压缩算法将更有效地为您处理编码。它将使用霍夫曼、范围或算术编码来使用可变数量的位,甚至是小数位,每个字母,利用您的实际数据的统计数据。如果您不尝试对字符进行预编码,将它们填充到每个小于 8 位,这将工作得更好。压缩算法通过在每个字节中找到的符号计算统计信息,并在字节中寻找重复模式。

于 2013-03-23T19:20:31.170 回答
1
  1. 您无需担心“块”。只需将 5 位附加到 8 位缓冲区,当此缓冲区被填充时,将其刷新并将任何剩余位推入缓冲区。
    唯一的歧义出现在消息的末尾,当您可能有一个部分填充的缓冲区且尚未填充的位数 >= 5 时。因此
    :您必须指定消息的长度(n*5 位)或
    b。您必须仅指定尾随位的长度(更有效)

  2. 压缩算法实际上可能会受到您的自定义打包的不利影响 - (取决于文本等原始数据的类型)。

于 2013-03-23T19:21:08.673 回答