2012-05-09 41 views
7

tôi cố gắng sử dụng tăng base64 mã hóa, tôi thấy một ví dụ nhưng tôi đã nhận và ngoại lệmã hóa Base64 sử dụng tăng ném ngoại lệ

typedef 
transform_width< binary_from_base64<std::string::const_iterator>, 8, 6 > it_binary_t 

một tôi đã sử dụng

std::string b64E(it_binary_t(Encrip.begin()), it_binary_t(Encrip.end())); 

tôi nhận được nó

Ngoại lệ chưa xử lý tại 0x75b1b9bc trong agentid_coder.exe: Microsoft C++ ngoại lệ: boost :: archive :: iterators :: dataflow_exception tại bộ nhớ vị trí 0x0046ed94 ..

tôi thấy việc này, nhưng tôi nhận được kết quả tương tự

string dec( 
     it_binary_t(Encrip.begin()), 
     it_binary_t(Encrip.begin() + Encrip.length() - 1) 
     ); 

Tôi đang sử dụng MSVS2008 và tăng 1,38

+0

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

Trả lời

28

Đáng tiếc là sự kết hợp của hai iterator_adaptorsbinary_from_base64transform_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_linebreaksremove_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.

+2

Thực hiện tốt việc thêm mã hóa đầy đủ/giải mã thực hiện! Việc thiếu padding bắt tôi quá. – DanDan

+0

bạn có thể giải thích tại sao bạn cần thứ hai% 3 trong (3-s.length()% 3)% 3 – NoSenseEtAl

+0

Chúng tôi cần kết quả là {0,1,2}. Nếu không có% 3 thứ hai, chúng tôi nhận được kết quả là {1,2,3}. % 3 cuối cùng ánh xạ kết quả từ 3 đến 0 và để lại 1 và 2 một mình. Một khả năng khác sẽ là một cái gì đó giống như s.length()% 3? 3-s.length()% 3: 0 – PiQuer