【问题标题】:Base91, how is it calculated?Base91,它是怎么计算出来的?
【发布时间】:2018-04-09 05:48:06
【问题描述】:

我一直在网上寻找如何计算 basE91。我找到了诸如 this one 之类的资源,它指定了用于特定值的字符,但我没有找到如何获得该值的方法。

我尝试将输入值更改为二进制并获取 6 位和 7 位的块,但这些都不起作用,并且我得到了不正确的输出。我不希望代码会为我执行此操作,因为我自己编写代码,我只想知道将字符串编码为 baseE91 所需的过程。

【问题讨论】:

  • 你下载他的源码看看他是怎么计算的?对 base64 等基本转换编码有很好的理解会有所帮助。 iiis.org/CDs2010/CD2010SCI/CCCT_2010/PapersPdf/TB100QM.pdf 对算法有很好的描述。 base91csharp.codeplex.com/SourceControl/latest#Base91.cs 提供了一个易于理解的 C# 实现。有一个非常酷的发明,叫做“搜索引擎”,它可以让你快速找到各种东西。我想我花了三分钟才找到上述内容。下次考虑自己做研究。
  • @JimMischel:如果你真的将pdf中的算法与源代码进行比较,你会发现它们并不匹配,源代码遵循更复杂的算法。
  • 感谢您发布此问题。下面的答案提供了比@JimMischel 评论中的链接更容易获得帮助的概述。

标签: algorithm encoding base base91


【解决方案1】:

首先,您需要将输入视为比特流。

然后,从流中读取 13 位,并从中形成一个整数值。如果该整数的值小于等于88,则再多读一位,放入该整数的第14位(最低位为第1位)。这个整数(我们称之为v)的最大值是:8192+88 = 8280。

然后将v 拆分为两个索引:i0 = v%91i1 = v/91。然后使用一个91元素的字符表,输出两个字符:table[i0]table[i1]

(现在你可以看到88的原因:对于最大值(8280),i0i1都变成了90)

所以这个过程比base64更复杂,但更节省空间。此外,与 base64 不同,输出的大小有点依赖于输入字节。长度为 N 的 0x00 序列将比长度为 N 的 0xff 序列短(其中 N 是一个足够大的数字)。

【讨论】:

  • 我假设你的意思是添加额外的位作为第 14 位而不是第 13 位,否则你不会得到 8280 你有完全相同数量的表示值。除此之外,您完全解决了我的问题,这是我找不到的难题。非常感谢。
  • @milo.farrell:是的。这取决于您如何称呼最低位:) 通常,我使用 0 表示最低位。我已经在我的回答中澄清了这一点。
  • b->queue |= *ib++ << b->nbits 不是在范围内反转位的顺序吗?或者这是故意为小端编码?比特流序列0xaa 0xbb 将导致b->queue0xbb 0xaa,不是吗?
猜你喜欢
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 2017-04-11
  • 2014-06-12
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 2013-03-02
相关资源
最近更新 更多