如何预测Base32解码输出所需的大小?

时间:2014-05-13 16:03:59

标签: c++ algorithm

我有一个base32编码的std :: string,我有一个解码它的函数。该函数采用char *输入,char *目标和长度。我怎么知道目的地需要多长时间?我需要知道要为目标分配什么数组。我如何确定尺寸?

2 个答案:

答案 0 :(得分:4)

Base32允许使用单个字符对每个5位(32 = 2^5)进行编码。

这意味着您需要输出缓冲区大小进行编码:

dst_size = src_size * 8 / 5 (1.6 times larger)

但是base32字符串长度必须是40位的倍数:

dst_size = (src_size * 8 + 4) / 5

因此,对于解码(base32->二进制),所需的缓冲区大小是相应的

dst_size = ceil( src_size / 1.6 )

答案 1 :(得分:0)

实际上,编码的 base32 字符串长度计算如下:

ceil(bytesLength / 5.d) * 8

bytesLength / 5.f 因为我们想知道我们有多少个 5 字节的块,而 ceil 因为 0.1 个块仍然是 1 个块

ceil(bytesLength / 5.f) * 8 因为块由 8 个字符组成。

对于输入数据 'a',编码结果将是 ME======,因为我们有 1 个 8 个字符的块:两个 5 位编码字符 (ME) 6 个填充字符 ({{1} })

同样的方式,解码长度为:

======

但是这里的 bytesLength * 5 / 8 不包括填充字符,因此 bytesLength ME====== 是 2,给 bytelength 我们只有 1 个字节要解码。

有关直观说明,请参阅 rfc4648 section 9 (page 11)