Base64 基于C++ bitset实现。

本文介绍如何利用C++的bitset类实现Base64编码。Base64编码要求将输入数据按3字节一组,转换为4字节的可视字符。代码依据特定的映射表执行编码规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Base64基础知识可以参考此文章,非常详细:http://blog.youkuaiyun.com/morewindows/article/details/11871429


转换为Base64,输入数据必须以三个字节为一组,转为为4个字节的可视字符。下面主要是根据下图的映射表就行编程:



以下代码实现了Base64的编码规则

#include <bitset>
#include <iostream>
#include <string>
#include <vector>
#include <list>
using namespace std;

int main( int argc, char ** argv ){
//原始数据
unsigned char data[] ={0xb3, 0x7a, 0x4f, 0x2c, 0xc0, 0x62, 0x4f, 0x16, 0x90 ,0xf6,0x46, 0x06, 0xcf, 0x38, 0x59, 0x45, 0xb2, 0xbe, 0xc4, 0xea};

// 把data数据转换为对应的 bitset
list< bitset<8> > bits;
for( auto c : data ){
	bitset<8> bit(c);
	bits.push_back(bit);
}
//输入数据必须是3的倍数,不够使用0补充。
while( bits.size() % 3 != 0 ) bits.push_back( bitset<8>() );

//base64编码映射表
const unsigned char bt[64]= 
{ 
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', 
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', 
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', 
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' 
}; 


vector<unsigned char> base64;
while( !bits.empty() ){
	//每次循环,3个八字节转换为4个6字节。参考上图。
	bitset<6> bit6_1,bit6_2,bit6_3,bit6_4;
  bitset<8> bit8_1 = *bits.begin(); bits.pop_front();
	bitset<8> bit8_2 = *bits.begin(); bits.pop_front();
	bitset<8> bit8_3 = *bits.begin(); bits.pop_front();
       
    bit6_1.set(0, bit8_1[2]);
		bit6_1.set(1, bit8_1[3]);
		bit6_1.set(2, bit8_1[4]);
		bit6_1.set(3, bit8_1[5]);
		bit6_1.set(4, bit8_1[6]);
		bit6_1.set(5, bit8_1[7]);

		bit6_2.set(0, bit8_2[4]);  
		bit6_2.set(1, bit8_2[5]); 
		bit6_2.set(2, bit8_2[6]); 
		bit6_2.set(3, bit8_2[7]); 
		bit6_2.set(4, bit8_1[0]); 
		bit6_2.set(5, bit8_1[1]);       
		
		bit6_3.set(0, bit8_3[6]);
		bit6_3.set(1, bit8_3[7]);
		bit6_3.set(2, bit8_2[0]);
		bit6_3.set(3, bit8_2[1]);
		bit6_3.set(4, bit8_2[2]);
		bit6_3.set(5, bit8_2[3]);

		bit6_4.set(0, bit8_3[0]);
		bit6_4.set(1, bit8_3[1]);
		bit6_4.set(2, bit8_3[2]);
		bit6_4.set(3, bit8_3[3]);
		bit6_4.set(4, bit8_3[4]);
		bit6_4.set(5, bit8_3[5]);
		
    base64.push_back( bt[bit6_1.to_ulong() ]);
		base64.push_back( bt[bit6_2.to_ulong() ]);
		base64.push_back( bt[bit6_3.to_ulong() ]);
		base64.push_back( bt[bit6_4.to_ulong() ]);
}

//转换为字符串打印
string strdata(base64.begin(),base64.end());
cout<<strdata<<endl;

return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值