Interiorul fișierelor Vordian este pur și simplu oribil - oh, msbro!

Legenda a mers mult timp cu privire la complexitatea și îndemânarea fișierelor Ward. Se știa că acest format este extrem de confuz și, în afară de acesta, este de asemenea complet secret, astfel încât aproximativ jumătate din câmpuri ar putea fi ghicit.


Nu voi ascunde că mă interesează aceste fișiere, dar nu puteam merge mai departe decât prima pagină a descrierii. Cu toate acestea, gestalul neînchipuit a rămas.

Ce pot spune? În mod voluntar am amintit o glumă veche: "Ei bine, groază. Ei bine, doar groază, dar nu este horror-horror-horror.

Slavă Domnului că parsez aceste fișiere pe Perl, și nu pe niciunul din AutoCode C. Un nivel ridicat de limbă și o grămadă de biblioteci gata făcute (de exemplu, pentru a citi diferite pagini de cod) este un dar de la Dumnezeu.

Deci, munca în ansamblu a durat o săptămână, iar cea mai dificilă era înțelegerea formatului intern. Desigur, înțelegerea acestui lucru nu este complet, pentru că sarcina mea a fost să scot din document unele texte fără formatare, dar am făcut-o cu atenție.

Deci, cum sunt aranjate fișierele Wrdd?

În primul rând, nu este vorba de un fișier vordian, ci de un container universal, în care sunt ambalate documentele în sine. Într-un astfel de container, toate fișierele Office sunt umplute și poate altceva.

În principiu, formatul de stocare OLE este suficient de rezonabil și nu dă impresia de ceva complet idioat. Dar ... nu este absolut necesar. De fapt, acesta este ceva de genul sistemului de fișiere FAT16, blocat în interiorul unui fișier separat. Nu este vorba de împușcare dintr-un tun pe vrăbii, ci de exterminarea acestor vrăbii de torpile nucleare. Într-un document care conține mai multe fișiere, nu aveți nevoie de un sistem de fișiere care să fie cel puțin la nivelul FS al timpului DOS.

Deci, fișierele CDF (așa cum sunt numite de fișierul utilitar Unix) încep cu un antet. În titlu există un loc pentru primele sute de înregistrări TRP (tabele de alocare a fișierelor, în limbaj comun - FAT). FAT este cea mai naturală, foarte asemănătoare cu cea pe care o găsiți pe dischetele dosos. Înregistrările rămase ale TRF se află în sectoare separate legate de o listă legată. Sectoarele suplimentare sunt numai în fișiere mari (> 7mb).

Potrivit tabletei FAT / TRP, puteți colecta conținutul fiecărui fișier intern (în terminologia MC se numește un fir, dar acest lucru confundă numai problema), dacă știți de la care bloc începe. Blocurile inițiale ale diferitelor structuri sunt scrise, bineînțeles, în antet. Dincolo de masă, puteți desena întregul lanț de sectoare în care sunt scrise conținutul acestui fișier pseudo.

În special, CDF are un director rădăcină, răspândit fizic pe o grămadă de sectoare. Acesta este un catalog real, din nou, la fel ca vechiul Dosovski. Cu toate acestea, pentru eficiență (sau pentru vypendrezha), nu este doar o listă liniară, ci un copac binar echilibrat. Aceasta înseamnă că zeci de mii de înregistrări individuale pot fi înregistrate fără pierderea eficienței căutării. De ce este nevoie într-un fișier în care înregistrările sunt de obicei cinci bucăți, câteodată, douăzeci, bine, maximum o sută de piese (o prezentare cu un număr imens de poze) - știu doar în Redmond. Apropo, numele fișierelor din director sunt stocate în UTF16 - doar în caz.

Din catalog, puteți defini sectorul inițial al oricărui fișier și puteți utiliza TRF pentru a scoate întregul lanț al plasării sale.

Dar asta nu e tot.

Deoarece dimensiunea blocului este destul de mare (de obicei 512 octeți, 4096 este posibilă și prin specificație), când stocați fișiere mici de pseudo, teoretic puteți pierde mult spațiu liber. Prin urmare, există o unitate de stocare separată, împărțită în blocuri de 64 de octeți. Depozitul se întinde din nou de-a lungul lanțului FAT.

Pentru a indica blocurile la care apar fișierele, există o placă separată PHAT sau, mai exact, un mini-PHAT.

Deci, pentru a ajunge la documentul Vordian, trebuie să faceți următoarele:

1. Citiți antetul CDF
2. Încărcați în memoria tabelului de alocare a fișierelor FAT, colectându-l de lanțul de sectoare.
3. Descărcați mini-tabletele colectându-le pe lanțul TRF
4. Încărcați depozitul blocurilor colectându-l pe lanțul TRF
5. Descărcați directorul rădăcină prin colectarea acestuia de către lanțul TRP
6. Deconstruiți directorul și convertiți-l la ceva ușor de citit
7. Găsiți o intrare WordDocument în director
8. Dacă este un fișier mic, compilați-l cu mini-TRF din spațiul de stocare al blocurilor.
9. Dacă este mare, trageți apoi din sectorul discului pe lanțul TRP.

Fiecare pas în sine nu este deosebit de complicat, dar în ansamblu ele provoacă o perplexitate extremă. De ce asemenea dificultăți? De ce a fost imposibil să plasați un catalog liniar obișnuit după titlu și apoi să înregistrați continuu fișierele interne unul câte unul?

Singurul lucru care se poate presupune este că toate acestea au fost făcute pentru a avea posibilitatea de a adăuga subfile fără să atingă începutul fișierului principal. Trebuie remarcat faptul că, în primul rând, aceasta nu este o operațiune foarte solicitată, deoarece toate programele înregistrează de obicei documente de la început până la sfârșit într-o singură trecere. Singura excepție este MS Word și apoi numai în modul infamos rapid de salvare, blestemat de utilizatori. În al doilea rând, chiar și în aceste condiții, nu va funcționa fără a atinge începutul fișierului principal, deoarece trebuie să actualizați directoarele, TRF și antetele.

WordDocument

Formatul CDF, pentru toate monstruozitățile sale, este cel puțin logic și nu foarte complicat (în comparație cu restul conținutului documentului vordian). Descrierea sa durează doar douăzeci de pagini - ugh în comparație cu 300 de pagini din formatul Ward.

Formatul documentului este dificil chiar și pentru a apela un format, mult mai potrivit pentru acesta este definirea unui anali de piatră. Imaginați-vă o prăpastie de piatră pe care au fost imprimate cincizeci de milioane de ani din istoria planetei. Aici este stratul mezozoic, aici este Cenozoicul, aici este amprenta aripii pterodactilului, iar in partea de sus sunt deja depozitele tertiare. Despre același aspect și documentul din interior.

Este suficient să te uiți la titlu, care necesită aproape o treime din dosar. Există trei titluri. Mai întâi, există o mică, în care jumătate din înregistrări se potrivesc cu găurile "Rezervate" sau "Nefolosite". Mai devreme, în Mesozoic, a existat clar ceva care a stat acolo, dar apoi a fost aruncat în coșul de gunoi al istoriei. Există, de asemenea, o versiune a programului înregistrat, care pare să execute un comutator enorm în caractere.

Apoi vine al doilea antet, format din cuvinte de șaisprezece biți. Nu este nimic util în el deloc. La început, mărimea este proiectată în mod clar cu așteptarea că în viitor se vor depune coji de primăvară.

După asta vine al treilea titlu, de data aceasta unul modern, din cuvinte lungi (32 de biți). Are o lungime nelimitată, la început indică, de asemenea, numărul de înregistrări cu un ochi pentru o extindere ulterioară și în esență este o listă în care să se caute diferite tabele și fragmente din perechi de fișiere - dimensiuni / dimensiuni. Tabelele înseși nu sunt aici, ci într-un pseudo-fișier CDF separat numit 0Table sau 1Table (sunt posibile variante).

Viața este de fapt mult mai complicată. Odată ce în fișiere a existat într-adevăr doar text, dar în timp, sub presiunea utilizatorilor și a marketingului, s-au acumulat diferite "caracteristici". Sub le-a luat fluxuri separate - un simplu note de subsol, note de final la sfârșitul anului, sub antet sau subsol, sub orice textbox (perversiune altceva - sub formă de text, dar nu și textul nu Atribuirea foarte clar.).

Începutul acestor fluxuri este indicat în locurile speciale din antet, însă primul antet, din anumite motive, arată lungimea totală - nu textul în sine, ci textul plus toate aceste perversiuni. Iată primul motiv pentru care inscripțiile tipului Page 1 ajung la încheierea multor utilități.

Teoretic, acest format complex este utilizat numai dacă antetul are un flag special fComplex. Dar ... Aici, pe următoarea "dar", piercing, de asemenea, mulți convertoare.

Deja în timpul nostru în documentele adăugate abilitatea de a scrie în Unicode. În același timp, a apărut o problemă (în ceea ce-l privește pe mine): dar fișierele sunt exact de două ori mai lungi. Deoarece software-ul este dezvoltat americanii care, în inima lui nu credeau în existența altor alfabete, și în secret cred că tot felul de scrisori ciudate sunt doar în disertații despre Grecia antică, și nu apar doar ocazional, primul lucru care a venit în minte - să se separe simbolurile pure ASCII de la Unicode murdar. Primii care scriu prin byte pe caracter, al doilea - cum se întâmplă.

Dacă luăm în considerare că această Ogryzkov foarte tabel are loc, și chiar mai mult spațiu în fișierul ocupă diferite arbori binare și tablete din sectorul lanțurilor de format CDF, apoi salvați dimensiunea textului de pe caracterele Unicode nu capta imaginația chiar teza greacă veche. Despre fișiere în limba mare și puternic și nu spun nimic. Ar fi pus totul în UTF-16 și nu a suferit. Pâraie ar fi arhivată, din moment ce fagurea se apasă atât de mult.

După eforturile eroice de a citi textul, în sine, destul de ciudat, nu este nimic complicat. Textul simplu (cu corectarea pentru codificare), unele coduri sub spațiu joacă un rol de serviciu. De exemplu, 0x9 înseamnă, așa cum era de așteptat, tabelarea, 0xA - sfârșitul paginii, 0x7 - sfârșitul celulei tabelului etc. Singura subtilitate este legată de câmpuri. Începutul conținutului câmpului este marcat cu 0x13, capătul câmpului este 0x15, parametrii de nume și de câmp sunt separați de simbolul 0x14 de ceea ce este vizibil în text pentru utilizator. Dar ... A doua parte poate avea un câmp încorporat, pe care multe programe nu le iau în considerare. Ca urmare, în text se mențin pietre precum INCLUDEPICTURE sau PAGEREF *.

Cu toate acestea, există încă un truc murdar. Unele personaje pot însemna ceva destul de diferit, cum ar fi data curentă. Pentru a înțelege dacă un simbol este unul simplu sau nu, trebuie să parsezi tabelele cu proprietățile caracterului, care sunt descrise mai jos. Mărturisesc, tocmai am tăiat toate personajele cu codul de sub martor, ceea ce nu este destul, dar ieftin, rapid și practic.

Extruding textul, nu am mai intrat în format. Este deja un exercițiu pentru tineri și puternici în spirit - pentru a dezasambla toate aceste mese cu nume atât de promițătoare precum CHP, PAPX, SHST, PLCF și toate în același spirit. Lecția este complet pentru titani - să emită formatul exact așa cum face însuși Ward-ul.

Rămâne doar să aducem moralitate, dar este banal: cu ce a venit o persoană, atunci un altul se poate rupe mereu. Ceea ce nu face formatul lui Vord mai puțin rușinos, urât și complet necorespunzător pentru sarcini de schimb de informații în masă în sisteme eterogene.

Citirea ulterioară: