Đáng tiếc là sự kết hợp của hai iterator_adaptors
binary_from_base64
và transform_width
không phải là bộ giải mã/bộ giải mã base64 hoàn chỉnh. Base64 đại diện cho các nhóm gồm 24 bit (3 byte) dưới dạng 4 ký tự, mỗi ký tự mã hóa 6 bit. Nếu dữ liệu đầu vào không phải là bội số nguyên của các nhóm 3 byte như vậy, nó phải được đệm bằng một hoặc hai byte không. Để chỉ ra số lượng byte đệm được thêm vào, một hoặc hai ký tự =
được nối thêm vào chuỗi được mã hóa.
transform_width
, chịu trách nhiệm về chuyển đổi số nguyên nhị phân 8 bit thành 6 bit không áp dụng tính năng đệm này tự động, nó do người dùng thực hiện. Một ví dụ đơn giản:
#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include <boost/archive/iterators/insert_linebreaks.hpp>
#include <boost/archive/iterators/remove_whitespace.hpp>
#include <iostream>
#include <string>
using namespace boost::archive::iterators;
using namespace std;
int main(int argc, char **argv) {
typedef transform_width< binary_from_base64<remove_whitespace<string::const_iterator> >, 8, 6 > it_binary_t;
typedef insert_linebreaks<base64_from_binary<transform_width<string::const_iterator,6,8> >, 72 > it_base64_t;
string s;
getline(cin, s, '\n');
cout << "Your string is: '"<<s<<"'"<<endl;
// Encode
unsigned int writePaddChars = (3-s.length()%3)%3;
string base64(it_base64_t(s.begin()),it_base64_t(s.end()));
base64.append(writePaddChars,'=');
cout << "Base64 representation: " << base64 << endl;
// Decode
unsigned int paddChars = count(base64.begin(), base64.end(), '=');
std::replace(base64.begin(),base64.end(),'=','A'); // replace '=' by base64 encoding of '\0'
string result(it_binary_t(base64.begin()), it_binary_t(base64.end())); // decode
result.erase(result.end()-paddChars,result.end()); // erase padding '\0' characters
cout << "Decoded: " << result << endl;
return 0;
}
Lưu ý rằng tôi đã thêm các insert_linebreaks
và remove_whitespace
lặp, do đó sản lượng base64 được định dạng đẹp và base64 đầu vào với ngắt dòng có thể được giải mã. Đây là những tùy chọn mặc dù.
Run với chuỗi đầu vào khác nhau mà yêu cầu đệm khác nhau:
$ ./base64example
Hello World!
Your string is: 'Hello World!'
Base64 representation: SGVsbG8gV29ybGQh
Decoded: Hello World!
$ ./base64example
Hello World!!
Your string is: 'Hello World!!'
Base64 representation: SGVsbG8gV29ybGQhIQ==
Decoded: Hello World!!
$ ./base64example
Hello World!!!
Your string is: 'Hello World!!!'
Base64 representation: SGVsbG8gV29ybGQhISE=
Decoded: Hello World!!!
Bạn có thể kiểm tra các chuỗi base64 với online-encoder/decoder này.
Các chức năng mã hóa Base64 sử dụng Thư viện Boost C++: http://stackoverflow.com/questions/34680998/attempt-to-decode-a-value-not-in-base64-char-set – ap6491