CBase64: Kann Methode nicht richtig anwenden. Hilfe.
-
Hallo.
Ich habe von Codeproject.com eine CBase64 Klasse, welche ich für das encodieren von Daten anwenden möchte.
Meine zu konvertierende Daten sind in einem StringArray.Also. Die CBase64 verfügt über die folgenden relevanten Methoden:
void EncodeBuffer (char* p_pInputBuffer, unsigned int p_InputBufferLength, char*p_pOutputBufferString); unsigned int EncodeFile (char* p_pSourceFileName, char* p_pEncodedFileName); unsigned int CreateMatchingEncodingBuffer ( unsigned int p_InputByteCount, char** p_ppEncodingBuffer);
EnocdeFile kann und will ich nicht verwenden. Also muss ich meine eigene Konviertierungsmethode schreiben.
Der Code von 'EncodeFile' sieht so aus:
unsigned int CBase64::EncodeFile ( char* p_pSourceFileName, char* p_pEncodedFileName){ CFile InputFile; CFile OutputFile; if (!InputFile.Open (p_pSourceFileName, CFile::modeRead)) return UNABLE_TO_OPEN_INPUT_FILE; if (!OutputFile.Open ( p_pEncodedFileName, CFile::modeCreate|CFile::modeWrite)) return UNABLE_TO_OPEN_OUTPUT_FILE; char InputBuffer [19 * 3]; char* pOutputBuffer; CreateMatchingEncodingBuffer (sizeof (InputBuffer), &pOutputBuffer); if (pOutputBuffer == 0) return UNABLE_TO_CREATE_OUTPUTBUFFER; unsigned int ReadBytes = 0; while ((ReadBytes = InputFile.Read ( InputBuffer, sizeof (InputBuffer))) != 0){ EncodeBuffer (InputBuffer, ReadBytes, pOutputBuffer); OutputFile.Write (pOutputBuffer, strlen (pOutputBuffer)); } OutputFile.Flush (); OutputFile.Close (); InputFile.Close (); return 0; }
Soweit ist auch das ganze für mich einigermassen verständlich. Aber JETZT zu meiner eigenen Methode: Meine Daten sind in form von Datensätzen vorhanden und diese habe ich jeweils in einen String abgeglegt und diese Strings wiederum in ein StringArray.
Der Prototyp könnte also in etwa so aussehen:
bool MyClass::convert(CStringArray &saData);
Dachte ich könnte es so lösen:
bool MyClass::convert(CStringArray &saData);{ CBase64 b64; CString sRes; CString sSumStr; // build up one fat string for(int i=0; i<saData.GetSize(); i++){ CString str = saData.GetAt(i); sSumStr = sSumStr + str; } char* pInput = NULL; char* pOut = NULL; int iBufferInputsize = 0; while(sSumStr.GetLength() != 0){ CString sBuf = sSumStr.Left(5); pInput = sBuf.GetBuffer(1); // get the inputsize; while(*pInput!='\0'){ pInput++; iBufferInputsize++; } // get back the previous address pInput = pInput - iBufferInputsize; // b64.CreateMatchingEncodingBuffer(iBufferInputsize, &pOut); b64.EncodeBuffer(pInput, iBufferInputsize, pOut); sRes = sRes+pOut; sSumStr.Delete(0, iBufferInputsize); iBufferInputsize = 0; }// end while AfxMessageBox(sRes); return true; }
Leider funktioniert das so nicht wie gewünscht. Wenn ich den zusammengesetzten String "Hello World" nehme, dann sollte das Egebnis wie folgt sein: 'SGVsbG8gV29ybGQ='. ICH erhalte aber nach Ausführung der Methode das Ergebnis 'SGVsbG8=IFdvcmw=2A=='.
Die While-Schlaufe wird ja 3x ausgeführt, weil der String 'Hello World' geteilt durch 5, 3 ergibt. Das erklärt auch halbwegs, weshalb ich 3x ein zusätzliches '=' Zeichen im ErgebnisString erhalte, anstatt nur jenes am Ende. Apropos: Ich bin auch am ende... Wer kann mir helfen.?
Ich bin sicher, dass ich auch bei der Konvertierung vom String in ein char* (oder wie in der Methode 'EncodeFile' nach char[]) nicht wirklich wusste, was ich da tat. Für Hinweise bin ich dankbar.
-
Ne andere Frage: Wieso verwendest du nicht EncodeBuffer?
-
dEUs schrieb:
Ne andere Frage: Wieso verwendest du nicht EncodeBuffer?
Hmmmmmmmm. Ja, du meinst z.b. so?
CBase64 b64; CString str = "Hello World"; char* pIn = str.GetBuffer(10); char* pOut = NULL; b64.CreateMatchingEncodingBuffer(str.GetLength(), &pOut); b64.EncodeBuffer(pIn, str.GetLength(), pOut); AfxMessageBox(pOut);
Jo doch, das geht. Wobei... ist es schlau, wenn man einen grossen String mit z.B. 100'000 Zeichen drinnen hat und diesen so wie oben verarbeitet?
Diesbezüglich gleich noch eine andere Frage: Was soll eigentlich die Minimalgrösse, die man in der Methode CString::GetBuffer(int x) angeben muss?
-
Wieso sollte es nicht schlau sein? Die EncodeFile macht IMHO doch nix anderes.
Andererseits... Die EncodeFile encoded nicht die ganze Datei, sondern immer nur kleine Häppchen...
-
dEUs schrieb:
Wieso sollte es nicht schlau sein? Die EncodeFile macht IMHO doch nix anderes.
Andererseits... Die EncodeFile encoded nicht die ganze Datei, sondern immer nur kleine Häppchen...Weil CString vielleicht auch eine endliche grösse hat? (nicht nur limitiert durch den Systemspeicher).
Ja EncodeFile liest ja nur soviele Zeichen, wie zuvor im Buffer definiert. Das war eigentlich auch mein Ansatz, dass ich nicht einfach einen Mega-Giga langen String übergebe, sondern diesen noch entsprechend aufteile. Damit hatte ich eben meine Probleme
-
sky21 schrieb:
dEUs schrieb:
Wieso sollte es nicht schlau sein? Die EncodeFile macht IMHO doch nix anderes.
Andererseits... Die EncodeFile encoded nicht die ganze Datei, sondern immer nur kleine Häppchen...Weil CString vielleicht auch eine endliche grösse hat? (nicht nur limitiert durch den Systemspeicher).
Ne, das stimmt nicht.