ďťż

Ładny brzuch

witam. Jak w temacie jak zakodowac dany plik w base64 i uzyskac ciag ? potrzebne mi to do wyslania maila z zalcznikiem...



http://www.adp-gmbh....mon/base64.html - przykład w c++.

nie wiem czy dobrze przeczytales, ale mi chodzi o kodowanie calego pliku, nie koniecznie tekstowego, np. pliku pdf lub bmp...

w jakim języku??
a ogólnie to co za problem widzisz z kodowaniem pliku? Czym on się różni od kodowania textu??




nie wiem czy dobrze przeczytales, ale mi chodzi o kodowanie calego pliku, nie koniecznie tekstowego, np. pliku pdf lub bmp...
Plik możesz potraktować jako ciąg znaków (za pomocą fstream bodajże w c++) i np. wczytać pierwsze 1000 bajtów, kodować, zapisać gdzieś tymczasowo, wczytać kolejne 1000 bajtów, kodować, dopisać do pliku tymczasowego... itp.
Użytkownik logic edytował ten post 16 październik 2007, 05:59
ja kodze w C, nie przepadam (mało powiedziane) za C++ ;] ale spoko dam sobie juz rade thx.

a jednak pojawil sie pewien problem. Mam kod: (tylko prototyp)
int B64EncryptFile( const char* filename, char* buffer, int size_buffer ) { char buff[10024], wynik[10024], *wsk_wynik = wynik; int returned, size = sizeof(buff), i, znak; ZeroMemory(buff, size); FILE *f = fopen("test.exe", "rb"); if ( f == NULL ) printf("Nie mozna otworzyc pliku!\n"); /* size_t fread(void * restrict pointer, size_t size, size_t numberOfItems, FILE * restrict stream); + pointer - wskaźnik na tablicę; + size - rozmiar elementu tablicy; + numberOfItems - liczba elementów do odczytania; + stream - plik, na którym wykonywana jest operacja. */ while ( ! feof(f) ) { znak = fgetc(f); printf("0x%x ", znak); } fclose(f); }
i problem pojawia sie wtedy gdy chcemy zakodowac plik *.exe, bo tam sa bajty zerowe w roznych miejscach programu, przez co nie moge korzystac z roznych funkcji, np. nie moge zachowac kolejnych bajtow z programu w buforze, bo nie wiadomo kiedy jest jego koniec... itd. przez co nie wiem jak zakodowac te pliki ? prosze o pomoc, z gory thx.

P.S: problem nie wystepuje w plikach np. txt, c, cpp itd. czyli ogolnie plikach tekstowych
Użytkownik pura89 edytował ten post 21 październik 2007, 20:28

i problem pojawia sie wtedy gdy chcemy zakodowac plik *.exe, bo tam sa bajty zerowe w roznych miejscach programu, przez co nie moge korzystac z roznych funkcji, np. nie moge zachowac kolejnych bajtow z programu w buforze, bo nie wiadomo kiedy jest jego koniec... itd. przez co nie wiem jak zakodowac te pliki ? prosze o pomoc, z gory thx.

P.S: problem nie wystepuje w plikach np. txt, c, cpp itd. czyli ogolnie plikach tekstowych

Jak to nie wiemy? Przecież jak odczytujesz dane np. przez fread to wiesz ile ich odczytałeś...

tylko ze funkcja fread mi nie dziala, tzn. zawsze pisze ze odczytala 0..., a po drugie to np. funkcja fgets ucianala mi bajty zerowe, podejrzewam ze w przypadku fread jest tak samo...
Użytkownik pura89 edytował ten post 22 październik 2007, 13:06
To może zadasz sobie tród i sprawdzisz z czym to się je? google -> man funkcja (chyba że masz linuxa to sprawdź w lokalnym manie)

fread, fwrite - odczyt/zapis strumienia binarnego
fgetc, fgets, getc, getchar, gets, ungetc - wprowadzanie znaków i
łańcuchów znakowych

Już rozumiesz czemu mówię o fread?

Funkcje fread oraz fwrite zwracają ilość faktycznie zapisanych lub
odczytanych elementów (nie liczbę znaków). Jeśli wystąpi błąd, lub
osiągnięty zostanie koniec pliku, zwracana jst zmniejszona liczba ele-
mentów (lub zero).


to moze przeczytasz moj post wyzej... ja nie wiem o co Tobie chodzi, przecież jakbym nic nie wiedzial i nie szukal to napewno nie pisal bym definicji funkcji oraz jej parametrow w kometarzu w programie.... to ze funkcja zwraca zero itd... to doskonale wiem, tylko dlaczego zwraca blad ? kiedy uzylem funkcji perror zwrocila mi 23 kod bledu, lecz nic zabardzo mi google na ten temat nie pomoglo ....
Użytkownik pura89 edytował ten post 22 październik 2007, 22:18

to moze przeczytasz moj post wyzej... ja nie wiem o co Tobie chodzi, przecież jakbym nic nie wiedzial i nie szukal to napewno nie pisal bym definicji funkcji oraz jej parametrow w kometarzu w programie.... to ze funkcja zwraca zero itd... to doskonale wiem, tylko dlaczego zwraca blad ? kiedy uzylem funkcji perror zwrocila mi 23 kod bledu, lecz nic zabardzo mi google na ten temat nie pomoglo ....
A ja nie bardzo wiem do czego się odwołujesz bo używasz funkcji odczytu tekstowego na pliku binarnym... A czy ten kod Ci działa (argument - nazwa pliku do odczytu)? :>
#include <stdio.h> int main(int argc, char** argv) { FILE* fsrc; int n; char buff[101]; printf("Otwieranie pliku %s... ", argv[1]); fsrc = fopen(argv[1], "r"); printf("Done\n"); while (feof(fsrc) == 0) { n = fread(buff, 1, 100, fsrc); buff[n] = 0; printf("Odczytano bajtów: %d. Dane odczytane:\n%s\n\n", n, buff); }; printf("Koniec odczytu. Zamykanie pliku... "); fclose(fsrc); printf("Done\n"); return 0; };

Kopiowanie pliku ze źródła do przeznaczenia. Działa w 100% dobrze (również na plikach binarnych)...
#include <stdio.h> int main(int argc, char** argv) { FILE *fsrc, *fdst; int n, k; char buff[101]; printf("Otwieranie pliku %s (odczyt)... ", argv[1]); fsrc = fopen(argv[1], "r"); printf("Done\n"); printf("Otwieranie pliku %s (zapis)... ", argv[2]); fdst = fopen(argv[2], "w"); printf("Done\n"); while (feof(fsrc) == 0) { n = fread(buff, 1, 100, fsrc); printf("Odczytano bajtów: %d. Zapisywanie... ", n); k = fwrite(buff, 1, n, fdst); printf("zapisano %d bajtów\n", k); }; printf("Koniec Zapisu. Zamykanie pliku... "); fclose(fdst); printf("Done\n"); printf("Koniec odczytu. Zamykanie pliku... "); fclose(fsrc); printf("Done\n"); return 0; };
Użytkownik Ali240 edytował ten post 23 październik 2007, 10:45
Czasem myślę, że ludzie boją się google... może jakieś przykre wspomnienia z dzieciństwa?
Ja do tego używałem std::copy i sstream, ale to w c++, którego bardzo nie lubisz.


Czasem myślę, że ludzie boją się google... może jakieś przykre wspomnienia z dzieciństwa?
Ja do tego używałem std::copy i sstream, ale to w c++, którego bardzo nie lubisz.

nie spinaj sie tak... jakbys troche przeczytal topic, to wiedzialbys ze jakbym nic nie szukal to na pewno bym tego nie znalazl....
/* size_t fread(void * restrict pointer, size_t size, size_t numberOfItems, FILE * restrict stream); + pointer - wskaźnik na tablicę; + size - rozmiar elementu tablicy; + numberOfItems - liczba elementów do odczytania; + stream - plik, na którym wykonywana jest operacja. */
to mnie torche zmylilo dopiero teraz chyba wiem czemu w moim programie funkcja fread sie nie sprawdzila. Naturalne jest chyba, ze jezeli ta mi nie dzialala to chcialem zastapic ja inna no i znalazlem fgetc. Dzieki Ali za pomoc, tobie tez dotangelo za 'madre' podsumowanie -_- -_-


nie spinaj sie tak... jakbys troche przeczytal topic, to wiedzialbys ze jakbym nic nie szukal to na pewno bym tego nie znalazl....
/* size_t fread(void * restrict pointer, size_t size, size_t numberOfItems, FILE * restrict stream); + pointer - wskaźnik na tablicę; + size - rozmiar elementu tablicy; + numberOfItems - liczba elementów do odczytania; + stream - plik, na którym wykonywana jest operacja. */
to mnie torche zmylilo dopiero teraz chyba wiem czemu w moim programie funkcja fread sie nie sprawdzila. Naturalne jest chyba, ze jezeli ta mi nie dzialala to chcialem zastapic ja inna no i znalazlem fgetc. Dzieki Ali za pomoc, tobie tez dotangelo za 'madre' podsumowanie -_- -_-

Ale co z tego że znalazłeś, skoro nie wiedziałeś jak użyć? Nie jest naturalne że od razu ją odrzuciłeś. Funkcje podstawowe w C raczej nie mają prawa nie działać. Na przyszłość postaraj się trochę więcej samodzielnie pomęczyć (a jak coś nie działa to coś + example na google :P) zanim zagadasz na forum. No i pamiętaj że ludzie raczej starają się pomóc, a nie pisać głupoty (a zdaje mi się że zlałeś moją pierwszą wypowiedź bez zastanowienia się czemu była taka a nie inna - "to moze przeczytasz moj post wyzej... ").
Pozdrawiam i miłego kodzenia.

int B64EncryptFile( const char* filename, char *buffer, int size_buffer ) { #define MALLOC(typ, ilosc) (typ*)malloc((ilosc)*sizeof(typ)) char *wsk_buff, *wynik, *wsk_buff2; // do realloc int size, wsk_buff_length, n; wsk_buff = MALLOC( char, 512 ); if ( wsk_buff == NULL ) return 0; // wielkosc buffora, wsk_buff, zapisujemy ja w zmiennej wsk_buff_length = 512*sizeof(char); // dokladnie czyscimy nasz buforek ZeroMemory(wsk_buff, wsk_buff_length ); FILE *f = fopen("test.exe", "rb"); if ( f == NULL ) printf("Nie mozna otworzyc pliku!\n"); // sprawdzamy czy rozmiar buffora podany przez // uzytkownika nie jest mniejszy od 100 if ( size_buffer < 102 ) return 0; while ( feof(f) == 0 ) { n = fread(buffer, 1, 1/*to zmienic*/, f); buffer[n] = ''; // przenosi buffer + byte_null, na koniec // zawartosci wsk_buff strcat( wsk_buff, buffer ); if ( strlen(wsk_buff) > (wsk_buff_length-100) ) { wsk_buff2 = realloc( wsk_buff, wsk_buff_length + 512*sizeof(char) ); // zwieksz buffor if ( wsk_buff2 != NULL ) wsk_buff = wsk_buff2; // zapisujemy zwiekszony rozmiar bufora do zmiennej wsk_buff_length = wsk_buff_length + 512*sizeof(char); } //printf( "strlen(wsk_buff) - %d \t(wsk_buff_length-100) - %d\n", strlen(wsk_buff), (wsk_buff_length-100) ); ZeroMemory( buffer, size_buffer ); } // zwiekszamy z tego wzgledu ze buffor ma // zawierac zakodowany ciag ktory jest o okolo 36% // dluzszy od tekstu jawnego, wiec mnozymy o 0.4 ~ 40% size = (int)(wsk_buff_length*1.4); wynik = malloc( size ); if ( wynik == NULL ) { printf("Out of Memory !"); return 0; } // zerujemy buforek ZeroMemory( wynik, size ); //printf( "%s, \ndlugosc: %d, a buffor ma rozmiar: %d", wsk_buff, strlen(wsk_buff), wsk_buff_length ); base64_encode( wynik, &size, wsk_buff, strlen(wsk_buff) ); // 4221 printf( "%s", wynik ); // zwalniamy pamiec... free( wsk_buff ); free( wynik ); fclose( f ); }
Zobacz Ali mam taka funkcje, i chce zakodowac nia plik *.exe, porownuje wynik z ta strona http://www.motobit.c...der-encoder.asp lecz odziwo ciagi nie sa te same, w niektorych miejscach sie zgadaza a w innych nie :/ nie wiem w czym lezy problem :/
Użytkownik pura89 edytował ten post 30 październik 2007, 20:25
Poradzilem juz sobie na szczecie, oto kod:
#include <stdio.h> static const char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; #define BAD -1 void to64frombits ( unsigned char * out, const unsigned char * in, int inlen ) { for (; inlen >= 3; inlen -= 3) { *out++ = base64digits[in[0] >> 2]; *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)]; *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)]; *out++ = base64digits[in[2] & 0x3f]; in += 3; } if (inlen > 0) { unsigned char fragment; *out++ = base64digits[in[0] >> 2]; fragment = (in[0] << 4) & 0x30; if (inlen > 1) fragment |= in[1] >> 4; *out++ = base64digits[fragment]; *out++ = (inlen < 2) ? '=' : base64digits[(in[1] << 2) & 0x3c]; *out++ = '='; } *out = ''; } void ReadFile(char *name) { FILE *file; char *buffer, *coded; unsigned long fileLen; //Open file file = fopen(name, "rb"); if (!file) { fprintf(stderr, "Unable to open file %s", name); return; } //Get file length fseek(file, 0, SEEK_END); fileLen=ftell(file); fseek(file, 0, SEEK_SET); //Allocate memory buffer=(char *)malloc(fileLen+1); if (!buffer) { fprintf(stderr, "Memory error!"); fclose(file); return; } //Read file contents into buffer fread(buffer, fileLen, 1, file); fclose(file); int size; //printf( "Wielkosc pliku: %d", strlen(buffer) ); //int i; //for (i = 0; i<fileLen; i++) printf("%c", buffer[i]); size = (int)(1.4*fileLen); coded = (char *)malloc(size); to64frombits( (unsigned char*)coded, (const unsigned char *)buffer, fileLen ); printf("%s", coded); free(buffer); } int main(int argc, char** argv) { if ( argc > 1 ) { ReadFile( argv[1] ); } return 0; };

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •