Strumienie & Kompresja

0

Pochwalony! Mam pytanko dotyczących tych dwóch zagadnień (ale "naukowo" :P ).
Question 1: Jest to pytanie można powiedzieć "estetyczne". Piszę akurat taki niby własny język programowania, w którym można budować własne "aplikacje" (nie są one niestety prawdziwe, tylko takie, które by czytał mój program). Chciałem aby na początku pliku znajdował się napis PKD (coś jak w exe'kach MZ, zipach PK itd...), oraz następnie jakiś rekord. Rekord ten to ma być data, czas skompilowania, następnie generator (kompilator który to zrobił), no i oczywiście na początku ten "rozrużniacz". Gdy napiszę rekord, wypełnie go w programie, czyli np.

type
Tikel: array[0..2] of Char;
Date, Time: TDateTime;
GENERATOR: String[100];
end;

{..}
Tikel := 'PKD';
Date := now;
Time := now;
GENERATOR := 'coś tam';

to wszystko idzie ładnie. Po "skompilowaniu" przez mój programik jakiegoś kodu wszystko jest ładnie, na początku napisane PKD, potem połamane znaczki, napis coś tam. (W programie oczywiście później znajduje się kod). Gdy próbuję to wypełniać dynamicznie, tzn. poprzez uzupełnianie tego z np. plików INI (poprzez odczytanie któregoś z kluczy) to w pliku będzie PKD, połamane znaczki, coś tam, 93 spacje, reszta. I tu właśnie wkrada się błąd. Bez różnicy jak próbuje zapisywać string'i (ładowane dynamicznie), to są one ze spacjami (ładnie wychodzi tylko pierwszy zapisywany string, PChar, array of Char.... ). Probowałem już zapisywać tylko String'i bez rekordów, zamykać i otwierać ponownie strumień i nic ;(. Pomocy!!!!!
Question2: Pytanie odnośnie algorytmów kompresji. Czy istnieją jakieś algorytmy kompresji, które opisane są tak, że kompletny matoł by to zrozumiał?? Szukałem już różnych (bez urazy dla autorów), lecz niestety były albo bez opisów, albo miały opis, lecz niestety nie kumałem, lub nawet nie działały. Czy ktoś mógłby mi wytłumaczyć jakiś taki najprostszy algorytm, bądź link do takiego wytłumaczenia?? Wiem, iż takich pytań nie powinno się zadawać, lecz gdy wymyślam już nawet jakiś własny algorytm - wychodzi z niego algortym ale... kodowania :(. Help!!!!

Bardzo proszę o składanie odpowiedzi. Z góry dziękuję i Pozdrawiam.
KiteK

0

Ad1. Umieść kod, bo to pewnie jakiś błąd w implementacji
Ad2. Chyba najprostrszy znany mi to RLE, ale stosowanie go to wprost śmiech. W PCX chyba był używany. Znacznie ciekawszy jest np. LZW (słownikowy, także jego wcześniejsze wersje LZ-88 czy jakoś tak). Ale prosty to już nie jest. Np. w GIF jest stosowany. Z metod entropijnych chyba Huffmana jest jednym z popularniejszych. W JPEG jest stosowany (oczywiście tylko jako końcowy etap). Trudny nie jest w zrozumieniu, ale to co ja w algorytmach napisałem jest do d*** Muszę to poprawić. Lepiej już kodowanie Shanon-Fano jest opisane. Na podobnych zasadach się opiera. Prosty moim zdaniem jest opisany tutaj Imploding, ale trzebo troszkę posiedzieć, żeby zrozumieć. Z metod entropijnych niesamowitym jest kodowanie arytmetyczne (zwłaszcza wersja dynamiczna), ale jeżeli Huffmana nie potrafisz zrozumieć, to z arytmetycznym będzie gorzej (może nie ze względu na teorię lecz raczej na implementację).
Jest naprawdę wiele metod kompresji, ale... która jest najprostrza to zależy dla kogo.

0

Pochwalony! Oto przykład kodu, który daje "brzydkie" rozwiązanie:

program Project1;

{$APPTYPE CONSOLE}

uses
Windows, Messages, SysUtils, Forms,
Classes, Controls, StdCtrls;
type
TE = packed record
rrt: Integer;
yyy: Int64;
Date: TDateTime;
S: String[50];
hS: String[50];

end;

var
TF: TFileStream;
YY: TE;
begin
YY.rrt := 345;
YY.yyy := 555553;
YY.Date := now;
YY.S := 'ddddddddddssss';
yy.hS := 'gggggggg';
TF := TFileStream.Create('c:windowspulpitplikkk.txt', fmCreate);
TF.WriteBuffer(YY, SizeOf(YY));
TF.WriteBuffer(YY, SizeOf(YY));

TF.Free;

end.

(sorki że tyle niepotrzebnych modułów ale mnyślałem że może wtedy wyjdzie...)
To była consola...
Teraz zwykły programik:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Forms,
Classes, Controls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type
TE = packed record
rrt: Integer;
yyy: Int64;
Date: TDateTime;
S: String[50];
hS: String[50];

end;

var
TF: TFileStream;
YY: TE;
begin
YY.rrt := 345;
YY.yyy := 555553;
YY.Date := now;
YY.S := 'ddddddddddssss';
yy.hS := 'gggggggg';
TF := TFileStream.Create('c:windowspulpitplikkk.txt', fmCreate);
TF.WriteBuffer(YY, SizeOf(YY));
TF.WriteBuffer(YY, SizeOf(YY));

TF.Free;

end;

end.

And nothing... . Zwykła aplikacja ładnie wykonuje te pliki, a mi potrzebna jest konsola. Kilka razy udało mi się w konsoli zrobić taki efekt jak chciałem, lecz tylko kilka razy ;(. Mam nadzieję że pomożecie... :).
Adn2. Sorki Dryobates lecz nic z tego nie zrozumiałem. Czy znasz jakieś dobre kursy, bądź byłbyś tak miły i byś wytłumaczył jakiś najprostszy algorytm kompresji?? :):):) Nie zależy mi żeby on cuda czynił, lecz żeby potrafił jakoś kompresować a potem to odkompresować (i żeby działało :) ). Z góry dzięki. Pozdrowienia dla wszystkich forumowiczów: KiteK

Ps. Sorki za iny typ, ale tamten pochodził z innego projektu, właśnie tego programu i gdybym go umieścił to pan Adam mógłby mieć do mnie pretensje :):):)

0

Hmm. U mnie wszystko ładnie działa (nawet jeżeli tekst ładowany np. z wiersza poleceń).
A RLE może opiszę w artach (jak nie będziesz mógł zrozumieć, to na GG mnie pomęczysz).

[dopisane]
http://http://www.4programmers.net/view.php?id=269

1 użytkowników online, w tym zalogowanych: 0, gości: 1