c++ 解码base64字符串
时间: 2023-07-25 17:03:32 浏览: 118
在C++中,可以使用base64编码的字符串进行数据传输和存储,同时也可以通过解码进行还原。以下是一份使用C++的Base64解码示例代码:
```c++
#include <iostream>
#include <string>
#include <vector>
using namespace std;
const string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
bool is_base64(unsigned char c) {
return (isalnum(c) || (c == '+') || (c == '/'));
}
string base64_decode(const string &encoded_string) {
vector<unsigned char> base64_chars_vec(base64_chars.begin(), base64_chars.end());
vector<unsigned char> in_bytes(encoded_string.begin(), encoded_string.end());
vector<unsigned char> out_bytes;
int i = 0;
int j = 0;
int in_len = in_bytes.size();
unsigned char char_array_4[4], char_array_3[3];
while (in_len-- && (in_bytes[i] != '=') && is_base64(in_bytes[i])) {
char_array_4[j++] = in_bytes[i];
i++;
if (j == 4) {
for (j = 0; j < 4; j++) {
char_array_4[j] = static_cast<unsigned char>(
find(base64_chars_vec.begin(), base64_chars_vec.end(), char_array_4[j])
- base64_chars_vec.begin());
}
char_array_3[0] = static_cast<unsigned char>((char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4));
char_array_3[1] = static_cast<unsigned char>(((char_array_4[1] & 0xf) << 4) +
((char_array_4[2] & 0x3c) >> 2));
char_array_3[2] = static_cast<unsigned char>(((char_array_4[2] & 0x3) << 6) + char_array_4[3]);
for (j = 0; j < 3; j++) {
out_bytes.push_back(char_array_3[j]);
}
j = 0;
}
}
if (j) {
for (int i = j; i < 4; i++) {
char_array_4[i] = 0;
}
for (j = 0; j < 4; j++) {
char_array_4[j] = static_cast<unsigned char>(
find(base64_chars_vec.begin(), base64_chars_vec.end(), char_array_4[j])
- base64_chars_vec.begin());
}
char_array_3[0] = static_cast<unsigned char>((char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4));
char_array_3[1] = static_cast<unsigned char>(((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2));
char_array_3[2] = static_cast<unsigned char>(((char_array_4[2] & 0x3) << 6) + char_array_4[3]);
for (int i = 0; i < j - 1; i++) {
out_bytes.push_back(char_array_3[i]);
}
}
return string(out_bytes.begin(), out_bytes.end());
}
int main() {
string encoded_string = "SGVsbG8gV29ybGQh";
string decoded_string = base64_decode(encoded_string);
cout << decoded_string << endl; // 输出 "Hello World!"
return 0;
}
```
在这个示例代码中,我们使用了C++标准库中的vector容器来存储解码后的字节数据,这个容器可以自动调整大小,避免了手动管理内存的麻烦。我们将输入的base64字符串转换为一个unsigned char类型的向量in_bytes,然后不断从中取出4个字符进行解码,将解码后的3个字节存储到out_bytes中。最终我们将out_bytes转换为一个字符串并返回。
阅读全文