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. ;]
Potrzebny progs do wkładania danych pod konkretny offset
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ę.
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ę.
Potrzebny progs do wkładania danych pod konkretny offset
~ Primum non nocere ~
Re: Potrzebny progs do wkładania danych pod konkretny offset
20 minut? Tydzień nauki? Gruba przesada :)
W Pythonie:
12 linii kodu, licząć wyświetlanie składni :P
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()
"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
Re: Potrzebny progs do wkładania danych pod konkretny offset
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.
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.
Re: Potrzebny progs do wkładania danych pod konkretny offset
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ę.
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
Re: Potrzebny progs do wkładania danych pod konkretny offset
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!
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!
Re: Potrzebny progs do wkładania danych pod konkretny offset
Około 4GB, więc był to całkiem dobry pomysł.[...] 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. [...]
Nie twierdzę, że nie. Nie mam do tego głowy po prostu.[...] Programowanie jest fajne! [...]
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 ~
Re: Potrzebny progs do wkładania danych pod konkretny offset
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".
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
Re: Potrzebny progs do wkładania danych pod konkretny offset
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 :)
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
Re: Potrzebny progs do wkładania danych pod konkretny offset
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ąć
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).
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.
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
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;
}
Edit. Ups, nie zauważyłem, że od ma_rysi dostałeś już progsa.
Re: Potrzebny progs do wkładania danych pod konkretny offset
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ć.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.
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).Przy okazji, powyższy program można by troszkę uprościć za pomocą strtoul.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 9 gości