我在这里使用 Ryyst 的代码 -如何在 C 中进行 base64 编码(解码)?- 对图像文件进行 base64 编码并将其插入 HTML 文档。
有用!- 除了 base64 编码输出的第二行之外,行尾有一个杂散的“X”。
无论二进制文件有多大(我尝试过很多),它总是第二行,而且只有第二行。
如果我手动删除杂散的“X”,编码数据与 base64 实用程序的输出完全匹配,并且图像被浏览器正确解码。
我尝试在每个 char 数组的末尾添加“\0”,以确保它们被正确终止(没有区别)。我已经检查过“缓冲区”始终是 60 字节,并且 output_length 始终是 80 字节(它们是)。我已经阅读并重新阅读了 Ryyst 的代码,看看是否有任何东西可能导致它(没有看到任何东西,但我是 C n00b)。我跳了一场雨舞。我找了一个处女扔火山(在这里找不到任何一个)。错误仍然存在。
以下是代码的重要部分 -
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。)
伙计们,我做错了什么?
(更令人沮丧的是,我之前 /did/ 让 Ryyst 的算法完美地工作过一次,所以他的代码 /does/ 工作。)
我正在基于 ARM 的 Debian Linux 系统上使用 gcc 进行编译,如果这有什么不同的话。