CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Odczyt pliku binarnego + base64

Odczyt pliku binarnego + base64

dział ogólny

Odczyt pliku binarnego + base64

Nowy postprzez shycat » niedziela, 20 lutego 2011, 20:15

Witam, znalazlam takie komponenty z zestawu INDY: IdBase64Encoder i IdBase64Decoder. Encoder udostepnia fukncje: Base64Encode(const AnsiString) ktora sie zainteresowalam... ale tu mam problem, ktorego nie jestem w stanie rozwiazac, mianowicie: w jaki sposob przy uzyciu tej funkcji zaszyfrowac zrodlo pliku binarnego, np. obrazka, a nastepnie wyswietlic wynik np. w memo ?
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    Windows 7Firefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez shycat » wtorek, 22 lutego 2011, 14:03

Żeby nie bylo, ze chce gotowca czy cos ;) zanim napisalam tutaj na forum, to sama sie troche pomeczylam - gownie ze strumieniami, ale chocbym nie wiem jakich kodow uzywala, to zawsze mam ten sam problem. Plik graficzny na ktorym "testowalam" kod ma ok 1 kb, przez strumienie probowalam podejrzec jego zrodlo, ktore mialam zamiar wczytac do jakiejs zmiennej typu string lub ansistring i nastepnie zakodowac tym base64encode(), ale do mojej zmiennej zawsze wczytywane bylo tylko kilka bajtow z obrazka...
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    Windows 7Firefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez Cyfrowy Baron » wtorek, 22 lutego 2011, 16:06

Problem polega na tym, że w nowym pakiecie INDY te komponenty już nie występują. Zamiast nich są TIdEncoderMIME i TIdDecoderMIME.
Z wykorzystaniem tych komponentów z INDY v10.5.5 można by to zrobić tak:

KOD cpp:     UKRYJ  
/* ZASZYFROWANIE */
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TMemoryStream *srcStream = new TMemoryStream();
 srcStream->LoadFromFile("c:\\test.bmp");
 srcStream->Position = 0;

 TMemoryStream *dstStream = new TMemoryStream();

 IdEncoderMIME1->Encode(srcStream, dstStream, srcStream->Size);

 dstStream->Position = 0;
 dstStream->SaveToFile( "c:\\test2.bmp");

 delete srcStream;
 delete dstStream;
}

/* ODSZYFROWANIE */
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 TMemoryStream *srcStream = new TMemoryStream();
 srcStream->LoadFromFile("c:\\test2.bmp");
 srcStream->Position = 0;

 TMemoryStream *dstStream = new TMemoryStream();

 IdDecoderMIME1->DecodeBegin( dstStream);
 IdDecoderMIME1->Decode(srcStream, srcStream->Size);
 IdDecoderMIME1->DecodeEnd();

 dstStream->Position = 0;
 dstStream->SaveToFile("c:\\test3.bmp");

 delete srcStream;
 delete dstStream;
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez shycat » wtorek, 22 lutego 2011, 20:16

Ja jednak zostane przy moim "starym" :zawiedziony: pakiecie Indy... no i znalazlam podczas buszowania taka funckje: MemoryStreamToString()

i mam kod:

Kod: Zaznacz cały
TMemoryStream *srcStream = new TMemoryStream();
srcStream->LoadFromFile("e:\\abc.jpg");
srcStream->Position = 0;

Memo1->Text=MemoryStreamToString(srcStream);


Ktory mi w podanej ostatniej linii wywala blad: Cannot convert TMemoryStream * to TMemoryStream

nie za bardzo wiem co trzeba tu zrobic... choc domyslam sie, ze ten problem jest blachy i mozna go szybko rozwiazac... jednak na googlach "c++ tmemorystream * to tmemorystream" mi nie pomoglo :(
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    Windows 7Firefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez Cyfrowy Baron » wtorek, 22 lutego 2011, 21:36

Ja jednak zostane przy moim "starym" :zawiedziony: pakiecie Indy...


Nie masz wyboru, wersja 10 nie działa z C++Builder 2006.

Kod: Zaznacz cały
Memo1->Text = MemoryStreamToString(srcStream);


Człowieku! Co to ma wspólnego z bibliotekami TIdBase64Encoder, TIdBase64Decoder? Nie wiem jak działa funkcja MemoryStreamToString, gdyż u mnie jej nie ma.
Znalazłaś jakąś funkcję, nie sprawdziłaś do czego służy i już myślisz że to załatwi sprawę.



Podałem Tobie przykładowy kod z TIdEncoderMIME i TIdDecoderMIME, nie po to żebyś zaczęła stosować nowy pakiet INDY, lecz dlatego, że w starych komponentach działa to pewnie tak samo lub podobnie, czyli podstaw pod TIdEncoderMIME komponent TIdBase64Encoder, a pod TIdDecoderMIME komponent TIdBase64Decoder. Czy sprawdziłaś w specyfikacji INDY jak obsługiwać te funkcje?



[...] ktore mialam zamiar wczytac do jakiejs zmiennej typu string lub ansistring i nastepnie zakodowac tym base64encode(), ale do mojej zmiennej zawsze wczytywane bylo tylko kilka bajtow z obrazka...


Plików binarnych ot tak nie da się wczytać do zmiennej typu AnsiString. Chcesz wczytywać pliki binarne do Memo to zapoznaj się z tym wątkiem: http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=805&hilit&start=45#p4948 oraz w serwisie Cyfrowy Baron w dziale: TRichEdit & Memo z poradą: Wczytywanie plików binarnych do obiektu Memo - wg. pomysłu kinio..
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez shycat » środa, 23 lutego 2011, 00:14

plik binarny chcialam otworzyc w Memo tylko dla sprawdzenia czy poprawnie (w calosci) wyswietla jego zrodlo. Co do "mojej funkcji" to napisalam w pierwszym poscie jej skladnie: Base64Encode(const AnsiString) wiec nie wiem jak chcesz do niej "wcisnac" inne zmienne...
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    Windows 7Firefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez Cyfrowy Baron » środa, 23 lutego 2011, 09:49

shycat napisał(a):IdBase64Encoder i IdBase64Decoder. Encoder udostepnia fukncje: Base64Encode(const AnsiString) ktora sie zainteresowalam...


Funkcja Base64Ecode występuje również w mojej wersji środowiska i nie jest metodą klasy TIdEncoderMIME stąd wniosek , że w Twojej wersji tego komponentu, czyli w TIdBase64Encoder również nie jest metodą tej klasy. Poza tym nie ma nic wspólnego z INDY, gdyż nie pochodzi z tego pakietu. W INDY występuje funkcja Base64Encoded (d na końcu) i jest metodą klasy TIdVCardEmbeddedObject służącej zupełnie do innych celów.
Poza tym zauważ że funkcja Base64Encode oczekuje argumentu typu AnsiString, więc jak chcesz tak wstawić dane binarne?


shycat napisał(a):w jaki sposob przy uzyciu tej funkcji zaszyfrowac zrodlo pliku binarnego, np. obrazka, a nastepnie wyswietlic wynik np. w memo ?


By zaszyfrować dane binarne funkcja musi pobrać dane binarne a nie tekstowe.

shycat napisał(a):plik binarny chcialam otworzyc w Memo tylko dla sprawdzenia czy poprawnie (w calosci) wyswietla jego zrodlo.


Podejrzyj sobie źródło pliku binarnego w jakimś edytorze hexadecymalnym, albo w Notatniku.



Co się tyczy klasy TIdBase64Encoder to jeżeli chcesz szyfrować dane tekstowe, to ta klasa udostępnia do tego celu funkcję CodeString:

KOD cpp:     UKRYJ  
char data[] = "jakieś dane";
String Line = IdBase64Encoder->CodeString(AnsiString( data, sizeof(data) -1 ) );


Sprawdziłem klasę TIdBase64Encoder i okazuje się, że jest ona wyposażona w te same metody co klasa TIdEncoderMIME. Czy po moim ostatnim poście sprawdziłać, czy podany kod działa w przypadku używanych przez Ciebie komponentów?



shycat napisał(a):w jaki sposob przy uzyciu tej funkcji zaszyfrowac zrodlo pliku binarnego, np. obrazka, a nastepnie wyswietlic wynik np. w memo ?


Prawdopodobnie tak:

KOD cpp:     UKRYJ  
/* ZASZYFROWANIE */
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TMemoryStream *srcStream = new TMemoryStream();
 srcStream->LoadFromFile("c:\\test.bmp");
 srcStream->Position = 0;

 TMemoryStream *dstStream = new TMemoryStream();

 IdBase64Encoder1->Encode(srcStream, dstStream, srcStream->Size);

 dstStream->Position = 0;
 dstStream->SaveToFile( "c:\\test2.bmp");

 Memo1->Lines->LoadFromFile("c:\\test2.bmp");

 /* lub bezpośrednio z pamieci */
 Memo1->Lines->LoadFromStream(dstStream);

 delete srcStream;
 delete dstStream;
}

/* ODSZYFROWANIE */
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 TMemoryStream *srcStream = new TMemoryStream();
 srcStream->LoadFromFile("c:\\test2.bmp");
 srcStream->Position = 0;

 TMemoryStream *dstStream = new TMemoryStream();

 IdBase64Decoder->DecodeBegin( dstStream);
 IdBase64Decoder->Decode(srcStream, srcStream->Size);
 IdBase64Decoder->DecodeEnd();

 dstStream->Position = 0;
 dstStream->SaveToFile("c:\\test3.bmp");

 delete srcStream;
 delete dstStream;
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez VooDoo » czwartek, 24 lutego 2011, 14:45

Może trochę offtopic ale tutaj można znaleźć prekompilowane INDY do różnych wersji BCB. Ostatnia wersja z 21st January 2011 against Indy 10 SVN revision 4561
Avatar użytkownika
VooDoo
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): wtorek, 5 sierpnia 2008, 09:03
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: Turbo C++ (BDS2006)
C++ Builder XE
Gadu Gadu: 0
    Windows XPOpera

Re: Odczyt pliku binarnego + base64

Nowy postprzez Darek_C++ » czwartek, 24 lutego 2011, 15:55

W takim razie jak skorzystać z tych "Indy" np w Turbo C++ co odpowiada Pakietowi C++Builder 2006 Indy10C10.zip ?

Jeśli zrobię takie include:

KOD cpp:     UKRYJ  
#include "C:\Indy10C10\C10\IdHTTP.hpp"


pojawia się masa błędów typu:


[C++ Error] IdHTTP.hpp(19): E2209 Unable to open include file 'Idexceptioncore.hpp'
[C++ Error] IdHTTP.hpp(23): E2209 Unable to open include file 'Idreplyrfc.hpp'
[C++ Error] IdHTTP.hpp(24): E2209 Unable to open include file 'Idssl.hpp'
[C++ Error] IdHTTP.hpp(25): E2209 Unable to open include file 'Idzlibcompressorbase.hpp'



itd..
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez Cyfrowy Baron » czwartek, 24 lutego 2011, 16:00

Problem polega na tym, że włączasz do projektu tylko jedną bibliotekę, która jest połączona z innymi i sądzę, że tutaj pojawia się błąd. W C++Builder ustawia się w opcjach odpowiednie powiązania, dzięki temu nie trzeba podawać całej ścieżki do biblioteki, a tylko jej nazwę. Ścieżki do bibliotek powiązanych z tą również są wtedy dodawane automatycznie.
Sprawdzałeś czy w katalogu pakietu INDY masz biblioteki wymienione w błędach?



Używaj tagów BBCode!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez Darek_C++ » czwartek, 24 lutego 2011, 16:08

Cyfrowy Baron napisał(a):W C++Builder ustawia się w opcjach odpowiednie powiązania, dzięki temu nie trzeba podawać całej ścieżki do biblioteki, a tylko jej nazwę.
To w jakim miejscu dla nowego projektu ustawia się te ścieżki include ?

Tak, w katalogu C:\Indy10C10\C10\ są te pliki.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez Cyfrowy Baron » czwartek, 24 lutego 2011, 16:47

Darek_C++ napisał(a):To w jakim miejscu dla nowego projektu ustawia się te ścieżki include ?


Nie ścieżki include lecz w menu Tools -> Options w sekcji Environemnts Options dodaje się ścieżkę dostępu do katalogu zawierającego biblioteki, które chce się używać w projektach. Dzięki temu kompilator wie gdzie ma szukać bibliotek.

http://www.programowanie.cal.pl/forum/viewtopic.php?f=5&t=518&p=3124&hilit#p3124



Darek_C++ napisał(a):Tak, w katalogu C:\Indy10C10\C10\ są te pliki.


Błąd bierze się więc z tego, że TurboC++ nie wie gdzie ma szukać tych bibliotek.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez Darek_C++ » czwartek, 24 lutego 2011, 18:27

Ale i tak nic z tego bo pojawia się dalsza masa błędów:

[C++ Error] Idiohandlerstack.hpp(40): E2316 'TIdBytes' is not a member of 'Idglobal'
[C++ Error] Idiohandlerstack.hpp(40): E2293 ) expected
[C++ Error] Idiohandlerstack.hpp(41): E2316 'TIdBytes' is not a member of 'Idglobal'
[C++ Error] Idiohandlerstack.hpp(41): E2293 ) expected
[C++ Error] Idiohandlerstack.hpp(49): E2303 Type name expected
[C++ Error] Idssl.hpp(42): E2316 'TIdBytes' is not a member of 'Idglobal'
[C++ Error] Idssl.hpp(42): E2293 ) expected
[C++ Error] Idssl.hpp(43): E2316 'TIdBytes' is not a member of 'Idglobal'

Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez Cyfrowy Baron » czwartek, 24 lutego 2011, 21:15

To pewnie dlatego, że te biblioteki nie są zgodne z TurboC++.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt pliku binarnego + base64

Nowy postprzez VooDoo » poniedziałek, 28 lutego 2011, 08:58

Przypuszczam że są nieprawidłowo zainstalowane, na stronie był którą podałem jest dokument opisujący instalacje na różnych środowiskach.
Cyfrowy Baron napisał(a):Problem polega na tym, że włączasz do projektu tylko jedną bibliotekę, która jest połączona z innymi i sądzę, że tutaj pojawia się błąd. W C++Builder ustawia się w opcjach odpowiednie powiązania, dzięki temu nie trzeba podawać całej ścieżki do biblioteki, a tylko jej nazwę. Ścieżki do bibliotek powiązanych z tą również są wtedy dodawane automatycznie.Sprawdzałeś czy w katalogu pakietu INDY masz biblioteki wymienione w błędach?

Niestety z tym się zgodzę - dla XE jest to komponent Azure, na Turbo nie sprawdzałem jak będę miał chwilkę to zobaczę.
Avatar użytkownika
VooDoo
Bladawiec
Bladawiec
 
Posty: 4
Dołączył(a): wtorek, 5 sierpnia 2008, 09:03
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: Turbo C++ (BDS2006)
C++ Builder XE
Gadu Gadu: 0
    Windows XPOpera


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 3 gości