2012-05-09 31 views
7

Ich versuche Schub base64-Encoder zu verwenden, fand ich ein Beispiel, aber ich habe und AusnahmeBase64 kodieren mit boost throw Ausnahme

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

ein I verwendet

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

ich es

Unbehandelte Ausnahme bei 0x75b1b9bc in Agentid_coder.exe: Microsoft C++ Ausnahme: boost :: archive :: iterators :: dataflow_exception im Speicher Lage 0x0046ed94 ..

fand ich diese Abhilfe, aber ich bekomme das gleiche Ergebnis

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

I MSVS2008 bin mit und 1,38

+0

Base64-Encoding-Funktionen mit Boost C++ - Bibliothek: http://StackOverflow.com/Questions/34680998/AttempT-To-Decode-Avalue-Not-In-Base64-Char-Set – ap6491

Antwort

28

Leider ist die Kombination der beiden iterator_adaptorsbinary_from_base64 steigern und transform_width ist kein vollständiger Base64-Encoder/Decoder. Base64 stellt Gruppen von 24 Bits (3 Bytes) als 4 Zeichen dar, von denen jedes 6 Bits codiert. Wenn die Eingangsdaten kein ganzzahliges Vielfaches von solchen 3-Byte-Gruppen sind, müssen sie mit einem oder zwei Nullbytes aufgefüllt werden. Um anzuzeigen, wie viele Füllbytes hinzugefügt wurden, werden ein oder zwei = Zeichen an die codierte Zeichenfolge angehängt.

transform_width, die für die 8-Bit-binär zu 6bit Integer-Konvertierung verantwortlich ist, wendet diese Auffüllung nicht automatisch an, es muss vom Benutzer getan werden. Ein einfaches Beispiel:

#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; 
} 

beachte, dass ich die insert_linebreaks und remove_whitespace Iteratoren hinzugefügt, so dass der Ausgang Base64 schön formatiert und Base64-Eingang mit Zeilenumbrüchen decodiert werden kann. Diese sind jedoch optional.

Run mit verschiedenen Eingabezeichenfolgen, die unterschiedliche Polsterung benötigen:

$ ./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!!! 

Sie können mit diesem online-encoder/decoder die base64-Strings überprüfen.

+2

Gut gemacht, um eine vollständige Codierung hinzuzufügen/Implementierung decodieren! Der Mangel an Polsterung hat mich auch erwischt. – DanDan

+0

können Sie erklären, warum Sie zweite% 3 in (3-s.length()% 3)% 3 – NoSenseEtAl

+0

Wir brauchen ein Ergebnis in {0,1,2}. Ohne das zweite% 3 erhalten wir ein Ergebnis in {1,2,3}. Das letzte% 3 bildet das Ergebnis 3 auf 0 ab und lässt 1 und 2 alleine. Eine andere Möglichkeit wäre etwa s.length()% 3? 3-s.length()% 3: 0 – PiQuer

Verwandte Themen