base64 encoden
-
Also ich hätte ein frage bezüglich meiner funktion:
[cpp]
unsigned long encodeBase64(const char *data, unsigned long size, char** encoded)
{
unsigned long encoded_size;encoded_size = computeBase64EncodedSize(size);
*encoded = (char*) malloc(encoded_size * sizeof(char));
int i;
int count = 0;
int size_array = 0;while(count < encoded_size)
{
for(i = 0; size > i; i--)
{
encoded[0][count++] = lookup_table[(((data + size_array) >> 2) & 0x3F)];
size_array++;
encoded[0][count++] = lookup_table[(((data + (size_array - 1)) & 0x03) << 4) | (((data + size_array) & 0xf0) >> 4)];
size_array++;
encoded[0][count++] = ((data + (size_array - 1)) != 0 ? lookup_table[(((data + (size_array - 1)) & 0x00f) << 2) | (((data + size_array) & 0x0c0) >> 6) ] : '='); //1.Abfrage!!!
size_array++;encoded[0][count++] = ((data + (size_array - 1)) != 0 ? lookup_table[(data + (size_array - 1)) & 0x3f] : '=');// 2.Abfrage!!!
}
}
return encoded_size;
[/cpp]Also meine Frage lautet: Ich überprüfe ja meinen Inhalt vom eigegangenen array und wenn sich dieser nicht mehr ausgeht in ein 6 bit zeichen füll ich es ja mit füllbytes ( = 0) auf!
Ich überprüfe in meiner funktion ob mein arraywert != 0 ist wenn nicht schreib ein '='. Nur bekomme ich dann an der stelle, wo ein A (in base64 auch den wert 0) stehen sollte ein = ?
Was mach ich bei meinen Abfragen falsch?
Is zwar hier einwenig kurz beschrieben aber vl kann mir jemand helfen!Danke im voraus!
mfg
-
for(i = 0; size > i; i--)
wann soll das fertig werden?
(*(data + (size_array - 1)) != 0
es ist keine gute idee das ende der strings mit != 0 zu testen, besonders wenn du danach mit "size_array++;" über den null-terminator des strings schiebst. du solltest dafür eher die länge des strings verwenden.
lg lolo
-
also eigentlich sollte man nie das stringende auf null testen wenn man daten verarbeiten will, die nicht null terminiert sind.
lg lolo
-
Ok danke einmal für den Hinweiß! Stimmt is ein Fehler drinnen!
Aber mein Problem wird sich dadurch nicht lösen, denn wenn der String die Größe 0 hat soll ja ein 'A' stehen und nur wenn er mit Füllbytes aufgefüllt wird ein '='mfg rene
-
wenn das byte 0 ist bekommst ein A, nicht bei länge 0 das ein unterschied.
schau dir das mal an,
und zum testen hier./* ** encodeblock ** ** encode 3 8-bit binary bytes as 4 '6-bit' characters */ void encodeblock( unsigned char in[3], unsigned char out[4], int len ) { out[0] = cb64[ in[0] >> 2 ]; out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ]; out[2] = (unsigned char) (len > 1 ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] : '='); out[3] = (unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] : '='); }
lg lolo
-
Ja stimmt. also ich hab mir dieses Beispiel auch schon angeschaut. Bin aber noch nicht schlau draus geworden, warum er hier len > 1 und len > 2 überprüft!
Danke trotzdem für das Beispiel!mfg
-
also du übergibst der function 3 "normale" bytes aus diesen willst du dann 4 "base64" bytes machen.
//in diesem fall rufst die function gar nicht auf. 0. du übergibst 0 bytes, dann soll die function aber auch nicht aufgerufen werden. denn es ist ja nix zum umwandeln da. //jetzt können 3 fälle auftreten: 1. du übergibst 1 bytes, dann bekommst "AA==" am ende warum 3-1 = 2 2. du übergibst 2 bytes, dann bekommst "AAA=" am ende warum 3-2 = 1 3. du übergibst 3 bytes, dann bekommst "AAAA" am ende warum 3-3 = 0
auch wenn die rechnungen nicht stimmen, konnt ichs mir so am besten merken.
lg lolo
-
Ok danke einmal für den Hinweis!
Werde es jetz einmal umschreiben!
Danke nochmals!mfg
-
Leider schaffe ich es nicht.
Wie kann ich auf die größe 0 testen?
finde unter google auch nichts mehr, was mir weiterhelfen könnte!
Den string mit != 0 zu vergleichen is blöd ich weiß, aber ich weiß nicht (komme nicht drauf) was ich testen soll um aufs '=' zu kommen.
Vl hat jemand einen Vorschlag.Danke im voraus!
mfg
-
hm? du mußt dir schon die länge des strings iwie besorgen. am besten nicht mit einem strlen(). besser wäre sowas wie sizeof() zum testen und sonst bekommst das idr. als rückgabe wert fread().
lg lolo