DELPHI Dekodowanie (konwersja) pliku

0

Witam.

Z góry przepraszam jeżeli wybrałem niewłaściwy dział, bądź nadałem tematowi nazwę nie oddającą w pełni jego charakteru.

Zagadnienie jest takie: Mam ja sobie plik, który jest jakby zakodowany(?). Pewien człowiek z anglojęzycznego forum, napisał konwerter do tego typu plików (rozszerzenie attr_pc), który przerabia je na format xml (zupełnie zrozumiały, czytelny, pozwalający na ich łatwą edycję), oraz w drugą stronę (z xml znowu na attr_pc).

Zawsze chciałem wiedzieć jak się coś takiego robi. Możecie coś podpowiedzieć? Jak należy pracować nad plikiem, by zrozumieć zasadę jego działania, by umieć wykonać coś takiego? Ewentualnie z jakim materiałem powinienem się zapoznać, by takową wiedzę posiąść?

Nie proszę was o napisanie tego za mnie. Mnie tu nie chodzi o uzyskanie efektu, ale o nauczenie się czegoś. Dlatego też przyjmę wszystko - przykłady, fragmenty kodu, linki - będę wdzięczny za każdy typ materiału dydaktycznego.

Wrzucam tu plik z paczuszką spakowaną rarem. W środku jest 1 mały pliczek (kilka kb) w 2 wersjach (attr_pc oraz skonwertowany wcześniej wspomnianą aplikacją, do xml):
http://www38.zippyshare.com/v/56006482/file.html

PS. Zapytałem tego jegomościa o pomoc, a on udostępnił mi schemat budowy owego pliku (attr_pc):

 Header:
data[4] 	signature (normally 'BAF ')
uint32		always 0x64
data[4]		CRC32 of everything but the header
data[5]		unknown, always 0x00
uint32		Table section offset
uint32		Table count
uint32		Data section offset
uint32		Data count
uint32		String count
uint32		String offset section offset
uint32		String section offset

String offset section:
uint32[string count]		just an array of uints

String section:
char*[string count]		c-style strings, 0-terminated
To be read in this fashion:
The string offset section contains offsets which you need to add to the base string section offset to read a string. Strings are referenced by their index within the string offset section.

Data section:
uint32		type
uint32		key index (index into string offset section)
	switch(type):
		case 0:
			bool (32bit!)
		case 1:
			float
		case 2:
			int32
		case 3:
			uint32 (index into string offset section)
		case 4:
			uint32 (table index)
			
Table section:
uint32		num childs
uint32		index of the first child (index into the data section)

Przyznam się szczerze że nic mi to nie mówi. Nie mam pojęcia co to wszystko znaczy, co mam z tym zrobić, ani tym bardziej jak miałbym uzyskać coś podobnego samodzielnie.

Jeszcze raz proszę o pomoc (wszelaką).

Pozdrawiam.

0

data[x] = data: array[0..x-1] (objętość: x bajtów)
uint32 = integer bądź longint (na 32-bitowych systemach integer==longint, a na 64-bitowych - integer==int64) (objętość: sizeof(Integer) bajtów (zazwyczaj 4)).

Do odczytu pojedynczych danych użyj BlockRead...


Jak dla mnie, jeżeli nie wiesz, co masz zrobić, aby chociażby odczytać sam nagłówek, to daruj sobie.

0

Przyznam się szczerze że nic mi to nie mówi. Nie mam pojęcia co to wszystko znaczy, co mam z tym zrobić, ani tym bardziej jak miałbym uzyskać coś podobnego samodzielnie.

Skoro ci to nic nie mówi to znaczy że jeszcze jesteś zbyt słaby żeby nawet mając deklarację na talerzu napisać swój konwerter. Zapewne za parę lat wszystko ogarniesz i nie będzie to trudne. W każdym razie pytać nas o wskazówkę jeżeli nie ogarnia się tematu to proszenie o gotowca, bo i tak zasady działania nie zrozumiesz. Najlepiej po prostu pisz programy na swoje możliwości. Tak żeby się rozwijać ale nie robić tego czego nie ogarniasz.

(na 32-bitowych systemach integer==longint, a na 64-bitowych - integer==int64) (objętość: sizeof(Integer) bajtów (zazwyczaj 4)).

Jak jesteś na Lazarusie/FPC to sobie sprawdź że na 64-bitach integer ma... 32 bity :) .

0

-oho123 - Rozumiem Twój punkt widzenia, ale pisząc coś takiego mi nie pomagasz... Przecież wyraźnie napisałem, że chcę się tego NAUCZYĆ, samo napisanie programu nie jest celem, tylko środkiem dydaktycznym (dlatego gotowiec nie wchodzi w grę, chyba że z obszernym komentarzem). I owszem, jestem dość zielony, bo nie jestem programistą. Zajmuję się tym z zamiłowania (takie mam hobby), więc to nie jest tak, że teraz nie umiem a za parę lat to się zmieni (bo mnie np. tego na studiach wyuczą). Jeżeli chcę to opanować, muszę to zrobić sam. Po to właśnie założyłem ten temat. Czytałem kompendium Delphi (z tego forum) i różne inne kursy, ale to za mało. Potrzebuję więcej informacji, ale nie wiem czego i gdzie mam szukać, dlatego pytam bardziej obeznanych od siebie.

I do tej pory właśnie tak się uczyłem: natrafiając na problem, szukałem jego rozwiązania. W kursach ciężko o takie rzeczy ;/. Pisanie "na moje możliwości" z omijaniem napotkanych problemów, do niczego mnie nie doprowadzi...

Pozdrawiam.

0

Rozumiem Twój punkt widzenia, ale pisząc coś takiego mi nie pomagasz...

Gdybym mógł/chciał/miał tyle czasu żeby tobie i jeszcze najlepiej wszystkim newbie pomóc...

gotowiec nie wchodzi w grę, chyba że z obszernym komentarzem

Moim zdaniem newbie nie powinni widzieć gotowców na oczy, by to ułatwiło myślenie i rozwijanie logiki. Ale oczywiście wiem że to ciężkie do wykonania i nawet ja za młodu używałem gotowców.

I owszem, jestem dość zielony, bo nie jestem programistą. Zajmuję się tym z zamiłowania (takie mam hobby), więc to nie jest tak, że teraz nie umiem a za parę lat to się zmieni (bo mnie np. tego na studiach wyuczą).

Jestem całkowitym samoukiem. Więc wiem o czym mówię.
Programistą jest osoba która programuje, nie ważne czy zawodowo czy nie.

Jeżeli chcę to opanować, muszę to zrobić sam. Po to właśnie założyłem ten temat. Czytałem kompendium Delphi (z tego forum) i różne inne kursy, ale to za mało.

Jeżeli to za mało to eksperymentuj! Nauczysz się rozwiązywać problemy, a to się przydaje programistom.

Potrzebuję więcej informacji, ale nie wiem czego i gdzie mam szukać, dlatego pytam bardziej obeznanych od siebie.

Jeżeli google zawodzi to licz na siebie. Jeżeli nauczysz się eksperymentować to jeżeli czegoś nie znajdziesz to będziesz umiał sobie bez tego dać radę metodą prób i błędów.
Mały przykład: Miałem problem z moją biblioteką która w dziwny sposób się wywalała w ntdll. Najlepsze debuggery mi niewiele pomagały. Również google o tym milczało. Po napisaniu parudziesięciu testów udało mi się zdiagnozować problem i go usunąć. Nikt na IRCu FPC nie wiedział dokładnie w czym mógł być problem (a siedzą tam twórcy kompilatora, których ogrom wiedzy czasem mnie zaskakuje).

I do tej pory właśnie tak się uczyłem: natrafiając na problem, szukałem jego rozwiązania. W kursach ciężko o takie rzeczy ;/. Pisanie "na moje możliwości" z omijaniem napotkanych problemów, do niczego mnie nie doprowadzi...

100% Racji! Tylko że moim zdaniem rozwiązaniem nie jest pytanie na forum, tylko myślenie i eksperymentowanie.

Akurat nigdy nie miałem okazji pracować na 64-bitowych komputerach; kiedyś-tam usłyszałem lub przeczytałem, że tak jest, więc napisałem; ale dzięki za zwrócenie uwagi :)

Też póki co z 64bitami (nie)przyjemności nie miałem, ale gdzieś tak wyczytałem w docach FPC, być może w przyszłości to zmienią, póki co jest to dla zgodności. Jeżeli chcesz mieć integer rozmiaru wskaźnika to jest PtrInt.

0

-oho123 - Chyba się nie rozumiemy, więc napiszę na przykładzie.

Dam Ci tekst po chińsku (czy w innym języku, o którym nie masz bladego pojęcia), a Ty (bez pomocy innych, a także translatorów, słowników itp.) masz go odkodować... Jak myślisz, ile "prób i błędów" będziesz potrzebował? Miliard?
Innymi słowy - jeżeli czegoś NIE WIESZ/NIE UMIESZ to zwyczajnie potrzebujesz źródła wiedzy/pomocy kogoś kto Ci pokaże co i jak, a nie prób na chybił trafił. I właśnie o to pytam...
Jeżeli kompletnie nie rozumiem zagadnienia, to z czym u licha mam eksperymentować? Mam wrzucać losowe algorytmy aż za 100 lat trafię na właściwy? To niedorzeczne i bezsensowne.
Chcę uzyskać informacje, skąd mogę zdobyć potrzebną wiedzę do rozpracowania tego problemu. Kurs? Książka? Nie ma problemu - stać mnie. Chodzi jedynie o wskazanie drogi, czy proszę o zbyt wiele?

I na prawdę nie musisz mi pomagać (z resztą pewnie i tak nie masz takiego zamiaru). Jeżeli nie masz czasu/uważasz że to poniżej Twojej godności (cokolwiek), to przecież nikt Cię nie zmusza. Baa, nawet odpisywać nie musisz.

PS. Mogę być najgorszym programistą świata, ale newbie (początkującym) nie jestem. Bawię się tym (to dobre słowo) od 2004 roku.

Pozdrawiam.

0
Crow napisał(a):

Dam Ci tekst po chińsku (czy w innym języku, o którym nie masz bladego pojęcia), a Ty (bez pomocy innych, a także translatorów, słowników itp.) masz go odkodować... Jak myślisz, ile "prób i błędów" będziesz potrzebował? Miliard?
Innymi słowy - jeżeli czegoś NIE WIESZ/NIE UMIESZ to zwyczajnie potrzebujesz źródła wiedzy/pomocy kogoś kto Ci pokaże co i jak, a nie prób na chybił trafił. I właśnie o to pytam...

Dziwny przykład.

czy w innym języku, o którym nie masz bladego pojęcia - aha - czyli piszesz w Pascalu o którym TY nie masz żadnego pojęcia, tak?
bez pomocy innych, a także translatorów, słowników itp. - a to niby czemu? Ty nie masz dostępu do tutoriali i dokumentacji?
Jak myślisz, ile "prób i błędów" będziesz potrzebował? - co najwyżej kilka/paręnaście. Programista potrafi myśleć logicznie, a nie tylko metodą prób i błędów.
jeżeli czegoś NIE WIESZ/NIE UMIESZ to zwyczajnie potrzebujesz źródła wiedzy/pomocy kogoś kto Ci pokaże co i jak - no bez jaj. Jeżeli czegoś nie wiesz/nie umiesz, to wracasz do książek, a nie pytasz się na forum o wskazanie drogi, a już na pewno nie zabierasz się za projekt, który wymaga dużo większej wiedzy, niżeli posiadasz...
Chcę uzyskać informacje, skąd mogę zdobyć potrzebną wiedzę do rozpracowania tego problemu. Kurs? Książka? Nie ma problemu - stać mnie. Chodzi jedynie o wskazanie drogi, czy proszę o zbyt wiele? - no z książek i własnego mózgu; to jest droga. Co chcesz, abyśmy ci wskazali? Procedury/funkcje, a może od razu gotowca? Wróć do książek, poczytaj o obsłudze plików i za góra tydzień (może) będziesz w stanie to napisać...
Mogę być najgorszym programistą świata, ale newbie (początkującym) nie jestem. Bawię się tym (to dobre słowo) od 2004 roku. - ehe. Nie jesteś newbie, ale o obsłudze plików to nie słyszałeś.

0

Mam już dość tej jałowej dyskusji. Nie chcecie mi pomóc to nie, ale przestanie spammować byle czym, bo to nie wnosi absolutnie niczego do tematu...

Inny przykład zatem:
Jesteś człowiekiem z umiejętnościami stolarskimi na poziomie - przeciąć kilka desek i zbudować skrzynkę na pomidory. A dostajesz za zadanie zbudowanie repliki 16 wiecznego sekretarzyka... Ile prób i błędów będziesz potrzebować? -_-

Piszesz ciągle o powrocie do książek - a ja cholera pytam już po raz n-ty: JAKICH KSIĄŻEK? Nawet nie wiem czego mam szukać, nie wiem jak nazywa się dział programowania z którego pochodzi zagadnienie o którym napisałem w tym temacie. Dlatego też założyłem wątek, w nadziei że trafię na fachowca który przynajmniej jednym zdaniem będzie potrafił powiedzieć czego potrzebuję. Np: "To zadanie wymaga znajomości X, Y i Z. Poszukaj sobie w internecie albo w książkach". Tak wiele? Książek o programowaniu napisano MILIONY, skąd mam u licha wiedzieć która jest mi potrzebna? Bo wybacz, ale ja żadnej o tytule: "Konwertowanie plików w Delphi" nie spotkałem...

Nie chcesz mi pomagać to nie, ale uprzejmie proszę - przestań dopisywać posty, które nic nie wnoszą. I nie, nie chcę gotowca (3 raz to piszę), czytaj ze zrozumieniem...

0

Jesteś człowiekiem z umiejętnościami stolarskimi na poziomie - przeciąć kilka desek i zbudować skrzynkę na pomidory. A dostajesz za zadanie zbudowanie repliki 16 wiecznego sekretarzyka... Ile prób i błędów będziesz potrzebować? -_-

Odrzucam zadanie bądź płacę komuś za jego wykonanie.

Np: "To zadanie wymaga znajomości X, Y i Z. Poszukaj sobie w internecie albo w książkach"

To zadanie wymaga znajomości BlockRead, BlockWrite i zmiennych. Poszukaj sobie w internecie albo w książkach.

skąd mam u licha wiedzieć która jest mi potrzebna?

Mówiąc książka mam na myśli "tutorial o xyz" bądź od razu dokumentację.

ale ja żadnej o tytule: "Konwertowanie plików w Delphi" nie spotkałem...

Rozdział 7


Serio - porywasz się z motyką na słońce.
Daruj sobie i przeczytaj całe kompendium (to nie działa na zasadzie "Przeczytałem tutorial o wskaźnikach - czas pisać pierwszą grę"), zrób kilka łatwiejszych programów, a potem sam zrozumiesz jak to wykonać.
Nikt cię za rączkę nie będzie prowadził i nie poda ci czegoś w stylu "W książce abc jest dokładnie omówione jak to wykonać"...

0

Odrzucam zadanie bądź płacę komuś za jego wykonanie.

Tylko ja napisałem już z milion razy. Mnie nie chodzi o EFEKT (czyli gotowy program). Ja chce się po prostu czegoś nauczyć.

To zadanie wymaga znajomości BlockRead, BlockWrite i zmiennych. Poszukaj sobie w internecie albo w książkach.

Znam.

Mówiąc książka mam na myśli "tutorial o xyz" bądź od razu dokumentację. Daruj sobie i przeczytaj całe kompendium (to nie działa na zasadzie "Przeczytałem tutorial o wskaźnikach - czas pisać pierwszą grę"), zrób kilka łatwiejszych programów, a potem sam zrozumiesz jak to wykonać.
Nikt cię za rączkę nie będzie prowadził i nie poda ci czegoś w stylu "W książce abc jest dokładnie omówione jak to wykonać"

Nic podobnego. Jak wspomniałem wyżej, CHCĘ SIĘ CZEGOŚ NAUCZYĆ, poznać cały dział wiedzy a nie konkretne rozwiązanie jednostkowego problemu. To też bywa przydatne, ale jednak interesuje mnie szersza wiedza.

Rozdział 7

Czytałem już.

Pytanie tylko: Czy zadałeś sobie odrobinę trudu, by przyjrzeć się plikom które tam zamieściłem w linku? BlockRead i BlockWrite mogę odczytywać różne fragmenty pliku, ale nadal nie rozumiem jak mam przebudować jego strukturę (na choćby taką, jaka znajduje się w tym xmlu). Tu kwestia nie polega na wczytaniu na kilku ostatnich bajtów, ale na odpowiednim przebudowaniu pliku, a potem ponownym przerobieniu go na taki jakim był wcześniej...

I zaznaczam ponownie. Interesuje mnie cały dział wiedzy tego dotyczący, a nie tutorial czy gotowiec.

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