Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何预测Base32解码输出所需的大小?_C++_Algorithm - Fatal编程技术网

C++ 如何预测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

我有一个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 * 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位。将字符拉回到八位字节的相反方向也同样进行了调整。