c++怎么实现Base64编码和解码_c++ Base64编码解码方法

C++中通过查表法和位操作实现Base64编码解码,每3字节转为4字符,不足补0并用’=’填充,使用标准字符表完成映射,代码轻量无依赖。

c++怎么实现base64编码和解码_c++ base64编码解码方法

在C++中实现Base64编码和解码,可以通过查表法结合位操作来完成。不需要依赖第三方库,代码轻量且易于集成到项目中。

Base64 编码原理与实现

Base64 编码将每3个字节(24位)的数据拆分为4个6位的块,每个块对应一个索引(0~63),再通过字符表映射为可打印字符。如果输入数据长度不是3的倍数,则用’=’填充。

编码步骤:

每3个字节原始数据转换为4个Base64字符不足3字节时补0,并在结果末尾添加’=’占位使用标准Base64字符表:”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”

以下是C++实现代码:

立即学习“C++免费学习笔记(深入)”;

#include #include static const std::string base64_chars =    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";// 判断是否为有效Base64字符static inline bool is_base64(unsigned char c) {    return (isalnum(c) || (c == '+') || (c == '/'));}std::string base64_encode(const unsigned char* data, size_t len) {    std::string ret;    int i = 0;    int j = 0;    unsigned char char_array_3[3];    unsigned char char_array_4[4];    while (len--) {        char_array_3[i++] = *(data++);        if (i == 3) {            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;            char_array_4[1] = ((char_array_3[0] & 0x03) <> 4);            char_array_4[2] = ((char_array_3[1] & 0x0f) <> 6);            char_array_4[3] = char_array_3[2] & 0x3f;            for (i = 0; i < 4; ++i)                ret += base64_chars[char_array_4[i]];            i = 0;        }    }    if (i) {        for (j = i; j > 2;        char_array_4[1] = ((char_array_3[0] & 0x03) <> 4);        char_array_4[2] = ((char_array_3[1] & 0x0f) <> 6);        char_array_4[3] = char_array_3[2] & 0x3f;        for (j = 0; j < i + 1; ++j)            ret += base64_chars[char_array_4[j]];        while (i++ < 3)            ret += '=';    }    return ret;}std::vector base64_decode(const std::string& encoded_string) {    size_t in_len = encoded_string.size();    size_t i = 0;    size_t j = 0;    int in = 0;    unsigned char char_array_4[4], char_array_3[3];    std::vector ret;    while (in_len-- && (encoded_string[in] != '=') && is_base64(encoded_string[in])) {        char_array_4[i++] = encoded_string[in]; in++;        if (i == 4) {            for (i = 0; i < 4; ++i)                char_array_4[i] = base64_chars.find(char_array_4[i]);            char_array_3[0] = (char_array_4[0] <> 4);            char_array_3[1] = ((char_array_4[1] & 0x0f) <> 2);            char_array_3[2] = ((char_array_4[2] & 0x03) << 6) + char_array_4[3];            for (i = 0; i < 3; ++i)                ret.push_back(char_array_3[i]);            i = 0;        }    }    if (i) {        for (j = i; j < 4; ++j)            char_array_4[j] = 0;        for (j = 0; j < 4; ++j)            char_array_4[j] = base64_chars.find(char_array_4[j]);        char_array_3[0] = (char_array_4[0] <> 4);        char_array_3[1] = ((char_array_4[1] & 0x0f) <> 2);        char_array_3[2] = ((char_array_4[2] & 0x03) << 6) + char_array_4[3];        for (j = 0; j < i - 1; ++j)            ret.push_back(char_array_3[j]);    }    return ret;}

如何使用这些函数

你可以将字符串或二进制数据传入编码函数,得到Base64字符串;也可以把Base64字符串传入解码函数,恢复原始数据。

#include #include int main() {    std::string original = "Hello, Base64 in C++!";    std::cout << "原文: " << original << std::endl;    // 编码    std::string encoded = base64_encode(        reinterpret_cast(original.c_str()),         original.length()    );    std::cout << "编码后: " << encoded << std::endl;    // 解码    std::vector decoded_vec = base64_decode(encoded);    std::string decoded(decoded_vec.begin(), decoded_vec.end());    std::cout << "解码后: " << decoded << std::endl;    return 0;}

注意事项与优化建议

这段代码适用于大多数基础场景,但实际使用时注意以下几点:

性能要求高时:可以预建反向查找表(如数组索引映射),避免每次调用 find 查找字符位置内存安全:确保输入指针有效,特别是处理二进制数据时不要越界跨平台兼容性:标准Base64不包含换行,若需PEM格式(带换行),可每76字符加换行中文或UTF-8数据:先确保字符串按字节正确传递,Base64本身只关心字节流

基本上就这些。代码简洁、无依赖,适合嵌入各种C++项目中使用。

以上就是c++++怎么实现Base64编码和解码_c++ Base64编码解码方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1477090.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 01:44:13
下一篇 2025年12月19日 01:44:25

相关推荐

  • C++如何将程序打包成单个可执行文件_C++ 可执行文件打包方法

    通过静态链接和资源嵌入可将C++程序打包为单个可执行文件。首先在Visual Studio中设置运行时库为/MT或/MTd,或使用MinGW的-static参数,实现C运行时库静态链接,避免依赖msvcp140.dll等系统DLL。接着将图片、配置等资源文件用xxd -i转换为C数组形式嵌入源码,程…

    2025年12月19日
    000
  • c++中怎么把结构体写入二进制文件_C++结构体二进制文件读写操作指南

    使用二进制模式可将POD结构体直接写入文件。定义不含指针的结构体如struct Student,用std::ofstream配合write()和reinterpret_cast写入数据,sizeof确定大小;读取时用std::ifstream和read()恢复内容,注意检查流状态并确保跨平台兼容性;…

    2025年12月19日
    000
  • c++中extern关键字有什么用_extern关键字作用与用法

    extern用于声明变量或函数定义在其他文件中,扩展作用域以实现多文件共享。例如,file1.cpp定义全局变量int globalVar = 100;file2.cpp通过extern int globalVar声明并使用该变量。 在C++中,extern关键字主要用于声明一个变量或函数是在其他文…

    2025年12月19日
    000
  • C++如何实现多态_C++ 多态实现方法

    多态通过虚函数、继承和基类指针或引用实现,允许不同对象对同一消息做出不同响应。示例中Animal基类的speak函数为虚函数,Dog和Cat类重写该函数,通过基类指针调用时根据实际对象类型动态绑定到对应版本,输出“Dog barks.”和“Cat meows.”。纯虚函数使用virtual void…

    2025年12月19日
    000
  • c++中chrono库怎么用来计时_chrono库高精度计时方法

    C++中推荐使用chrono库进行高精度计时,它提供steady_clock和high_resolution_clock用于可靠的时间间隔测量,相比system_clock更稳定。通过now()获取时间点,相减得到duration,再用duration_cast转换为毫秒、微秒等单位,操作直观且精度…

    2025年12月19日
    000
  • c++中如何定义函数模板_c++函数模板定义方法

    函数模板通过template定义实现泛型编程,支持单或多类型参数,如template T max(T a, T b)和template auto add(T a, U b) -> decltype(a + b),可自动推导或显式指定类型,提升代码复用性。 在C++中,函数模板是一种允许使用泛型…

    2025年12月19日
    000
  • c++中如何暂停程序运行_c++程序暂停方法

    答案:C++中常用system(“pause”)、cin.get()、getchar()实现暂停,分别适用于Windows平台、跨平台输入等待及缓冲区处理,还可使用Sleep()或sleep()进行定时暂停,推荐cin.get()用于调试。 在C++中让程序暂停运行,通常是为…

    2025年12月19日
    000
  • c++如何计算程序运行时间_c++程序运行时间测量方法

    使用std::chrono测量C++程序运行时间最准确,通过high_resolution_clock记录开始和结束时间点,计算差值可得毫秒、微秒或纳秒级精度的执行耗时,推荐用于C++11及以上版本。 在C++中测量程序运行时间,常用的方法是使用标准库中的 chrono 头文件。它提供了高精度的时钟…

    2025年12月19日
    000
  • c++中iostream是什么_iostream标准输入输出库详解

    iostream是C++中用于输入输出的核心库,通过流(stream)实现数据在程序与外部设备间的流动,提供cin、cout等对象及操作符进行I/O操作,需包含头文件,支持类型安全且易于使用的输入输出功能。 iostream 是 C++ 中用于处理输入和输出的核心标准库之一。它提供了一套面向对象的输…

    2025年12月19日
    000
  • c++中如何实现指针加减运算_c++指针运算方法

    指针加减运算基于所指向类型大小调整地址偏移,如int指针+1增加4字节,double指针+1增加8字节,确保指向有效位置;可对指针加整数或减整数实现元素跳转,同数组内两指针相减得元素个数;常用于数组遍历和动态内存操作,如遍历new分配的数组。 在C++中,指针的加减运算是基于指针所指向的数据类型进行…

    2025年12月19日
    000
  • c++中void指针是什么_C++ void通用指针类型详解

    void指针是C++中可指向任意类型的通用指针,用于内存操作和通用接口设计,需转换为具体类型后使用,常见于malloc、memcpy等函数,但应谨慎使用以避免类型安全问题。 void指针是C++中一种特殊的指针类型,表示“指向未知类型的指针”。它不能直接解引用,也不能进行指针算术运算,但可以存储任何…

    2025年12月19日
    000
  • c++中引用传递和值传递的区别_c++引用传递与值传递本质区别

    值传递复制实参生成独立副本,函数内修改不影响原变量,适用于小对象;引用传递通过别名共享内存,避免拷贝开销,可直接修改原值,提升大对象传递效率。 在C++中,值传递和引用传递是函数参数传递的两种主要方式,它们在内存使用、性能以及数据修改能力上有本质区别。 值传递:传递的是数据的副本 当使用值传递时,函…

    2025年12月19日
    000
  • c++中如何删除字符串中特定字符_c++删除字符串中特定字符方法

    推荐使用std::remove与erase组合删除字符串中特定字符,该方法高效且简洁;也可通过迭代器遍历删除或构建新字符串,适用于不同场景需求。 在C++中删除字符串中的特定字符有多种方法,常用的是利用标准库中的算法和字符串操作函数。下面介绍几种实用且高效的方式。 使用 std::remove 和 …

    2025年12月19日
    000
  • c++中的参数依赖查找(ADL)是什么_c++ ADL参数依赖查找解析

    ADL(参数依赖查找)使编译器在调用未限定函数时,自动查找参数类型的关联命名空间。例如print(w)能调用MyLib::print,因w为MyLib::Widget类型,编译器通过ADL找到对应命名空间中的函数。规则包括:类类型决定关联命名空间,指针或引用仍使用原类的命名空间,枚举依定义位置确定。…

    2025年12月19日
    000
  • c++中怎么创建和使用动态数组_c++动态数组创建与管理方法

    在C++中,动态数组是通过在堆上分配内存来创建的,允许程序在运行时根据需要确定数组大小。与静态数组不同,动态数组不会在函数结束时自动释放内存,因此需要手动管理以避免内存泄漏。 使用 new 和 delete 创建和释放动态数组 最基本的动态数组创建方式是使用 new[] 操作符,在堆上分配指定数量的…

    2025年12月19日
    000
  • c++中什么是深拷贝和浅拷贝_c++深浅拷贝解析

    深拷贝会复制指针指向的数据,避免共享内存,而浅拷贝仅复制指针地址,导致多个对象共享同一块内存,析构时可能引发崩溃;当类含有动态内存时需手动实现深拷贝,遵循三法则,并推荐使用智能指针或标准容器来管理资源。 在C++中,深拷贝和浅拷贝是对象复制过程中两个核心概念,主要出现在使用默认拷贝构造函数或赋值操作…

    2025年12月19日
    000
  • c++中如何实现双向链表插入_c++双向链表插入方法

    答案是实现双向链表插入需正确处理节点的前驱和后继指针。首先定义包含数据域、前驱和后继指针的节点结构;在头部插入时更新头指针并连接新节点与原首节点;尾部插入需遍历至末尾节点,将新节点链接在其后;指定位置插入则遍历到目标位置前一个节点,调整前后指针关系,注意边界检查与空链表情况;所有操作均需确保指针赋值…

    2025年12月19日
    000
  • c++中new和malloc有什么区别_new与malloc内存分配差异详解

    new是C++运算符,支持构造函数调用、类型安全和异常处理,malloc是C函数,仅分配原始内存,需手动初始化且无类型安全,两者不可混用。 在C++中,new 和 malloc 都可以用来动态分配内存,但它们在机制、用途和行为上有本质区别。理解这些差异对编写高效、安全的C++代码至关重要。 1. 所…

    2025年12月19日
    000
  • c++怎么读取二进制文件_c++二进制文件读取方法

    答案是使用std::ifstream以ios::binary模式读取二进制文件,通过read()方法获取原始字节,可一次性或分块读取,并注意检查流状态和结构体对齐问题。 在C++中读取二进制文件,主要使用标准库中的 fstream 类,并以二进制模式打开文件。关键在于使用 ios::binary 标…

    2025年12月19日
    000
  • c++怎么实现一个模板类_模板类实现教程

    实现C++模板类需先用template定义通用结构,如MyArray类封装动态数组,支持不同类型;通过指定具体类型实例化,如MyArray;可扩展为多参数模板,如Pair并设默认类型;成员函数若在类外定义,须重新声明模板;模板代码通常置于头文件以供编译时实例化。 实现一个C++模板类并不复杂,关键在…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信