当前位置: 首页 > 知识库问答 >
问题:

c - C 语言关于base64 解码的bug?

秦光启
2023-07-14

老师们好, 下面这段代码,解码这样一段base64编码的字符串(KioqKipAI++/pSXigKbigKYmKiPvv6Ul4oCm4oCmJio=), 后面多了个“)”

解码正确的内容是:*****@#¥%……&*#¥%……&*
解码错误的内容是:*****@#¥%……&*#¥%……&)

找不到原因了, 请老师们帮忙看看。

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stddef.h>#include <stdint.h>int base64_decode_char(char c) {    if (c >= 'A' && c <= 'Z') {        return c - 'A';    } else if (c >= 'a' && c <= 'z') {        return c - 'a' + 26;    } else if (c >= '0' && c <= '9') {        return c - '0' + 52;    } else if (c == '+') {        return 62;    } else if (c == '/') {        return 63;    } else {        return -1;    }}unsigned char *base64_decode(const char *input, size_t input_len, size_t *output_len) {    if (input_len % 4 != 0) {        fprintf(stderr, "输入字符串长度错误!\n");        return NULL;    }    size_t output_size = input_len / 4 * 3;    if (input[input_len - 1] == '=') {        output_size--;    }    if (input[input_len - 2] == '=') {        output_size--;    }    unsigned char *output = (unsigned char *)malloc(output_size);    if (output == NULL) {        fprintf(stderr, "内存分配失败!\n");        return NULL;    }    size_t i, j;    for (i = 0, j = 0; i < input_len;) {        uint32_t sextet_a = base64_decode_char(input[i++]);        uint32_t sextet_b = base64_decode_char(input[i++]);        uint32_t sextet_c = base64_decode_char(input[i++]);        uint32_t sextet_d = base64_decode_char(input[i++]);        uint32_t triple = (sextet_a << 18) + (sextet_b << 12) + (sextet_c << 6) + sextet_d;        if (j < output_size) {            output[j++] = (triple >> 16) & 0xFF;        }        if (j < output_size) {            output[j++] = (triple >> 8) & 0xFF;        }        if (j < output_size) {            output[j++] = triple & 0xFF;        }    }    *output_len = output_size;    return output;}int main() {    const char *input = "KioqKipAI++/pSXigKbigKYmKiPvv6Ul4oCm4oCmJio=";    size_t input_len = strlen(input);    size_t output_len;    unsigned char *decoded = base64_decode(input, input_len, &output_len);    if (decoded != NULL) {        printf("Base64解码结果:%s\n", decoded);        free(decoded);    }    return 0;}

共有2个答案

曹均
2023-07-14

%s 输出的就以 0 结尾的字符串。在 decode 的过程中生成的串并没有结尾的 0 ,所以会导致输出错误。

宗政财
2023-07-14
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stddef.h>#include <stdint.h>int base64_decode_char(char c) {    if (c >= 'A' && c <= 'Z') {        return c - 'A';    } else if (c >= 'a' && c <= 'z') {        return c - 'a' + 26;    } else if (c >= '0' && c <= '9') {        return c - '0' + 52;    } else if (c == '+') {        return 62;    } else if (c == '/') {        return 63;    } else {        return -1;    }}unsigned char *base64_decode(const char *input, size_t input_len, size_t *output_len) {    if (input_len % 4 != 0) {        fprintf(stderr, "输入字符串长度错误!\n");        return NULL;    }    size_t output_size = input_len / 4 * 3;    if (input[input_len - 1] == '=') {        output_size--;    }    if (input[input_len - 2] == '=') {        output_size--;    }    unsigned char *output = (unsigned char *)malloc(output_size + 1);  // extra byte for null character    if (output == NULL) {        fprintf(stderr, "内存分配失败!\n");        return NULL;    }    size_t i, j;    for (i = 0, j = 0; i < input_len;) {        uint32_t sextet_a = input[i] == '=' ? 0 & i++ : base64_decode_char(input[i++]);        uint32_t sextet_b = input[i] == '=' ? 0 & i++ : base64_decode_char(input[i++]);        uint32_t sextet_c = input[i] == '=' ? 0 & i++ : base64_decode_char(input[i++]);        uint32_t sextet_d = input[i] == '=' ? 0 & i++ : base64_decode_char(input[i++]);        uint32_t triple = (sextet_a << 18) + (sextet_b << 12) + (sextet_c << 6) + sextet_d;        if (j < output_size) output[j++] = (triple >> 16) & 0xFF;        if (j < output_size) output[j++] = (triple >> 8) & 0xFF;        if (j < output_size) output[j++] = triple & 0xFF;    }    output[output_size] = '\0';  // null character at the end    *output_len = output_size;    return output;}int main() {    const char *input = "KioqKipAI++/pSXigKbigKYmKiPvv6Ul4oCm4oCmJio=";    size_t input_len = strlen(input);    size_t output_len;    unsigned char *decoded = base64_decode(input, input_len, &output_len);    if (decoded != NULL) {        printf("Base64解码结果:%s\n", decoded);        free(decoded);    }    return 0;}
 类似资料:
  • 问题内容: 我有一个带有以下标头的Base64编码的对象: 解码对象的最佳方法是什么?我需要去除第一行吗?另外,如果将其转换为字节数组(byte []),如何解压缩它? 谢谢! 我想我起初很miss。通过说标题是 我的意思是这是文件的第一行。因此,为了使用Java或C#库解码文件,是否需要删除这一行? 如果是这样,剥离第一行的最简单方法是什么? 问题答案: 我能够使用以下代码将.xfdl文档转换为

  • 本文向大家介绍C语言解数独程序的源码,包括了C语言解数独程序的源码的使用技巧和注意事项,需要的朋友参考一下 用C语言写的解数独的程序。在linux下测试成功运行。 效果如图: 这是带解的数独,需要填写的部分用数字0代替。 这是程序运行后的效果图。看看,数独已经搞定啦。 程序源码如下: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • C类语言破解 1、bp MessageBoxA(W)(断对话框)—Ctrl+N 2、Point-H法 3、bp GetDlgItem/GetWindowTextA(W)/GetWindowTextLengthA(W) (断输入框) 4、字符串法—插件/搜索所有参考文本

  • 在欢迎你拥抱OpenFOAM之前,首先欢迎来到C++的世界! 若有程序员说 xxx语言是世界上最好的语言 不严重的情况是整个聊天群下午就会爆掉了,严重的是会引起人身攻击的。虽然PHP直接在官方文档里面说 PHP is the best language for web programming 但C++并没有说C++ is the best language for scientific compu

  • C/C++ 语言参考 基本C/C++ 预处理命令 操作符优先级 转义字符 ASCII码表 基本数据类型 关键字 标准 C 库: Standard C I/O Standard C String & Character Standard C Math Standard C Time & Date Standard C Memory Other standard C functions C++ C++

  • C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。