Adott egy folyamat, amelyben tetszőleges tipusú fájlal dolgozunk,
a folyamat eredménye, hogy a fájl végén megjelenik N számú NULL karakter.
Adódhat bármilyen problémám a file rekonstruálásában, ha a folyamat végén eltávolítom az összes NULL karaktert?
- 5936 megtekintés
Hozzászólások
Igen.
Fuszenecker_Róbert
- A hozzászóláshoz be kell jelentkezni
pl?
- A hozzászóláshoz be kell jelentkezni
több csoportra lehet osztani a hibákat, amiket ez okozhat:
- bármilyen
- váratlan
- végzetes
- lappangó
- nullpointer
- segfault
- kékhalál
- null reference
- egyéb :D
- A hozzászóláshoz be kell jelentkezni
Írtam egy bináris konténert kezelő programot, és úgy gondoltam, hogy a fájlok végéről leveszem azokat a node-okat reprezentáló bájtokat, ememlyek bizonyos szempontoknek megfelelnek: 0x80. Akkor volt baj, amikor az utolsó értelmes adat egy GUID volt, ami tartalmazott egy 0x80-at a végén. Mivel én hátulról előrefelé haladtam a stream-ben, hibásan kivettem olyan bájtokat is, amiket nem kellett volna. Így másképpen oldottam meg a problémát, azóta kiválóan működik.
Fuszenecker_Róbert
- A hozzászóláshoz be kell jelentkezni
Lehet, hogy rosszul értem.
Ha "tetszőleges tipusú fájl" játszik, akkor pl. binárisan kiírt számok is lehetnek benne. Ebben lehetnek 0 bájtok, nem is ritkán, ha pl. egészek vannak binárisan kiírva. Na, ha ebből eltávolítod az *összes* NULL-t (karaktersorozatként értelmezve a fájlt) akkor tuti, hogy nagy bajba kerülsz.
Ha mégsem annyira tetszőleges az a típus, hanem szöveges, akkor meg lehet úszni a bajt, ha tudod, hogy a bemenő fájlban nem fordultak elő NULL-ok, mert pl. szabályos, nem trükköző printf()-ekkel voltak kiírva.
De miért nem csak a fájl végét szabadítod meg a NULL-októl?
- A hozzászóláshoz be kell jelentkezni
mert a csak a fájl végén az összetettebb megoldás.
- A hozzászóláshoz be kell jelentkezni
Nem olyan nehéz az!
Ha tudod, hogy a fáljok nem túl nagyok, akkor legegyszerűbb egyben, bájtfolyamként beolvasni a memóriába, ott visszaszámlálni a végéről, és kiírni a pár bájttal kevesebbet.
Ha akármilyen nagy fájlok lehetnek, akkor lseek()-kel ráállsz a végére, aztán lépkedsz vissza, amíg 0-kat találsz. Ha megvan, hány 0 van a végén, akkor a fájlról készítesz egy másolatot, melyből kihagyod az utolsó ennyi db. bájtot.
- A hozzászóláshoz be kell jelentkezni
UTF16LE enkódolásnál máris előjön a probléma, pedig az szöveges :-)
Fuszenecker_Róbert
- A hozzászóláshoz be kell jelentkezni
Jól értem, hogy van adott tartalmú fájlod a folyamat bemeneteként, amely fájl a folyamat végén ugyanazt tartalmazza, mint előtte, csak hozzácsapódik egy rakás NULL?
Azt is jól értem, hogy arra vagy kíváncsi, hogy a fájl végéről levágva a NULL bájtokat, a fájlt újra megetetheted-e a folyamattal?
Mert ha mindezeket jól értem ÉS a folyamat(ok összessége) nem érzékeny a fájl multiplikált feldolgozásáta, akkor nem látok veszélyt.
Ha a fenti értelmezések bármelyike nem igaz, én nem kísérleteznék ilyesmivel. Olyan sok egyéb veszélyes sport létezik, amivel nyakat lehet szegni.
- A hozzászóláshoz be kell jelentkezni
igen, részben, jól érted, a fájl végén megjelenik egy rakás null,
de megvalósítás szempotjápól egyszerűbb az a lehetőség, hogy minden létező null-t kiszedmi.
a fájl biztosan nem valami bináris, vagy valamilyen futtatható.
- A hozzászóláshoz be kell jelentkezni
Most mit értesz "nem bináris" alatt? Hogy szöveges, amibe szabályosan, mondjuk printf-ekkel csak nem speciális karakterek lettek nyomtatva?
Még ez is lehet veszélyes, mert mondjuk egy UTF-8 kódolású szövegben is előfordulhat egy 0 bájt. Hogy ezeket ne írtsd ki, a fájt intelligensen, értelmezve a több-bájtos karaktereket kellene kezelni.
Nem lehet annyira bonyolult csak a végső 0-kat kiírtani! De a legjobb az lenne, ha tudnád, hány 0-val gyarapodott a fájl és csak azokat vágnád le.
- A hozzászóláshoz be kell jelentkezni
Ha tényleg mindent jól értettem, akkor kb. ennyi a feladat:
ORIGSIZE=`ls -l eredetifajl | awk '{print $5}'`
folyamat eredetifajl
dd if=eredetifajl of=eredetifajl.tmp bs=1 count=$ORIGSIZE
mv eredetifajl.tmp eredetifajl
- A hozzászóláshoz be kell jelentkezni
Ja, én azt hittem, a folyamat egy új fájlt hoz létre, aminek a végén felesleges NULL-ok vannak....
- A hozzászóláshoz be kell jelentkezni
tulajdonképpen új fájl jön létre a végén null-okkal, mivel a a folyamat
több lépésből áll, ami különböző időben, és térben történhet, és az eredeti file nincs jelen csak az első lépésnél.
( folyamat nem c-ben lesz megvalósítva)
- A hozzászóláshoz be kell jelentkezni
Én szerintem a válasz az, hogy attól függ, mit csinálsz azzal a fájllal utána. Ha az azt feldolgozó proginak nem kell NULL, akkor kiszedheted, ha kell, akkor nem :)
Ha szövegfálj-szerű dologról van szó, és az azt beolvasó programnak szüksége van 0-ra a végén, akkor az egy idióta program. Úgyszintén, ami ilyet állít elő.
- A hozzászóláshoz be kell jelentkezni