base64
-
Hallo an alle!
Also ich habe nun ein weiteres Bsp mit dem ich mich hier beschäftigen möchte!
Es handelt sich um eine base64 kodierung in c!
Ich habe einen code vorgegeben und muss jetz noch die encode/decode funktion implementieren!#include "base64.h" #include <stdio.h> #include <stdlib.h> /** * The lookup table containing the 64 characters for Base64 encoding. */ const char lookup_table[64] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; 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)); // TODO you must implement the Base64 encoding functionality here // Do NOT change the return value! return encoded_size; } unsigned long decodeBase64(const char *data, unsigned long size, char** decoded) { unsigned long decoded_size; decoded_size = computeBase64DecodedSize(data, size); *decoded = (char*) malloc(decoded_size * sizeof(char)); // TODO you must implement the Base64 decoding functionality here // Do NOT change the return value! return decoded_size; } int getIndexFromLookupTable(char c) { if (c >= 'A' && c <= 'Z') return c - 'A'; if (c >= 'a' && c <= 'z') return c - 'a' + 26; if (c >= '0' && c <= '9') return c - '0' + 52; if (c == '+') return 62; if (c == '/') return 63; return -1; } unsigned long computeBase64EncodedSize(unsigned long original_size) { // Check if we need padding bytes if (original_size % 3) original_size += (3 - (original_size % 3)); return (original_size / 3) * 4; } unsigned long computeBase64DecodedSize(const char *data, unsigned long encoded_size) { unsigned long length; // Valid base64 encoding's size must be a multiple of 4 if ((encoded_size % 4) || (encoded_size < 2)) return -1; length = (encoded_size / 4) * 3; // Correct computed length if the encoding contains padded bytes if (data[encoded_size - 1] == '=') --length; if (data[encoded_size - 2] == '=') --length; return length; }
Vl kann mir jemand beim Ansatz helfen! Ich weiß nicht wie ich beginnen soll!
Ich bin schon fleißig am c lernen. Aber leider geht es nicht so schnell!
natürlch möchte ich es dann selber fertig stellen, aber hilfe wäre echt super!Danke im voraus!
mfg rene
-
naja also beim encodieren machst aus 3 byte 4 byte und beim decodieren aus 4 3
void encode(char *in,char *out){ *out = lookup_table[*in&0xFC]; *out = lookup_table[((*in++&0x3)<<4) | (*in&0xF0)]; *out = lookup_table[((*in++&0xF)<<2) | (*in++&C0)]; *out = lookup_table[*in&0x3F]; }
glaub das könnt so stimmen werds mal schnell durch den compiler jagen
lg lolo
-
natürlich sollte man *out++ schreiben
-
Hallo!
Danke einmal für die schnelle Antwort! Ja hab ich auch schon überlegt, aber ich soll keine neue funktion mehr schreiben!
muss nur die funktion:unsigned long encodeBase64(const char *data, unsigned long size, char** encoded)
und
unsigned long decodeBase64(const char *data, unsigned long size, char** decoded)
ausprogrammieren!
Tut mir auch leid falls ich einen Blödsinn schreibe aber i bin no a bissl dumm ;)!mfg rene
-
Tut mir auch leid falls ich einen Blödsinn schreibe aber i bin no a bissl dumm ;)![/quote]
danke ich auchhier mal die richtige function um einen 3er block zu einem 4er block zu encodieren
[url]
void encode(char *in,char *out){
*out++ = lookup_table[(in[0] & 0xFC)>>2];
*out++ = lookup_table[((in[0] & 0x3)<<4) | ((in[1]&0xF0)>>4)];
*out++ = in[1] ? lookup_table[((in[1]&0xF)<<2) | ((in[2]&0xC0)>>6)] : '=';
*out = in[2] ? lookup_table[in[2]&0x3F] : '=';
}
[/url]
lg lolo
-
Ok danke einmal für die funktion!
aber wie schon gesagt, ich soll eigentlich keine funktion mehr schreiben!
kann ich das in meine funktion einbauen:
in dieunsigned long encodeBase64(const char *data, unsigned long size, char** encoded)
Danke!
mfg rene
-
Hi
Er möchte dir ja auch nur ein bsp. Geben wie so ein stream dec bzw. Enc wird. Dan pass doch einfach an was du musst ! Wo ist das Porblem ?
Das ganze nennt sich bitoperationen. Mal fleissig c lernen, dan wirds klappen !
Lowbyte
-
Ok ich werds mir anschauen! Danke nochmal.
mfg rene
-
das eigentlich falsch.
*out++ = in[1] ? lookup_table[((in[1]&0xF)<<2) | ((in[2]&0xC0)>>6)] : '='; *out = in[2] ? lookup_table[in[2]&0x3F] : '=';
und sollte eher so lauten
*out++ = len > 1 ? lookup_table[((in[1]&0xF)<<2) | ((in[2]&0xC0)>>6)] : '='; *out = len > 2 ? lookup_table[in[2]&0x3F] : '=';
aber schau dir doch lieber den source code an http://base64.sourceforge.net/b64.cda sind mit sicherheit weniger fehler drin
-
Ok werd ich machen!
Hätte noch eine Frage: Kann ich einen ch ** mit printf ausgeben!
Meine Fehlermeldung: format %c expects type int but argument has the type char ** ??
danke im voraus!mfg rene