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