Skocz do zawartości

[DELPHI] Zmiana bajtów w pliku


alek12

Polecane posty

Witam czy jest jakaś możliwość pozmieniać poszczególne bajty w plikach. Chodzi mi głównie o zmianę bajtów w przedziałach od np 00x0 do 00x0A na FF. Udało mi się tylko pozmieniać bajty ale wszystkie na FF

 

 Abyte := MPHEXEDITOR2//tutaj program pobiera bajty z tabeli 
Abyte:=StrToInt("xFF") 

 

Tylko w ten sposób udało mi się zmienić bajty ale wszystkie na FF.

Mam jeszcze jeden pomysł lecz nie wiem czy coś z tego może być :

 

1.Czy jest możliwość skopiowania poszczególnych bajtów z pliku i skopiowanie ich do pliku 2.

 

Proszę was o odpowiedz..

Link do komentarza
Udostępnij na innych stronach

var
  a, b: TFileStream;
  t: integer;
  b: byte;
begin
  a := TFileStream.Create('plikWejsciowy.dat', fmOpen);
  b := TFileStream.Create('plikWyjsiowy.dat', fmCreate);
  for t := 0 to a.size-1 do begin
     a.read(b, 1);
     if b = 0 then b := $ff;
     b.write(b,1);
  end;
  a.Free;
  b.Free;
end;

 

Pisane z pamieci wiec pewnie jakies babole beda, musisz dopracowac sam.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Mógłbyś wyjaśnić mi ten algorytm??

 

Tak jak ja to rozumiem

 

 

Otwieranie pliku do odczytu , lecz w tym przykładzie fmOpen kompilator wywalał mi błąd więc zmieniłem na fmOpenRead.

Potem program tworzy nowy plik

var
    a, b: TFileStream;
  t: integer;
  c: byte;
begin
   a := TFileStream.Create('kk.bin', fmOpenRead);
  b := TFileStream.Create('kk2.bin', fmCreate);
  for t := 0 to a.size-1 do begin
     a.read(c,1);
     if c <> 0 then c := $AA;
     b.write(c,1);

end;
  a.Free;
  b.Free;
        end;

 

Coś jest nie tak ponieważ zmienia on cały plik na $AA a nie pojedyncze bajty. Dlaczego ??

Link do komentarza
Udostępnij na innych stronach

czlowieku wez napij sie mleka, napisz sobie to na kartce i zastanow sie co ty wypisujesz.....

 

pomoge ci masz dane wejsciowe

 

AA, ba, 3, 44, 12, 0, 11, aa, 44, 22

 

teraz wez kazdy z tych bajtow i potraktuj je swoim warunkiem i zobacz jakie beda wyniki....

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

czlowieku wez napij sie mleka, napisz sobie to na kartce i zastanow sie co ty wypisujesz.....

 

pomoge ci masz dane wejsciowe

 

AA, ba, 3, 44, 12, 0, 11, aa, 44, 22

 

teraz wez kazdy z tych bajtow i potraktuj je swoim warunkiem i zobacz jakie beda wyniki....

 

 

?

 

^^ Wszędzie wynik wyjdzie AA. Wiem że ten warunek jest zły ale próbowałem twój warunek, warunek cubixa i forca i ciągle ten nam syf :

http://img66.imageshack.us/my.php?image=aaru3.jpg

 

Mi chodzi o to aby odczytać jeden bajt z tej całej tabeli co w obrazku czyli odczytać FF zapisać go w zmienej C i wrzucić do warunku i tak z resztą

Link do komentarza
Udostępnij na innych stronach

mphexeditor2 ...hmm ,napisz wasnego mphexeditor2 lub sprawdź zo robi ta funkcja ...Tzn ,czy chce parametr ,czy może nie chce i co jest zwracane ...

 

A może ,zle korzystasz z Abyte ??Nie zdefiniofaeś czasem tabeli Abyte ?? .bo ....

 

 

 

PS.Dlaczego ma się napić akurat mleka ??

Aktualnie piszę 32 bitowy system operacyjny.

ASE2.0 100% ,DME (Dynamic Motion Engine) v2.0 10% ,32 bit PumaOS - 40%

Stick's Adventure 3 - 0%

Komp nr.1 AMD Duron 1,3 Ghz ,256 MB Ram DDR PC133 (na eBoostr mam jeszcze 1 GB) ,Nvidia GeForce FX 5500 256MB DDR

Komp nr.2 (laptop) AMD Athlon XP 2,0 Ghz , 192 MB Ram DDR PC2700 (na eBoostr mam jeszcze 3 GB) , Via S3 Unichrome IGP

Przykład programu w ASE2.0:

<?arg #CreateProcs; $i:?;

#For('$i,10,1,@Lab');@Lab;

#Sleep(100);

#Message("Ten komputer ulegnie autodestrukcji za $i sekund");

#Retf;

#Message('Dead'); arg?>

Link do komentarza
Udostępnij na innych stronach

Więc tak dokładnie to wygląda tak Abyte:=(MPHEXEDITOR2.data[count]) zawiera ona informacje które zostały zapisane w tabeli MPHEXEDITOR która pokazana jest w linku wyżej. Abyte wykorzystana jest do zapisu pliku , czyli tego co jest w tabeli do pliku write(Savefile,Abyte)

Link do komentarza
Udostępnij na innych stronach

var
    a, b: TFileStream;
  t: integer;
  c: byte;
begin
   a := TFileStream.Create('kk.bin', fmOpenRead);
  b := TFileStream.Create('kk2.bin', fmCreate);
  for t := 0 to a.size-1 do begin
     a.read(c,1);
     if c in [0..$0A] then c := $AA;
     b.write(c,1);

end;
  a.Free;
  b.Free;
end;

 

to rozwiązanie Toster'a poprawione przez Force'a działa

 

więc o co kaman?

Link do komentarza
Udostępnij na innych stronach

Udało się :P po usunięciu for t := 0 to a.size-1 do begin otrzymałem to co chciałem przeczytał pierwszą porcję bajtów tak jak chciałem.

 

to się nazywa programowaniem intuicyjnym inaczej na chybił trafił bądź programowaniem bez udziału świadomości... :lol:

 

P.S. suma zer daje zastraszająco wysoką liczbę :lol:

 

P.S. suma inteligencji na planecie jest stała, liczba ludności rośnie :lol:

 

P.S. przeczytał Ci pierwszy bajt!

Link do komentarza
Udostępnij na innych stronach

No i oto mi chodziło aby przeczytał mi liczbę bajtów jaką ma daną w a.read(C,1) a przedtem odczytał mi wszystkie bajty to jak to tu zmieniać :). Bo zauważyłem że on to fajnie czyta te bajty, jeśli wyczytamy pierwszy bajt FF to następnym nawet gdy damy aby do innej zmiennej przypisać bajt 1 to przeczyta on bajt drugi z programu << o takie coś mi chodziło. Jeszcze bym miał do was jedno pytanie ..

 

Możecie mi powiedzieć co wpisać aby wsadzić a := TFileStream.Create('kk.bin', fmOpenRead); w miejsce ścieżki plik który wchodzi poprzez button loadfrom2.

 

 

Czy maksymalnie można odczytać tylko 4 bajty?? Bo jak ustawie na więcej to wywala mi błąd

Link do komentarza
Udostępnij na innych stronach

No ja wiem ale powiedz co trzeba wstawić w miejsce ścieżki tego pliku co jest w Tfilesteram aby korzystał on z loadfile << ZROBIONE.

 

Możecie mi powiedzieć dlaczego wywala mi błąd Project Project1.exe raised exception class EAcess with message "Acees violation at adres 000000F" Red of adress 000000F.Procesed stop

 

KOD

if SaveDialog1.Execute then

begin

a := TFileStream.Create(g, fmOpenReadWrite);

x := SaveDialog1.FileName;

 

b := TFileStream.Create(x, fmCreate);

 

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.free;

b.free;

 

 

Zmienna G to KODg:=ExtractShortPathName(OpenDialog2.FileName ); Pobiera ścieżkę i umieszcza w TfileStream pliku który jest wczytywany do programu

Link do komentarza
Udostępnij na innych stronach

Sprobuj znależć błąd debuggerem ...Najpierw zaznacz jaką linie ,najlpiej tą na początku i wciśnij F4 ..potem Delphi ,wrbi do kodu z zaznaczeniem i teraz rób ciagle F7 ,dopóki ie wywali błedu ...

 

Tylko chyba to bła w pamieci ,nie wiem ...

Aktualnie piszę 32 bitowy system operacyjny.

ASE2.0 100% ,DME (Dynamic Motion Engine) v2.0 10% ,32 bit PumaOS - 40%

Stick's Adventure 3 - 0%

Komp nr.1 AMD Duron 1,3 Ghz ,256 MB Ram DDR PC133 (na eBoostr mam jeszcze 1 GB) ,Nvidia GeForce FX 5500 256MB DDR

Komp nr.2 (laptop) AMD Athlon XP 2,0 Ghz , 192 MB Ram DDR PC2700 (na eBoostr mam jeszcze 3 GB) , Via S3 Unichrome IGP

Przykład programu w ASE2.0:

<?arg #CreateProcs; $i:?;

#For('$i,10,1,@Lab');@Lab;

#Sleep(100);

#Message("Ten komputer ulegnie autodestrukcji za $i sekund");

#Retf;

#Message('Dead'); arg?>

Link do komentarza
Udostępnij na innych stronach

Sprobuj znależć błąd debuggerem ...Najpierw zaznacz jaką linie ,najlpiej tą na początku i wciśnij F4 ..potem Delphi ,wrbi do kodu z zaznaczeniem i teraz rób ciagle F7 ,dopóki ie wywali błedu ...

 

Tylko chyba to bła w pamieci ,nie wiem ...

 

 

Debuger zaznacza mi to :

 

KOD if SaveDialog1.Execute then

 

Usunąłem SaveDialog1 to wywala też ten sam błąd lecz o innej wartości może błąd znajduje się w tym wczytywaniu danych :

 

KOD a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.Read(c,4);

b.Write(c,4);

a.Read(c,4);

b.Write(c,4);

a.Read(c,4);

b.Write(c,4);

a.Read(c,4);

b.Write(c,4);

a.Read(c,4);

b.Write(c,4);

a.Read(c,4);

b.Write(c,4);

a.Read(c,4);

b.Write(c,4);

a.Read(c,4);

b.Write(c,4);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

a.read(c,1);

c := $AA;

b.write(c,1);

 

 

Oczywiście na końcu jest a.Free i b.Free. Próbowałem ten syf zapisać za pomocą pętli :

 

KODwhile i <> 10 do

begin

a.read(c,1);

if c in [0..$50] then c := $AA;

b.write(c,1)

I := I + 1;

a.Free;

b.Free;

 

 

A moglibyście powiedzieć jak działa funkcja position ?? Czy ona odczytuje 10bajt czy 10bajtów w tym przypadku a.position:=10;

Link do komentarza
Udostępnij na innych stronach

czytaine tego watku jest fascynujace. Jest niczym dobra powiesc kryminalna, im dalej tym badziej zaskakujace zwroty akcji po prostu nie moge sie doczekac finalu.

 

BTW czy ty zastanawiasz sie co robia kolejne linie twojego programu czy wrzucasz losowe kombinacje komend i zmiennych byleby sie kod skompilowal ?

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

To nie jest funkcja tylko property/własciwość klasy.

Position = pozycja, czyli pozycja od której będą czytane/zapisywane następne dane, coś jak karetka (kursor) w edytorach tekstowych.

Jeżeli nie znasz angielskiego na tym poziomie to bym tym bardziej sobie odpuścił... No chyba, że masz 12 lat... :P

Obrazek
Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Gość
Temat jest zablokowany i nie można w nim pisać.
×
×
  • Utwórz nowe...