创意网站 案例 下载,推广网站发布文章,创建集团上海公司网站,wordpress采集前端发文一、base64编码介绍
Base64编码是一种将二进制数据转换成ASCII字符的编码方式。它主要用于在文本协议中传输二进制数据#xff0c;例如电子邮件的附件、XML文档、JSON数据等。
Base64编码的特点如下#xff1a; 字符集#xff1a; Base64编码使用64个字符来表示二进制数据…一、base64编码介绍
Base64编码是一种将二进制数据转换成ASCII字符的编码方式。它主要用于在文本协议中传输二进制数据例如电子邮件的附件、XML文档、JSON数据等。
Base64编码的特点如下 字符集 Base64编码使用64个字符来表示二进制数据通常使用字母A-Z、a-z、数字0-9和两个特殊字符 和 /。有时候根据具体需求可能会使用不同的字符集比如URL安全的Base64编码会使用字符集 A-Za-z0-9-_其中 “-” 和 “_” 替代了 “” 和 “/”。 长度增加 Base64编码通常会导致编码后的数据长度略微增加。每三个字节的二进制数据编码成四个Base64字符。 填充字符 如果最后一组不足三个字节Base64编码会使用一个或两个等号 “” 进行填充。 可逆性 Base64编码是可逆的可以通过解码还原回原始的二进制数据。 广泛应用 Base64编码广泛应用于数据传输特别是在文本协议中以及在一些数据存储和表示的场景中。
下面是一个简单的示例展示如何对字符串 “Hello, World!” 进行Base64编码
原始字符串Hello, World!
Base64编码SGVsbG8sIFdvcmxkIQ
二、base64编码原理
Base64编码的原理基于将二进制数据转换成一组可打印字符的过程。它是一种用64个字符来表示所有可能的6位二进制数的方法。以下是Base64编码的基本原理 将数据划分成固定长度的块 首先将要编码的数据按照一定的规则划分成固定长度的块。通常是每三个字节划分为一组因为每组有3个字节24位正好可以表示为4个Base64字符。 将块中的二进制数据转换为整数 将每个块中的三个字节的二进制数据转换为一个24位的整数。这个整数的取值范围是0到2^24-1。 将整数按6位一组划分 将上一步得到的整数按照6位一组划分成四组。因为2^6等于64所以每组的取值范围是0到63。 将每组的值映射到Base64字符集 将每一组得到的数值映射到Base64字符集。Base64字符集通常包含64个字符例如字母A-Z、a-z、数字0-9以及两个额外的字符通常是“和”/。这样就得到了四个Base64字符。 处理末尾的填充 如果原始数据的长度不是3的倍数那么最后一个块可能不足3个字节。在这种情况下会使用一个或两个等号 “” 进行填充以保证每个块都是4个Base64字符。
举个例子假设要编码的数据是ABC对应的ASCII码为65、66、67转换成二进制分别是01000001、01000010、01000011。将这三个字节拼接在一起得到24位的二进制数然后按照上述步骤转换为Base64编码。最后得到的Base64编码为QUJD。
这个过程是可逆的也就是说可以通过反向的过程将Base64编码解码回原始的二进制数据。在实际应用中Base64编码常用于在文本协议中传输二进制数据或者将二进制数据嵌入到文本文件中。
三、base64开发实例
#include iostream
#include cstring
#include openssl/bio.h
#include openssl/evp.h
#include openssl/buffer.hstd::string base64_encode(const unsigned char* input, int length) {BIO* bio BIO_new(BIO_f_base64());BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);BIO* bmem BIO_new(BIO_s_mem());bio BIO_push(bio, bmem);BIO_write(bio, input, length);BIO_flush(bio);BUF_MEM* bptr;BIO_get_mem_ptr(bio, bptr);std::string result(bptr-data, bptr-length);BIO_free_all(bio);return result;
}std::string base64_decode(const char* input) {BIO* bio BIO_new(BIO_f_base64());BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);BIO* bmem BIO_new_mem_buf(input, -1);bio BIO_push(bio, bmem);char buffer[1024];int length BIO_read(bio, buffer, sizeof(buffer));BIO_free_all(bio);return std::string(buffer, length);
}int main() {const char* originalText Hello, Base64!;int originalLength std::strlen(originalText);// Base64 编码std::string encodedText base64_encode(reinterpret_castconst unsigned char*(originalText), originalLength);std::cout Base64 Encoded: encodedText std::endl;// Base64 解码std::string decodedText base64_decode(encodedText.c_str());std::cout Base64 Decoded: decodedText std::endl;return 0;
}
编译 g main.cpp -o main -lssl -lcrypto运行结果如下
四、源码地址
https://gitcode.net/arv002/qt/-/tree/master/Openssl/hash/base64