1

最近开始看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
}   
4

0 回答 0