Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Probleme mit base64 Decodierung?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.01.2014, 09:41 Uhr
downunderthunder



Hallo,
ich bin quasi gerade neu hier im Forum und in C++ auch noch ziemlich neu. Ich habe vorher fast ausschließlich in C++ programmiert.

Ich möchte nun einen string, den ich aus ner Email fische und base64 codiert ist decodieren!

folgendes war mein Versuch:



C++:
string my_test_string = base64_decode("AQADABIFIgARAKkAJ0a80BABABQyMDE0LTAxLTE0VDEwOjAwOjAwWgIA"
"Ci0wLjA0MTg0MjUDAAcxLjAwMzc0BAAJLTAuOTIwNjczBQAHMTEuMzU0MgYABzQ0Ni4zN"
"TEHAAcxMTQuMjIxCAAHNjcuODU5NwkABzg1LjE4ODUKAAc5OS43NTQ1CwAJLTAuMTUz"
"MDYzDAABMA0AATAOAAEwDwALLTAuMDA1MTA3NTYQAAktMC4wNTc3MjQ=");



diese Funktion wird durch den header base64.h includiert! scheint c++ standard zu sein!

leider klappt die Dekodierung so gar nicht! Es werden immer nur 2 Leerzeichen zurückgegeben.

Gebe ich allerdings einen anderen base64 codierten string an, also einen, den ich z.B. http://http://www.base64encode.org/ oder www.motobit.com/util/base64-decoder-encoder.asp codiert habe klappt es.

Den String, den ich hier aus der Email decodieren möchte, kann ich über diese web-Anwendungen auch decodieren, nur die C++ Funktion geht nicht.

kann es sein, dass der string mit nem anderen Schriftsatz codiert ist?
Wie kann ich das berücksichtigen?

alternativ habe ich auch aus Qt
eine Methode für QByteArray genutzt:

C++:
QByteArray qbaSBDdataArray_decoded = QByteArray::fromBase64("AQADABIFIgARAKkAJ0a80BABABQyMDE0LTAxLTE0VDEwOjA"
"wOjAwWgIACi0wLjA0MTg0MjUDAAcxLjAwMzc0BAAJLTAuOTIwNjczBQAHMTEuMzU0Mg"
"YABzQ0Ni4zNTEHAAcxMTQuMjIxCAAHNjcuODU5NwkABzg1LjE4ODUKAAc5OS43NTQ1C"
"wAJLTAuMTUzMDYzDAABMA0AATAOAAEwDwALLTAuMDA1MTA3NTYQAAktMC4wNTc3MjQ=");



der Erfolg blieb auch aus. Das Verhalten ist dasselbe, wie zuvor?

Viele Grüße

dut

-- edit von ao: meterlange Zeilen verkürzt.

Dieser Post wurde am 22.01.2014 um 11:09 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.01.2014, 11:13 Uhr
ao

(Operator)



Zitat von downunderthunder:


C++:
string my_test_string = base64_decode("AQADABIFIgARAKkAJ0a80BABABQyMDE0LTAxLTE0VDEwOjAwOjAwWgIA"
"Ci0wLjA0MTg0MjUDAAcxLjAwMzc0BAAJLTAuOTIwNjczBQAHMTEuMzU0MgYABzQ0Ni4zN"
"TEHAAcxMTQuMjIxCAAHNjcuODU5NwkABzg1LjE4ODUKAAc5OS43NTQ1CwAJLTAuMTUz"
"MDYzDAABMA0AATAOAAEwDwALLTAuMDA1MTA3NTYQAAktMC4wNTc3MjQ=");



diese Funktion wird durch den header base64.h includiert! scheint c++ standard zu sein!


Ehrlich gesagt bezweifle ich das ein bisschen. Wenn es eine Standard-Implementierung gäbe, würde nicht jeder Hinz und Kunz seine eigene liefern.

Poste bitte mal den Prototyp der Funktion, wie er in deiner base64.h definiert ist. Und poste auch den Kopf des Header-Files, damit man sehen kann, um welche Implementierung es geht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.01.2014, 12:26 Uhr
downunderthunder



hey
hier also der Header
base64.h:


C++:
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
using namespace std;

std::string base64_encode(vector<char> , unsigned int len);
std::string base64_decode(std::string const& s);



und die Implementierung:


C++:
#include "base64.h"
#include <iostream>

static const std::string base64_chars =
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             "abcdefghijklmnopqrstuvwxyz"
             "0123456789+/";


static inline bool is_base64(unsigned char c) {
  return (isalnum(c) || (c == '+') || (c == '/'));
}

std::string base64_encode(vector<char>bytes_to_encode, unsigned int in_len) {
  std::string ret;
  int i = 0;
  int j = 0;
  unsigned char char_array_3[3];
  unsigned char char_array_4[4];
  int z=0;
  while (in_len--) {
    char_array_3[i++] = bytes_to_encode[z];
    z++;
    if (i == 3) {
      char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
      char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
      char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
      char_array_4[3] = char_array_3[2] & 0x3f;

      for(i = 0; (i <4) ; i++)
        ret += base64_chars[char_array_4[i]];
      i = 0;
    }
  }

  if (i)
  {
    for(j = i; j < 3; j++)
      char_array_3[j] = '\0';

    char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
    char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
    char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
    char_array_4[3] = char_array_3[2] & 0x3f;

    for (j = 0; (j < i + 1); j++)
      ret += base64_chars[char_array_4[j]];

    while((i++ < 3))
      ret += '=';

  }

  return ret;

}

std::string base64_decode(std::string const& encoded_string) {
  int in_len = encoded_string.size();
  int i = 0;
  int j = 0;
  int in_ = 0;
  unsigned char char_array_4[4], char_array_3[3];
  std::string ret;

  while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
    char_array_4[i++] = encoded_string[in_]; in_++;
    if (i ==4) {
      for (i = 0; i <4; i++)
        char_array_4[i] = base64_chars.find(char_array_4[i]);

      char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
      char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
      char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

      for (i = 0; (i < 3); i++)
        ret += char_array_3[i];
      i = 0;
    }
  }

  if (i) {
    for (j = i; j <4; j++)
      char_array_4[j] = 0;

    for (j = 0; j <4; j++)
      char_array_4[j] = base64_chars.find(char_array_4[j]);

    char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
    char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
    char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

    for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
  }

  return ret;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.01.2014, 17:28 Uhr
ao

(Operator)



Zitat von downunderthunder:
hey
hier also der Header
base64.h:


C++:
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
using namespace std;

std::string base64_encode(vector<char> , unsigned int len);
std::string base64_decode(std::string const& s);




Alles klar. Wollte nur wissen, ob die Funktion vielleicht deshalb Unsinn liefert, weil du du sie falsch benutzt. Scheint aber auf den ersten Blick nicht der Fall zu sein.


Zitat:
und die Implementierung:

Hast du die selber programmiert?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.01.2014, 09:30 Uhr
downunderthunder




Zitat:

Hast du die selber programmiert?


Nee da findet man bei Google zahlreiche Treffer, die das alles gleich gelöst haben... oder auch nicht. Schaue ich mir mal genauer an....

Dieser Post wurde am 23.01.2014 um 09:30 Uhr von downunderthunder editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: