CNC_Master Posted October 15, 2012 Posted October 15, 2012 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.
SkyBird Posted October 15, 2012 Posted October 15, 2012 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.
CNC_Master Posted October 15, 2012 Author Posted October 15, 2012 (edited) 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 October 15, 2012 by CNC_Master
SkyBird Posted October 16, 2012 Posted October 16, 2012 Szerintem meg van gond a címmel. Nekem eléggé szúrja a szemem, hogy binaby.
CNC_Master Posted October 16, 2012 Author Posted October 16, 2012 Akkor szólj egy admin-nak, én nem tudom azt hogy kell kicserélni, õk meg elvileg bele tudnak nyúlni az adatbázisba.
arpsoft Posted October 16, 2012 Posted October 16, 2012 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.
[OP]Destroy-man Posted October 16, 2012 Posted October 16, 2012 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.
CNC_Master Posted October 16, 2012 Author Posted October 16, 2012 (edited) 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ó: Edited October 16, 2012 by CNC_Master
arpsoft Posted October 16, 2012 Posted October 16, 2012 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.
Temporary Posted October 16, 2012 Posted October 16, 2012 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.
CNC_Master Posted October 16, 2012 Author Posted October 16, 2012 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.
CNC_Master Posted October 16, 2012 Author Posted October 16, 2012 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...
arpsoft Posted October 17, 2012 Posted October 17, 2012 Nagyon bonyolultan gondolkodsz. 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now