Jestem nowy na forum,a swoją przygodę z programowaniem zacząłem niedawno. Proszę więc o wyrozumiałość.
A więc:
Napisałem 'program' który loguje się na stronkę, wszystko cacy (obsługa ciastek itd.). Chcę, aby serwer zwracał do mnie informacje w postaci skompresowanej (wiadomo, przyspieszy to ściąganie o te kilka ms). No i tu się zaczynają schody.
Doczytałem,że świetnie radzi sobie z tym biblioteka zlib, więc ją ściągnąłem,dodałem do projektu, cacy.
Ale.. nie wiem czemu, ale nie mogę sobie poradzić z dekompresją danych ze strumienia (MemoryStream). Nie wiem jak pobrać wielkość (nie bijcie!) takiej zmiennej. Z dekompresją/kompresją plików poradziłem sobie i kod wygląda tak:
Kompresja:
- Kod: Zaznacz cały
fstream plik, plik_po_zpakowaniu;
plik.open("zakoduj.txt",ios::in|ios::binary);
plik.seekg(0,ios::end);
unsigned int dlugosc_pliku = plik.tellg();
plik.seekg(0,ios::beg);
unsigned char* bufor = new unsigned char[dlugosc_pliku];
for(unsigned int i = 0;i<dlugosc_pliku;i++)
{
plik.read((char*)&bufor[i],1);
}
unsigned long dlugosc_po_zpakowaniu = dlugosc_pliku + 15;
unsigned char* bufor_docelowy = new unsigned char[dlugosc_po_zpakowaniu];
compress2(bufor_docelowy,&dlugosc_po_zpakowaniu,bufor,dlugosc_pliku,Z_BEST_COMPRESSION);
plik_po_zpakowaniu.open("zakodowany.zlib",ios::binary|ios::out);
for(unsigned int i = 0; i<dlugosc_po_zpakowaniu;i++)
{
plik_po_zpakowaniu.write((char*)&bufor_docelowy[i],1);
}
plik.close();
plik_po_zpakowaniu.close();
Dekompresja:
- Kod: Zaznacz cały
fstream plik, plik_po_rozpakowaniu;
plik.open("zakodowany.zlib",ios::binary|ios::in);
plik.seekg(0,ios::end);
int dlugosc_pliku = plik.tellg();
plik.seekg(0,ios::beg);
char* bufor = new char[dlugosc_pliku];
for(int i = 0;i<dlugosc_pliku;i++)
{
plik.read((char*)&bufor[i],1);
}
unsigned long dlugosc_po_rozpakowaniu=100000;
char* bufor_docelowy = new char[dlugosc_po_rozpakowaniu];
uncompress(bufor_docelowy,&dlugosc_po_rozpakowaniu,bufor,dlugosc_pliku);
plik_po_rozpakowaniu.open("rozpakowany.txt",ios::binary|ios::out);
for(unsigned int i = 0; i<dlugosc_po_rozpakowaniu;i++)
{
plik_po_rozpakowaniu.write((char*)&bufor_docelowy[i],1);
}
plik.close();
plik_po_rozpakowaniu.close();
Działa to elegancko, ale raczej przeszkadzałoby mi tworzenie w locie takich małych pliczków, dekompresję itd. Więc moje pytanie brzmi:
Jak pobrać wielkość MemoryStream i później ją zdekompresować.
Pozdrawiam i dziękuję za uwagę.
P.S.
Trochę zagmatwałem, ale mam nadzieję, że zrozumieliście.