最近我开始阅读coreutil的源代码(版本8.23,来源:git://git.sv.gnu.org/coreutils)
当读取base64.c(实现base64的编码和解码算法)时,我发现使用-i选项时解码实现有点奇怪(即忽略非base64字符)
以下是代码(src/base64.c line222 ~ 232)
sum = 0
n = fread (inbuf + sum, 1, DEC_B64BLOCKSIZE - sum, in);
if (ignore_garbage)
{
size_t i;
for (i = 0; n > 0 && i < n;)
if (isbase64 (inbuf[sum + i]) || inbuf[sum + i] == '=')
i++;
else
memmove (inbuf + sum + i, inbuf + sum + i + 1, --n - i);
}
设置ignore_garbage
时,无论何时找到非base64 char,都会执行memmove操作。即将所有左边的字符移动到当前位置。
所以,如果有N个非base64字符,将采用N次memmove。我认为这是非常低效的。
相反,为什么我们只是简单地对inbuf进行完全扫描,找到所有非base64字符,并用所有左字符填充inbuf?
此实施是否有任何限制?谢谢你的任何建议。
sum = 0;
n = fread(inbuf+sum, 1, DEC_B64BLOCKSIZE-sum, in);
if (ignore_garbage)
{
size_t i, j = 0;
for (i=0; n>0 && i< n;i++)
{
if (isbase64(inbuf[sum+i]) || inbuf[sum+i] == '='){
inbuf[sum + j] = inbuf[sum + i];
j++;
}
}
// after the loop, inbuf+sum will contain next j valid chars
}