Jump to content
GSForum - Segélyvonal

Visual Basic 6 binary access fájlrészlet kimásolása gyors mûvelettel


CNC_Master
 Share

Recommended Posts

CNC_Master

Sziasztok!

Sürgõs segítség kellene.

1.Volna egy illetve több binary fájlom amiben bizonyos tartalmat kéne módosítanom az eredetihez képest akár rövidebb akár hosszabb szöveges tartalomra de nem szöveges típusú file.

Az még menne, hogy elkezdek keresni és ami egyezik (1 karkterenként léptetve és 1 karaktert vizsgálva) akkor azt cserélje le. Az okés, viszont ezt csak 1 karakterre tudom. Mármint az 1 karakterre való keresést. és mindenféle karaktert meg is talál nem csak betûket számokat és általános jeleket, nyilván az elõre bekódolt ascii kód szerint, ha viszont már karakterláncról van szó amit keresek az már nem tudom hogy kéne.

 

2. Továbbá egy gyors keresési eljárás ami 3 illetve 4 karaktert vizsgál hogy egybetartozóan a keresés folyamán szerepel-el és annak kezdõ pozícióját lekérdezi.

 

Sajnos csak 1 karakterre tudok keresni és írni ami nagyon lassú folyamat még kis fájlméreteknél is.

Egy gyors megoldásra volna szükségem.

 

3. Azt kérdezném még, hogy binary fájl végét, hogy lehet levágni? (hogy csak bizonyos karakterpozícióig másoljon új fájlba mondjuk a 15 karakter pozíciótól, de ne 1 karakterenként egyesével írja ki ugyan azt egy másik fájlba mint amibõl olvas és az se 1 karakter legyen.

Link to comment
Share on other sites

SkyBird

Mit használtál eddig erre?

Vannak hexa szerkesztő programok, amik jók erre is. Pl. HxD, WinHex.

 

A topic címet meg javítani kellene.

Link to comment
Share on other sites

CNC_Master

Eddig is Vb6-al volt hasonló, bár az más feladatra készült, és nem jó a szerkesztő progik,-nem jöhetnek szóba...

mivel még egy pár dolgot bele kell építeni a működésbe, és ez csak egy kiragadott része.

 

Direkt VB6-all kell megoldani, ezért is került ide a fórumba, (nem c-vel, delphi, vb .Net stb hanem vb6-al.

Sok file van és egyik ilyen file módisítandó tartalma sem azonos az előzőekkel vagy utóbbiakkal, de módosítandó tartalom programmal meghatározható mire kel és hogy átírni.

 

(A legtöbb hex szerkesztők nem képesek arra hogy a szöveget pozicionálják a cserére kívánt új adat és korábbi hossz méretének változása szerint, tehát csak cserét tudnak. így fájl mérete nem változik. a módosított adat hossza szerint. de mint említettem eleve vb6-al kell megoldani.)

 

Nem jó időtöltés fájlonként "szórakozni" mikor meg lehet ezt programmal is.

 

A fájl egy részletének binary tartalom gyors kimásolására ötlet?

pl 15000 a kezdő pozíció és 27000 a vége.és ezt kimásolni gyors művelettel..

nem 1 karakterenként szívózni... olyan gyors keresés mint pl a totalcommanderben.

 

arpsoft - válaszai itt a fórumokban hozzáértőnek tűnnek, ezért az ő válaszára kiváltképpen kíváncsi lennék milyen megoldást tudna erre, VB6-al természetesen.

 

-OFF-

a címmel nincs semmi baj.

az access nem, Microsift Access adatbázit file-t jelent (bár mindegy az is ilyen féle felépítésű mint amiről szó van)... hanem adatszerkezet elérést és így teljesen jó, vagy te nem érted a feladatot

binary fájl elérés olvasás/írás ez angolban binary file access read/write... tükör fordítással

ha konkrétan az mdb file-ról lett volna szó, azt adatbázisnak írtam volna.

Edited by CNC_Master
Link to comment
Share on other sites

SkyBird

Szerintem meg van gond a címmel.

Nekem eléggé szúrja a szemem, hogy binaby. ;)

Link to comment
Share on other sites

CNC_Master

Akkor szólj egy admin-nak, én nem tudom azt hogy kell kicserélni, õk meg elvileg bele tudnak nyúlni az adatbázisba.

Link to comment
Share on other sites

arpsoft

Szerintem sima string fõggvényekkel bináris összehasonlítási módban (ez az alap) mûködnie kell a dolognak.

ujfiletartalom=Replace$(filetartalom,'eztcserelem','erre',0)

Beolvasod a fájl tartalmát egy változóba, aztán a fenti függvénnyel átalakítod és az új fájlt kiírod lemezre.

Gondolom a fájl mûveletek (nyitás, írás, olvasás) nem okoznak problémát.

Link to comment
Share on other sites

[OP]Destroy-man

A fájlmûveleteket elvileg eddig is csinálta.

Egyébként ez a replace megoldás jó, maximum azt érdemes tesztelni, hogy direktben olvasás/írás a jó megoldás, vagy betölteni a teljes bináris fájlt memóriába, ott végrehajtani a cserét, és onnan felülírni a kívánt fájlt.

VB.NET esetén viszonylag könnyen lehetne gyorsítani a folyamatot több szálasítással, de ahogy olvastam ez nem játszik. Meg kérdés, hogy hány magos CPU-n fut az alkalmazás. Minél több annál gyorsabb lenne. VB6 alatt is meg lehetne oldani a több szálasítást, csak elég macerás.

Link to comment
Share on other sites

CNC_Master

arpsoft- Mivel ilyet még nem használtam amit írtál csak helyi karakter direktbe tőrténő cseréjét gyakorlatilag annyi a tiedben a változás hogy nem 1 karaktert cserélne le. Hanem többet egyszerre, ez pedig csak részben jó, vagyis egy korábbi programomban. ami meg már nincs meg egy hdd kipurcanása miatt.

 

Valójában mivel nem a megnyitott fájlban kell a módosítás hanem egy újba írni, az eredeti szerint bizonyos részét módosítva, ezért mint hogy "csere" nem értelmezett. Mert valójában nem csere. hiszen új fájl jön létre, és nem szerkeszteni kell. szerkesztéssel meg nem lesznek adatszerkezeti pozíció módosítások.

Aztán lehet én tévedek, de ha tegyük fel cserében a "mit" rövidebb mint a "mire" akkor az addig változtatja majd a fájl utáni adatokat míg elegendő hely nem marad a módosításra? vagy, hogy működik ez a csere vizuálisan lekövetve??

beolvasom az egész tartalmat, ő megkeresi a cserélni kívánt maszkot, majd annyival tolja vagy csökkenti a méretét a memóriában lévő filenak, és mentéskor az eredeti szerkezet megmarad, és megváltozik a file mérete? mert vagy rövidebbre cserélte vagy hosszabbra? Mert ha nem változik a file mérete pont annyi karakterrel amennyivel a módosítás lenne már nem jó. Nem ír felül mást adatot?

Úgy csinál mint pl a jegyzettömbben, hogy írok bárhol, majd azt ő a gépelés vagy törlés szerint tolja-húzza vissza a pozíció jelző után a karaktereket?

Lementi, és a szerkezete a módósítás miatt nem sérül?

 

 

Amit csináltam régebben az nem új file volt hanem az eredeti másolatát írtam át. amin a módisítások létrejöttek, karakterenként, mivel ott nem változott az útvonalak hossza, így a csere szóhasználata is megfelelő.

 

A cserével csak abban a fileban tudok cserélni amit megnyitok olvasni.

ha már változik a hossza, és mert ez nem szövegfile hanem binary, ezért nem jó a csere, megsérül az adatszerkezet.

Mert valtozó hosszúságnál ami az eredetiben pl 6 karakter, az az új fileban lehet hogy 3 de lehet hogy 15, ezért nem jó a csere.

 

És a programnak aminek olvasnia kéne a megsérült adatszerkezetet mert nem vátozik a hossza a filenak, emiatt nem képes feldolgozni.

Főleg ha hosszabb a beírandó az eredetihez kétest. Ha rövidebb az sem jó mert nem megfelelő adat kerülne olvasásra.

 

Itt az adat új fájlban átírásnál módosítani kell az eredetiben lévő pozíciók szerinti egyes tartalmat a többit csak átmásolni az új file-ba elcsúsztatva annyival és abba az irányba amennyivel több vagy kevesebb hosszúságú az új útvonal.

 

A csere akkor jó, ha az újonnan megadandó útvonal megegyező hosszú lenne az eredetivel. Ekkor a file méretek is egyeznének. és nincs semmi kérdés.

 

Az baj viszont, ha az új adat amire kéne "cserélni" az rövidebb vagy hosszabb az eredeti fájlban lévőnél. ha csere, Mert akkor azokat ami a módosítási területek után van, az új adat hossza szerint is pozíciót kéne váltania, de ha ezt egy új fájlban csak mint cserre végzem, akkor azt az adatot ami utána jönne simán elrontja, tönkretéve a file-t, mert a program ami beolvasná azt a részt nem tudja lekezelni. ugye ami utána már felül lett írva. A szimpla csere csak akkor jó ha az eredeti hossz és az új érték hossza azonos. De itt változnak az elérési hosszok. lásd kép lent

 

1 fájlon belül is több módosítandó van.

Tehát amit kéne: mondjuk 0-150-ig csak sima bináris fájl másolása kéne egy akkor létrehozott fájlban, majd a régiben kiolvasott útvonalat módisítva az új útvonal kerül hozzáadva az új fájl végére, majd ezután megint egy másolás a régi útvonal vége karakter +1 től a következő útvonalig az adatok másolása az új fájlhoz a végére írva, stb..

Majd mikor elértük az utolsó módosítandó útvonalat, az új útvonal bekerül hozzáadva az új fáj végére, majd a régi fájlból az utolsó útvonal utáni karaktertől másolja, adja hozzá az új fájlhoz a maradék binary tartalmat.

 

A probléma abból adódik, hogy a tartalom el kell csússzon, ha a változtatás karakterszáma nem egyezik meg az eredeti hosszal.

A szimpla csere ezért nem jó. Feltéve ha nem én értek félre valamit. Egyébként jó lehetne. és ha tévedek, akkor bocsi.

itt egy kép miről lenne szó:

IPB kép

Edited by CNC_Master
Link to comment
Share on other sites

arpsoft

Tévedsz. :)

A replace így mûködik:

replace('Ebben kell kicserelni bizonyos dolgokat, ugyelve az adatszerkezetre','ke','csigabiga')='Ebben csigabigall kicserelni bizonyos dolgokat, ugyelve az adatszercsigabigazetre'
replace('Ebben csigabigall visszacserelni bizonyos dolgokat, ugyelve az adatszercsigabigazetre','csigabiga','ke')='Ebben kell visszacserelni bizonyos dolgokat, ugyelve az adatszerkezetre'

Magyarul beolvasod a teljes fájlt egy szöveges változóba, aztán replace, aztán kiírod a szöveges változót a fájlba.

 

Link to comment
Share on other sites

Temporary

Igaz, ez Excel-hez készült, de talán hasznos lehet. Nagy valószínűséggel pontosan meghatározható vele a több helyen is előforduló, cserélendő karaktersorozat kezdőpozíciója.

 

Function betuket_kereso(miben As String, mit As String, irány As String, honnan As Integer, hanyadikat As Integer)
    hossz = Len(miben)
    Db = Len(mit)
    
    If irány = "j" Then tol = hossz - honnan + 1: ig = 1: st = -1
    If irány = "b" Then tol = 1 + honnan - 1: ig = hossz: st = 1
    
    For i = tol To ig Step st
        betu = Mid(miben, i, Db)
    If betu = mit Then talalat = talalat + 1
    If talalat = hanyadikat Then betuket_kereso = i: Exit Function
    Next i
        
End Function

A keresés iránya lehet "b" balról, vagy "j" jobbról a vége felől. A "honnan"-t megadva nem csak az elejétől vagy az elejéig. Ha az így meghatározott részben többször is előfordul a keresendő karaktersor, akkor a "hanyadikat" megadva lehet pontosítani a cserélendő karaktersor helyét.

E pozició alapján össze lehet fűzni a cserélendő előtti és utáni részt a beillesztendővel.

Link to comment
Share on other sites

CNC_Master
Tévedsz. :)

A replace így mûködik:

replace('Ebben kell kicserelni bizonyos dolgokat, ugyelve az adatszerkezetre','ke','csigabiga')='Ebben csigabigall kicserelni bizonyos dolgokat, ugyelve az adatszercsigabigazetre'
replace('Ebben csigabigall visszacserelni bizonyos dolgokat, ugyelve az adatszercsigabigazetre','csigabiga','ke')='Ebben kell visszacserelni bizonyos dolgokat, ugyelve az adatszerkezetre'

Magyarul beolvasod a teljes fájlt egy szöveges változóba, aztán replace, aztán kiírod a szöveges változót a fájlba.

 

ok értelek, csak nem voltam biztos abban, hogy "tologatja"-e a bin adatot.

olyasmit kell elérni mint ami a képen látszik:

 

"elõtte" - "utána"

eredeti - módosított

 

Az "ujfajltartalom" változó milyen típus? egyszerû string?

Mekkora méretet lehet beolvasni max?

 

(régen azt is nagyon elrejtve találtam meg, hogy pl a listboxnak, csak 32768 listaeleme lehet. és mikor egyel több került bele jött az üzi hogy tulcsodrulás.. néha olyan "jól" kommunikált az msdn...

Volt, hogy kevés volt és emiatt adatázist kellett írni. Mi mást mint mdb-t :) )

 

Ami akkor van ugye, ha a "mit" váltózó értéke hosszabb a "mire" változó értékénél...

 

 

Olyanra van ötlet, hogy fájl méret csökkentése pl file darabolása...

vagy mindegy a lényege, hogy a fájl végét pl le tudjam vágni ami nem kell...

 

Gondolom erre is valami hasonló, hogy egész file beolvas majd kiírás bizonyos méretéig. És ha pont felülírja a beolvasott, de már lezárt file-t- és nem hozzáadja, akkor mintha törölte volna és menti új méretben. így "csökken a méret", és olyan mintha levágott volna a végébõl..

Bár én olyanra gondolnék hogy csak a végérõl olvasná vissza és mint olló elvágja, az elvágás helyén pedig nem marad seb :) a leesõ vége kerüll a kill parancsba :)

De ezek szerint kell a file elejérõl való beolvasás... ilyenkor is. Törölni vissza nem lehet? mert hozzáírni lehet.

Link to comment
Share on other sites

CNC_Master
Igaz, ez Excel-hez készült, de talán hasznos lehet. Nagy valószínûséggel pontosan meghatározható vele a több helyen is elõforduló, cserélendõ karaktersorozat kezdõpozíciója.

 

Function betuket_kereso(miben As String, mit As String, irány As String, honnan As Integer, hanyadikat As Integer)
    hossz = Len(miben)
    Db = Len(mit)
    
    If irány = "j" Then tol = hossz - honnan + 1: ig = 1: st = -1
    If irány = "b" Then tol = 1 + honnan - 1: ig = hossz: st = 1
    
    For i = tol To ig Step st
        betu = Mid(miben, i, Db)
    If betu = mit Then talalat = talalat + 1
    If talalat = hanyadikat Then betuket_kereso = i: Exit Function
    Next i
        
End Function

A keresés iránya lehet "b" balról, vagy "j" jobbról a vége felõl. A "honnan"-t megadva nem csak az elejétõl vagy az elejéig. Ha az így meghatározott részben többször is elõfordul a keresendõ karaktersor, akkor a "hanyadikat" megadva lehet pontosítani a cserélendõ karaktersor helyét.

E pozició alapján össze lehet fûzni a cserélendõ elõtti és utáni részt a beillesztendõvel.

 

A MID-et ismerem köszi. Az pedig már eleve nem csak 1 karaktert tud csak kezelni. (str(start[Length]). a péda már ott rossz hogy csak betükre és számokra... persze átírva már más a helyzet.

holnap kipróbálok vmit...

Link to comment
Share on other sites

arpsoft

Nagyon bonyolultan gondolkodsz. :P

Mekkora fájlokat akarsz beolvasni? Egyébként sznte mindegy is, mert 1 GB simán befér egy VB String-be, ha így csinálod:

Dim sTartalom As String 
Dim hAdatfile As Integer
hAdatfile = FreeFile
Open "C:\utvonal\fajlnev.txt" For Binary Access Read As #hAdatfile
    sTartalom = Input(LOF(hAdatfile), hAdatfile)
Close #hAdatfile

Ezek után az sTartalommal tudsz dolgozni, aztán kiírhatod fájlba.

hAdatfile = FreeFile
Open "C:\utvonal\fajlnev.txt" For Binary As #hAdatfile
    Put #hAdatfile , , sTartalom
Close #hAdatfile

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...