关于coreutil中base64解码的实现

时间:2015-09-23 05:33:40

标签: c linux gnu-coreutils

最近我开始阅读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
}   

0 个答案:

没有答案