C++ 如何预测Base32解码输出所需的大小?
我有一个std::string,它是base32编码的,我有一个函数对它进行解码。该函数接受char*输入、char*目标和长度。我如何知道到达目的地需要多长时间?我需要知道为目标分配什么数组。如何确定大小?Base32允许使用单个字符对每个C++ 如何预测Base32解码输出所需的大小?,c++,algorithm,C++,Algorithm,我有一个std::string,它是base32编码的,我有一个函数对它进行解码。该函数接受char*输入、char*目标和长度。我如何知道到达目的地需要多长时间?我需要知道为目标分配什么数组。如何确定大小?Base32允许使用单个字符对每个5位进行编码(如32=2^5) 这意味着您需要输出缓冲区大小进行编码: dst_size = src_size * 8 / 5 (1.6 times larger) 但由于base32字符串长度必须是40位的倍数: dst_size = (src_size
5
位进行编码(如32=2^5
)
这意味着您需要输出缓冲区大小进行编码:
dst_size = src_size * 8 / 5 (1.6 times larger)
但由于base32字符串长度必须是40位的倍数:
dst_size = (src_size * 8 + 4) / 5
因此,对于解码(base32->binary),所需的缓冲区大小是相应的
dst_size = ceil( src_size / 1.6 )
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->binary),所需的缓冲区大小是相应的
dst_size = ceil( src_size / 1.6 )
实际上,编码的base32字符串长度计算如下:
ceil(bytesLength / 5.d) * 8
bytesLength/5.f
因为我们想知道5个字节中有多少块,而ceil因为0.1块仍然是1块
ceil(bytesLength/5.f)*8
,因为块由8个字符组成
对于输入数据'a'
,编码结果将是ME====
,因为我们有一块8个字符:两个5位编码字符(ME
)6个填充字符(===
)
同样,解码长度为:
bytesLength * 5 / 8
但是这里的bytesLength
不包括填充字符,因此ME===
bytelength
的长度是2,因此2*5/8==1
我们只有1个字节要解码
有关直观解释,请参见实际上,编码的base32字符串长度计算如下:
ceil(bytesLength / 5.d) * 8
bytesLength/5.f
因为我们想知道5个字节中有多少块,而ceil因为0.1块仍然是1块
ceil(bytesLength/5.f)*8
,因为块由8个字符组成
对于输入数据'a'
,编码结果将是ME====
,因为我们有一块8个字符:两个5位编码字符(ME
)6个填充字符(===
)
同样,解码长度为:
bytesLength * 5 / 8
但是这里的bytesLength
不包括填充字符,因此ME===
bytelength
的长度是2,因此2*5/8==1
我们只有1个字节要解码
有关直观的解释,请参见仅使用动态容器(如
std::string
或std::vector
)而不是预分配的缓冲区可能更容易,否?仅使用动态容器(如std::string
或std::vector
)而不是预分配的缓冲区可能更容易,否?Fwiw:您需要(src_size*8+4)/5
,考虑到最近的5位边界的舍入。一个八位字节需要两个输出字符,一个用于低位5位,一个用于八位字节的其余3位。将字符拉回到八位字节的反比也进行了类似的调整。Fwiw:您需要(src_size*8+4)/5
,考虑到最接近的5位边界的舍入。一个八位字节需要两个输出字符,一个用于低位5位,一个用于八位字节的其余3位。将字符拉回到八位字节的相反方向也同样进行了调整。