Potrzebny progs do wkładania danych pod konkretny offset

Wszelkie kwestie techniczne.
Regulamin forum
1. W miarę możliwości prosimy o załączanie plików przez nasze forum, nie na zewnętrznych serwerach. Pliki nie znikną wtedy po upływie pewnego czasu. 2. Jeśli chcecie uzyskać pomoc przy rozpracowaniu plików (np. z tekstem, czcionką) załączajcie je do postów - nie każdy przecież posiada tłumaczoną przez Was grę.
Awatar użytkownika
Berion
Posty: 598
Rejestracja: 3 cze 2008, o 08:34
Grupa: żadna, freelancer :P
Kontakt:

Potrzebny progs do wkładania danych pod konkretny offset

Postautor: Berion » 21 lis 2008, o 21:35

Jak w tytule. Szukam programu, który umożliwiałby zastępowanie danych pod konkretnym offsetem w pliku z innego, zewnętrznego pliku. Oczywiście każdy hex edytor to potrafi - mi jednak zależałoby na obsłudze batchy, tak aby np. w skrypcie można było wpisać z tysiąc takich operacji, nie kłopocząc się każdorazowo ręcznym wstawianiem w hex edytorze.

Przykład:
nasz_progs.exe 0x8000 munge_jakis.dat plik_do_wstawienia.xyz

Naturalnie wystarczyłby sam cmd bo o to tutaj właśnie chodzi. Dla programisty taki shit to pewnie jakieś 20 min. roboty, dla mnie to pewnie z tydzień nauki. ;]
~ Primum non nocere ~

Awatar użytkownika
mziab
Posty: 459
Rejestracja: 20 maja 2008, o 23:11
Grupa: mteam
Kontakt:

Re: Potrzebny progs do wkładania danych pod konkretny offset

Postautor: mziab » 22 lis 2008, o 11:49

20 minut? Tydzień nauki? Gruba przesada :)

W Pythonie:

Kod: Zaznacz cały

import sys if len(sys.argv) != 4: print "Usage: %s hex_offset munge input_file" % sys.argv[0] sys.exit(1) munge = open(sys.argv[2], "r+b") input = open(sys.argv[3], "rb") offset = int(sys.argv[1], 16) munge.seek(offset) for i in input: munge.write(i) munge.close() input.close()
12 linii kodu, licząć wyświetlanie składni :P
"Człowieka można przedstawić w postaci ułamka, w którym licznikiem są jego właściwości, a mianownikiem - mniemanie o sobie. Im większy mianownik, tym mniejszy cały ułamek." - Lew Tołstoj

twig

Re: Potrzebny progs do wkładania danych pod konkretny offset

Postautor: twig » 22 lis 2008, o 12:14

Dodaj jeszcze kilka linijek niezbędnych zabezpieczeń ;)

Program ma być uruchamiany przez plik wsadowy kilka (-dziesiąt? -set?) razy. Nie trudno w takim pliku o literówkę. Dlatego program powinien sprawdzać i raportować błędy otwarcia pliku oraz przypadki, kiedy podany offset nie znajduje się w pliku (plik jest za mały). Dodatkowo przydałoby się sprawdzać, czy "wkładany" plik zmieści się w przestrzeń między offsetem a końcem pliku do którego jest wstawiany.

Awatar użytkownika
mziab
Posty: 459
Rejestracja: 20 maja 2008, o 23:11
Grupa: mteam
Kontakt:

Re: Potrzebny progs do wkładania danych pod konkretny offset

Postautor: mziab » 22 lis 2008, o 12:37

To był tylko przykładowy kod (pisany swoją drogą w trakcie późnego śniadania :P) mający na celu pokazanie Berionowi, że programowanie nie gryzie :) Przy czym ta wersja działa bajt po bajcie, bo nie wiedziałem jak duże będą wrzucane pliki i wolałem nie wczytywać ich w całości do ramu.

Swoją drogą, Python sam wyłapuje większość błędów (np. IOError), więc o ile nie chce się zrobić z nimi nic ciekawego (gustowny komunikat o błędzie :P), zwykle nie ma potrzeby dopisywania tych paru linii :) Z drugiej strony jako esteta z reguły to robię.
"Człowieka można przedstawić w postaci ułamka, w którym licznikiem są jego właściwości, a mianownikiem - mniemanie o sobie. Im większy mianownik, tym mniejszy cały ułamek." - Lew Tołstoj

twig

Re: Potrzebny progs do wkładania danych pod konkretny offset

Postautor: twig » 22 lis 2008, o 14:17

Jasne, rozumiem :]

Też nie zawsze sprawdzam wszystkich możliwych błędów, kiedy piszę sobie na kolanie :P

Odezwałem się tylko, bo w takim programie wypisanie nazwy pliku i rodzaju błędu byłoby niezbędne, aby być pewnym, że wszystkie pliki zostały przetworzone prawidłowo (a jeżeli nie, to żeby wiedzieć, które i dlaczego).

Programowanie jest fajne!

Awatar użytkownika
Berion
Posty: 598
Rejestracja: 3 cze 2008, o 08:34
Grupa: żadna, freelancer :P
Kontakt:

Re: Potrzebny progs do wkładania danych pod konkretny offset

Postautor: Berion » 22 lis 2008, o 16:11

[...] Przy czym ta wersja działa bajt po bajcie, bo nie wiedziałem jak duże będą wrzucane pliki i wolałem nie wczytywać ich w całości do ramu. [...]
Około 4GB, więc był to całkiem dobry pomysł.
[...] Programowanie jest fajne! [...]
Nie twierdzę, że nie. Nie mam do tego głowy po prostu.

Napisałem w życiu tylko jeden sensowny program:
http://forum.cdrinfo.pl/f106/cnf-tool-74715/

---

Wczoraj ma_Rysia napisał mi taki sofcik. Szkoda, ze na PM bo zmarnował ktoś na mnie czas teraz. ;] Jeśli nie będzie mieć nic przeciw to zamieszczę na forum.
~ Primum non nocere ~

Awatar użytkownika
ma_Rysia
Posty: 61
Rejestracja: 19 maja 2008, o 22:47
Grupa: BezNazwy

Re: Potrzebny progs do wkładania danych pod konkretny offset

Postautor: ma_Rysia » 22 lis 2008, o 16:44

No prośbę Beriona, zamieszczam programik.

Tak poza tym (to tylko moje opinie - nie należy tego przyjmować za jedyne słuszne rozwiązanie):
1. Do takich najlepiej nadaje się C i stdio (szybkość działania), a dynamiczne typowanie to dla mnie w ogóle przesada.
2. Kopiowanie bajt po bajcie 4GB, to strata czasu - w takich wypadkach najlepiej zczytywać blokowo.
3. Przy odpalaniu programu setki razy - informacja o błędach jest niezbędna.

W załączniku jest programik, ze źródłem.

Edit: W programiku był błąd: "r" zamiast "rb".
Załączniki
tofi.rar
Poprawiony programik:
(5.79 KiB) Pobrany 163 razy

Awatar użytkownika
mziab
Posty: 459
Rejestracja: 20 maja 2008, o 23:11
Grupa: mteam
Kontakt:

Re: Potrzebny progs do wkładania danych pod konkretny offset

Postautor: mziab » 22 lis 2008, o 17:02

Ogólnie to się zgadzam z tym, że C/C++ nadaje się najlepiej do rzeczy niskopoziomowych. Ale Python jest przydatny do prototypowania. Można skupić się na algorytmie, napisać wstępna implementację w Pythonie, a potem (jeśli np. wydajność ma krytyczne znacznie) przepisać do innego języka. Przy czym Python nie zawsze musi być wolniejszy. Jest coś takiego jak prekompilacja (moduł psyco).

Przy okazji, powyższy program można by troszkę uprościć za pomocą strtoul.

Mmm, lubię dyskusje na poziomie :)
"Człowieka można przedstawić w postaci ułamka, w którym licznikiem są jego właściwości, a mianownikiem - mniemanie o sobie. Im większy mianownik, tym mniejszy cały ułamek." - Lew Tołstoj

ffgriever
Posty: 488
Rejestracja: 17 paź 2008, o 15:29

Re: Potrzebny progs do wkładania danych pod konkretny offset

Postautor: ffgriever » 22 lis 2008, o 17:06

A ja ci kiedyś nie podsyłałem przypadkiem czegoś, co było roboczo nazwane inserter czy insertor?

PS. Kopiowanie bajt po bajcie 4GB to lekka przesada... będzie trwało w nieskończoność ;) . Zwykle bloczki po 4, 8, czy 16MB wypadną dobrze.

Tutaj masz coś, co działa. Jak chcesz skompilowany to powiedz... Pod cygwinem musiałbyś klepnąć

Kod: Zaznacz cały

gcc -O6 -s -mno-cygwin plik.c -o binsert.exe
A tutaj masz sam kod:

Progs nie sprawdza, czy offset + infilesize < outfilesize, ale to chyba nie jest potrzebne (a przy okazji pozwala na zapisanie poza oryginalny plik, może być użyteczne).

Kod: Zaznacz cały

#include <stdio.h> #include <malloc.h> #define BUFFER_SIZE (8192*1024) int main(int argc, char** argv) { FILE *in, *out; unsigned char* buffer; __int64 offset; __int64 remaining; __int64 toRead; int temp; if (argc < 4) { printf("Niewystarczajaca liczba argumentow\n\nbinsert.exe [offset] [infile] [outfile]\n"); return -1; } //zero na koncu to baza, 0xLICZBA da hex, 0LICZBA da oct, inaczej to dziesietna. Ustaw na 16 aby kazdy format traktowalo jako hex offset = strtoul(argv[1], NULL, 0); buffer = (unsigned char*)malloc(BUFFER_SIZE); if (buffer == NULL) return 0; in = fopen(argv[2], "rb"); out = fopen(argv[3], "rb+"); if (in == NULL || out == NULL) { if (in) fclose(in); if (out) fclose(out); free(buffer); printf("Nie mogzna otworzyc plikow.\nIn = \"%s\"\nOut = \"%s\"\n", argv[2], argv[3]); return 0; } fseeko64(out, offset, SEEK_SET); fseeko64(in, 0, SEEK_END); remaining = ftello64(in); fseeko64(in, 0, SEEK_SET); temp = 0; while (remaining) { if (remaining < BUFFER_SIZE) toRead = remaining; else toRead = BUFFER_SIZE; fread(buffer, toRead, 1, in); fwrite(buffer, toRead, 1, out); remaining -= toRead; //ta czesc mozna wywalic, ale warto wiedziec ile zostalo if (temp == 10) { printf("Pozostalo: %d\n", remaining); temp = 0; } else { temp++; } } fclose(in); fclose(out); free(buffer); printf("Operacja zakonczona pomyslnie. W \"%s\" na offsecie 0x%lx", argv[3], offset); //glupie, ale mam gcc dla windows (dla mingw) skopane i inaczej ostatni wskaże null ;) printf(" zapisano \"%s\"\n", argv[2]); return 0; }
W każdym razie banalnie proste, polecam się trochę pouczyć a nie będziesz musiał się prosić o takie proste rzeczy.

Edit. Ups, nie zauważyłem, że od ma_rysi dostałeś już progsa.

Awatar użytkownika
ma_Rysia
Posty: 61
Rejestracja: 19 maja 2008, o 22:47
Grupa: BezNazwy

Re: Potrzebny progs do wkładania danych pod konkretny offset

Postautor: ma_Rysia » 22 lis 2008, o 17:24

Ogólnie to się zgadzam z tym, że C/C++ nadaje się najlepiej do rzeczy niskopoziomowych. Ale Python jest przydatny do prototypowania. Można skupić się na algorytmie, napisać wstępna implementację w Pythonie, a potem (jeśli np. wydajność ma krytyczne znacznie) przepisać do innego języka.
Ja osobiście projektuję rozwiązanie problemu pod dany język i nie lubię przepisywania programów z jednego języka drugi. Bo inaczej trzeba podejść do rozwiązania problemu w JAVA'ie, inaczej w C++ (template'y i funktory - większy, ale szybszy program), inaczej asemblerze, a jeszcze inaczej w LISPie. Każdy język ma swoje wady i zalety z których trzeba skorzystać.
Przy okazji, powyższy program można by troszkę uprościć za pomocą strtoul.
Masz racje, ale nie miałem pojęcia o tej funkcji bibliotecznej. Poza tym dla mnie to jedna z funkcji które szybciej napisać niż znaleźć (jeśli się nie wie o jej istnieniu).


Wróć do „Technikalia”



Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości