Kerberos
Anmeldungsdatum: 18. Juni 2007
Beiträge: 330
|

8. Juli 2011 20:07
Ich steh gerade etwas auf dem Schlauch. Ich benötige base32 und 64 ent- und decodier Funktionen für C. Hab also ein wenig gegoogled und das hier gefunden: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 |
static int base64_encode(char *, size_t *, const void *, size_t);
static int
base64_encode(char *buf, size_t *buflen, const void *data, size_t size)
/*
* Fills *buf with max. *buflen characters, encoding size bytes of *data.
*
* NOTE: *buf space should be at least 1 byte _more_ than *buflen
* to hold the trailing '\0'.
*
* return value : #bytes filled in buf (excluding \0)
* sets *buflen to : #bytes encoded from data
*/
{
unsigned char *udata = (unsigned char *) data;
int iout = 0; /* to-be-filled output char */
int iin = 0; /* one more than last input byte that can be
successfully decoded */
// hab den Teil weggeschnitten da das file lizenziert ist
buf[iout] = '\0';
/* store number of bytes from data that was used */
*buflen = iin;
return iout;
}
|
Nur wie rufe ich die base64_encode() korrekt auf? Ich bekomme immer einen Speicherzugriffsfehler. 😕
Einfach nur ein Bsp mit "hallo welt" wäre toll.
|
Kerberos
(Themenstarter)
Anmeldungsdatum: 18. Juni 2007
Beiträge: 330
|

8. Juli 2011 21:28
(zuletzt bearbeitet: 8. Juli 2011 21:54)
also ich habs nun per trail and error gelöst: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 | int
main(void)
{
char *str;
void *buf;
void *buflen;
str = malloc(11 * sizeof(char));
str = "hallo welt";
int x = base64_encode((char *)&buf, (size_t *)&buflen, str, 10);
printf("%d\n", x);
printf("%s\n", (char *)&buf);
void *res;
void *reslen;
x = base64_decode((char *)&res, (size_t *)&reslen, (char *)&buf, 14);
printf("%d\n", x);
printf("%s\n", (char *)&res);
return 0;
}
|
ergibt: 14
AgfSBg7GD1vSDa
10
hallo welt scheint aber nicht korrekt implementiert zu sein, denn laut online encoder ergibt hallo welt: aGFsbG8gd2VsdA== ich muss dann wohl groß und kleinbuchstaben umdrehen und mit die 7 müsste eine 8 sein... ☹ mal schauen ob ich das fixen kann
|
Ferio
Anmeldungsdatum: 24. April 2007
Beiträge: 383
|

9. Juli 2011 12:52
(zuletzt bearbeitet: 9. Juli 2011 13:13)
Kerberos schrieb: also ich habs nun per trail and error gelöst:
Pures Glück, dass das nicht abstürzt, habs mal kommentiert. | int
main(void)
{
char *str;
void *buf; // kein definierter Wert
void *buflen; // kein definierter Wert
str = malloc(11 * sizeof(char)); // warum gerade 11? Wenn, dann bitte strlen verwenden.
str = "hallo welt"; // Jetzt hast du ein Speicherleck, da diese Anweisung nicht den String kopiert sondern einfach nur den pointer überschreibt
|
scheint aber nicht korrekt implementiert zu sein, denn laut online encoder ergibt hallo welt: aGFsbG8gd2VsdA==
Vermutlich weil dein Programm irgendwas komisches macht, so wie du mit dem Speicher umgehst. Der Buffer den du übergibst muss übrigens auch reichen für den neuen string. Vermutlich willst du irgendwie sowas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #include <stdlib.h>
#include <string.h>
static int base64_encode(char *, size_t *, const void *, size_t);
int main() {
char *string = "hallo welt";
// Der Base64-String ist 33% größer, +1 für Rundungen, +3 für ==\n am Ende
// Bin mir aber nicht sicher ob das reicht, musst du selbst nochmal recherchieren ob
// das nicht noch größer sein muss
size_t buflen = strlen(string)*1.33 + 1 + 3;
char *buffer = (char*)malloc(sizeof(char)*buflen + 1);
base64_encode(buffer, &buflen, string, strlen(string));
}
|
und nicht vergessen buffer hinterher wieder freizugeben.
|
Kerberos
(Themenstarter)
Anmeldungsdatum: 18. Juni 2007
Beiträge: 330
|

19. Juli 2011 16:47
Danke für die Antwort. Ich werd mich dann nachher gleich wieder dransetzen.
Fürs korrekte Stringhandling sollte ich wohl doch noch mal ein C Buch zur Hand nehmen.
|