Kompresja + Stream to String

dział ogólny

Kompresja + Stream to String

Nowy postprzez Slynx » wtorek, 28 czerwca 2011, 19:49

Mam taki drobny problem przy końcu funkcji. To jest funkcja do kompresji:
KOD cpp:     UKRYJ  
String^ Compress2(String^ data)
                {
                        System::IO::Stream^ str = gcnew MemoryStream();
                        System::IO::Compression::GZipStream^ out_stream = gcnew GZipStream(str, CompressionMode::Compress);
                        StreamWriter^ sw = gcnew StreamWriter(out_stream);
                        sw->Write(data);
                        sw->Flush();
                        str->Position = 0;

                        System::IO::StreamReader^ sr = gcnew StreamReader(str);
                        return sr->ReadToEnd();
                };
 

Jak już widać, chcę pokazać skompresowane dane w formie tekstowej (String^). Tu pojawił się, znany mi już wcześniej błąd (pisałem o nim w inny temacie) z pokazaniem tylko dwóch pierwszych znaków.
Pytanie brzmi - jak lub do jakiej formy należy przekonwertować dane z Strumienia po kompresji by mogły być poprawnie umieszczone w zmiennej typu String (managed) i wyświetlone.

Funkcja może dziwić, ale tak, pracuje na danych typu String i chcę by również zwracała String, tylko że skompresowany (do kompresji plików mam osobną, z nią nie było problemów). A po co mi kompresja Stringów taką metodą ? To już zupełnie inna bajka... ; )

---------
Chwila ! Moment. Przecież to Gzip, Konwersja plikowa, więc zawiera nagłówek. No przecież, że też o tym pomyślałem, 15 sekund po dodaniu tematu ; p Zaraz wytnę nagłówek i powinno działać.

---
Ok, wszystko działa, znowu niepotrzebny temat :/
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Kompresja + Stream to String

Nowy postprzez Cyfrowy Baron » środa, 29 czerwca 2011, 08:41

Problemem jest to, że chcesz wyświetlić dane binarne w postaci tekstowej. Swego czasu kinio opracował kod na konwersję danych binarnych do AnsiString i wyświetlenie ich np. w obiekcie typu TMemo. Problem był poruszany w wątku TMemo i wyświetlanie plików binarnych. Kod znajduje się również w serwisie Cyfrowy Baron w dziale: porady -> TRichEdit & Memo -> 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: Kompresja + Stream to String

Nowy postprzez polymorphism » środa, 29 czerwca 2011, 09:54

Problem z kodem kinio jest taki, że on zrobił dokładnie ten sam błąd co Slynx - wszystkie wartości, z wyjątkiem zera, traktowane są jak znaki, a to błąd. Swego czasu był podobny temat (link), w którym podałem kod, który wyświetlał tylko znaki drukowalne, pozostałe zamieniał na █.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Kompresja + Stream to String

Nowy postprzez Slynx » środa, 29 czerwca 2011, 10:32

No innego wyjścia nie ma, przecież nie wszystkie znaki, którą powstaną binarnie da się przedstawić w konkretnym kodowaniu. I tak największe możliwości dałoby chyba Unicode, bo ma największą "rozpiętość". Zamiast tego mógłby np. wyświetlać ciąg binarny, np. {101010101} w miejscach w których nie ma odpowiadającego mu znaku. Ale to szczegół, bo nie aż o tak dokładne przedstawianie mi chodziło, to nie informacje dla użytkownika.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Kompresja + Stream to String

Nowy postprzez polymorphism » środa, 29 czerwca 2011, 11:05

I tak największe możliwości dałoby chyba Unicode, bo ma największą "rozpiętość".

To nie ma aż takiego znaczenia, ponieważ w unikodzie, podobnie jak w ansi, nie każda wartość ma jakiś odpowiednik w postaci znaku, szczególnie znaku drukowalnego. Zatem i tak musiałbyś robić dokładnie to samo, o czym wspomniałem wcześniej.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox


  • 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ł: Brak zalogowanych użytkowników i 5 gości