在C中的Base64编码 - 这是一个流浪的“X”来自哪里?

时间:2013-06-08 13:50:55

标签: c base64

我正在使用Ryyst的代码 - How do I base64 encode (decode) in C? - 对图像文件进行base64编码并将其插入到HTML文档中。

有效! - 除了base64编码输出的第二行外,在行尾有一个杂散的“X”。

它始终是第二行,只有第二行,无论二进制文件有多大(我尝试了很多)。

如果我手动删除杂散的“X”,编码数据与base64实用程序的输出完全匹配,并且浏览器会正确解码图像。

我尝试在每个char数组的末尾添加“\ 0”以确保它们被正确终止(没有区别)。我已经检查过“buffer”总是60个字节,而output_length总是80个字节(它们是)。我已阅读并重新阅读Ryyst的代码,看看是否有任何原因导致它(没有看到任何内容,但我是C n00b)。我做了一场雨舞。我寻找一个处女扔掉一座火山(在这里找不到任何一座火山)。这个bug仍然存在。

以下是代码的重要部分 -

while (cgiFormFileRead(CoverImageFile, buffer, BUFFERLEN, &got) ==cgiFormSuccess)
{
  if(got>0)
  {
    fputs(base64_encode(buffer, got, &output_length), targetfile);
    fputs("\n", targetfile);
  }
}

base64_encode函数是 -

char *base64_encode(const unsigned char *data, size_t input_length,
    size_t *output_length)
{

  *output_length = 4 * ((input_length + 2) / 3);

  char *encoded_data = malloc(*output_length);
  if (encoded_data == NULL)
    return NULL;
  int i = 0, j = 0;
  for (i = 0, j = 0; i < input_length;)
  {

    uint32_t octet_a = i < input_length ? data[i++] : 0;
    uint32_t octet_b = i < input_length ? data[i++] : 0;
    uint32_t octet_c = i < input_length ? data[i++] : 0;

    uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;

    encoded_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F];
    encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F];
    encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F];
    encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F];
  }

  for (i = 0; i < mod_table[input_length % 3]; i++)
    encoded_data[*output_length - 1 - i] = '=';

  return encoded_data;
}

(正如你所看到的,我也在使用cgic库v 205,但我认为问题不在那里,因为它给出了正确的字节数) (而BUFFERLEN是常数,等于60。)

我做错了什么,伙计们?

(更令人沮丧的是,我/做过/让Ryyst的算法在之前完美无缺地工作,所以他的代码/做了/工作。)

我正在使用基于ARM的Debian Linux系统上的gcc编译,如果这有任何区别的话。

1 个答案:

答案 0 :(得分:1)

将您的功能与您删除的原件进行比较:

encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F];

除此之外,功能是一样的,我猜这只是一个复制错误。

问题是你正在使用BUFFERLEN而不是查看got,它返回读取的数据量,第二行不会读取完整的60个字符,所以你编码的任何垃圾都是在缓冲区的末尾。