最近开始看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 字符,就会执行 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
}