MAGIC(5)

NUME
magic - fișier de model magic al comenzii «file»

DESCRIERE
Această pagină de manual documentează formatul fișierelor magice utilizat de comanda file(1), versiunea 5.47. Comanda file(1) identifică tipul unui fișier folosind, printre alte teste, un test pentru a verifica dacă fișierul conține anumite “„modele magice””. Baza de date a acestor “„modele magice”” se află de obicei într-un fișier binar din /usr/share/file/misc/magic.mgc sau într-un director de fișiere de fragmente de modele magice din textul sursă din /usr/share/file/misc/magic. Baza de date specifică ce modele trebuie testate, ce mesaj sau tip MIME trebuie afișat dacă se găsește un anumit model și informații suplimentare care trebuie extrase din fișier.

Formatul fișierelor de fragmente sursă care sunt utilizate pentru crearea acestei baze de date este următorul: Fiecare linie a unui fișier de fragmente specifică un test care urmează să fie efectuat. Un test compară datele care încep la o anumită poziție în fișier cu o valoare de octet, un șir de caractere sau o valoare numerică. Dacă testul reușește, se imprimă un mesaj. Linia este formată din următoarele câmpuri:

poziția
    Un număr care specifică poziția (în octeți) în fișier a datelor care urmează să fie testate. Această poziție poate fi un număr negativ dacă este:
    •   Prima poziție directă a intrării magice (la nivelul de continuare 0), caz în care este interpretată ca o poziție de la sfârșitul fișierului, mergând înapoi. Acest lucru funcționează numai atunci când este disponibil un descriptor de fișier pentru fișier și acesta este un fișier obișnuit.
    •   O poziție de continuare în raport cu sfârșitul ultimului câmp de nivel superio. ().
    Dacă poziția începe cu simbolul “+”, atunci toate pozițiile sunt interpretate ca fiind de la începutul fișierului (implicit).

tipul
    Tipul de date care urmează să fie testate. Valorile posibile sunt:

    byte
        O valoare de un octet.

    short
        O valoare de doi octeți în ordinea nativă de octeți a acestei mașini.

    long
        O valoare de patru octeți în ordinea nativă de octeți a acestei mașini.

    quad
        O valoare de opt octeți în ordinea nativă de octeți a acestei mașini.

    float
        Un număr cu virgulă mobilă IEEE pe 32 de biți, cu precizie simplă, în ordinea nativă a octeților acestei mașini.

    double
        Un număr cu virgulă mobilă IEEE pe 64 de biți, cu precizie dublă, în ordinea nativă a octeților acestei mașini.

    string
        Un șir de octeți. Specificarea tipului de șir poate fi urmată opțional de o opțiune /<width>(lățimea) și opțional de un set de fanioane /[bCcftTtWw]*. Caracterele bară oblică „/” pot fi utilizate pentru a separa opțiunile în vederea facilitării citirii. Lățimea limitează numărul de caractere care urmează să fie copiate. Zero înseamnă toate caracterele. Sunt acceptate următoarele fanioane:
        b   Forțează testarea fișierelor binare.
        C   Utilizează potrivirea insensibilă la majuscule: caracterele în majuscule din magic se potrivesc atât cu caracterele în minuscule, cât și cu cele în majuscule din țintă, în timp ce caracterele în minuscule din magic se potrivesc numai cu caracterele în majuscule din țintă (nu este validă pentru expresie regulată).
        c   Utilizează potrivirea insensibilă la minuscule: caracterele cu minuscule din magic se potrivesc atât cu caracterele în minuscule, cât și cu cele în majuscule din țintă, în timp ce caracterele în majuscule din magic se potrivesc numai cu caracterele în majuscule din țintă (nu este validă pentru expresie regulată). Pentru a realiza o potrivire completă insensibilă la majuscule, specificați atât “c”, cât și “C”.
        f   Solicită ca șirul de caractere potrivit să fie un cuvânt complet, nu un cuvânt parțial potrivit.
        s   Nu include lungimea potrivirii în calculul poziției (validă numai pentru căutare și expresie regulată).
        T   Decupează șirul de caractere, adică spațiile albe anterioare și posterioare sunt șterse înainte ca șirul să fie imprimat.
        t   Forțează testarea fișierelor text.
        W   Spațiu alb compact în țintă, care trebuie să conțină cel puțin un caracter de spațiu alb (nu este validă pentru expresie regulată). Dacă magia are n spații goale consecutive, ținta trebuie să aibă cel puțin n spații goale consecutive pentru a se potrivi.
        w   Tratează fiecare spațiu liber din magic ca un spațiu liber opțional. Acesta este șters înainte ca șirul să fie imprimat (nu este validă pentru expresie regulată).

    pstring
        Un șir în stil Pascal în care primul octet/short/int este interpretat ca lungimea fără semn. Lungimea implicită este octetul și poate fi specificată ca modificator. Sunt acceptate următoarele modificatoare:
        B   O lungime de un octet (implicit).
        H   O lungime big endian de 2 octeți.
        h   O lungime little endian de 2 octeți.
        L   O lungime big endian de 4 octeți.
        l   O lungime little endian de 4 octeți.
        J   Lungimea se include pe sine în calculul său.
        Șirul nu se termină cu NUL. “J” este utilizată mai degrabă decât cea mai valoroasă “I” deoarece acest tip de lungime este o caracteristică a formatului JPEG.

    date
        O valoare de patru octeți interpretată ca o dată UNIX.

    qdate
        O valoare de opt octeți interpretată ca o dată UNIX.

    ldate
        O valoare de patru octeți interpretată ca o dată în stil UNIX, dar interpretată ca oră locală și nu ca UTC.

    qldate
        O valoare de opt octeți interpretată ca o dată în stil UNIX, dar interpretată ca oră locală și nu ca UTC.

    qwdate
        O valoare de opt octeți interpretată ca o dată în stilul Windows.

    msdosdate
        O valoare de două octeți interpretată ca dată în stilul FAT/DOS.

    msdostime
        O valoare de două octeți interpretată ca oră în stilul FAT/DOS.

    beid3
        O lungime ID3 de 32 de biți în ordinea octeților big-endian.

    beshort
        O valoare de doi octeți în ordinea octeților big-endian.

    belong
        O valoare de patru octeți în ordinea octeților big-endian.

    bequad
        O valoare de opt octeți în ordinea octeților big-endian.

    befloat
        Un număr cu virgulă mobilă IEEE pe 32 de biți, cu precizie simplă, în ordinea octeților big-endian.

    bedouble
        Un număr cu virgulă mobilă IEEE pe 64 de biți, cu precizie simplă, în ordinea octeților big-endian.

    bedate
        O valoare de patru octeți în ordinea octeților big-endian, interpretată ca o dată Unix.

    beqdate
        O valoare de opt octeți în ordinea octeților big-endian, interpretată ca o dată Unix.

    beldate
        O valoare de patru octeți în ordinea octeților big-endian, interpretată ca o dată în stil UNIX, dar interpretată ca oră locală în loc cat UTC.

    beqldate
        O valoare de opt octeți în ordinea octeților big-endian, interpretată ca o dată în stil UNIX, dar interpretată ca oră locală în loc cat UTC.

    beqwdate
        O valoare de opt octeți în ordinea octeților big-endian, interpretată ca o dată în stilul Windows.

    bemsdosdate
        O valoare de doi octeți în ordinea octeților big-endian, interpretată ca dată în stilul FAT/DOS.

    bemsdostime
        O valoare de doi octeți în ordinea octeților big-endian, interpretată ca oră în stilul FAT/DOS.

    bestring16
        Un șir Unicode (UCS16) de doi octeți în ordinea octeților big-endian.

    leid3
        O lungime ID3 de 32 de biți în ordinea octeților little-endian.

    leshort
        O valoare de doi octeți în ordinea octeților little-endian.

    lelong
        O valoare de patru octeți în ordinea octeților little-endian.

    lequad
        O valoare de opt octeți în ordinea octeților little-endian.

    lefloat
        Un număr cu virgulă mobilă IEEE pe 32 de biți, cu precizie simplă, în ordinea octeților little-endian.

    ledouble
        Un număr cu virgulă mobilă IEEE pe 64 de biți, cu precizie dublă, în ordinea octeților little-endian.

    ledate
        O valoare de patru octeți în ordinea octeților little-endian, interpretată ca o dată UNIX.

    leqdate
        O valoare de opt octeți în ordinea octeților little-endian, interpretată ca o dată UNIX.

    leldate
        O valoare de patru octeți în ordinea octeților little-endian, interpretată ca o dată în stil UNIX, dar interpretată ca oră locală în loc de oră UTC.

    leqldate
        O valoare de opt octeți în ordinea octeților little-endian, interpretată ca o dată în stil UNIX, dar interpretată ca oră locală în loc de oră UTC.

    leqwdate
        O valoare de opt octeți în ordinea octeților little-endian, interpretată ca o dată în stilul Windows.

    lemsdosdate
        O valoare de doi octeți în ordinea octeților little-endian, interpretată ca dată în stilul FAT/DOS.

    lemsdostime
        O valoare de doi octeți în ordinea octeților little-endian, interpretată ca oră în stilul FAT/DOS.

    lestring16
        Un șir Unicode (UCS16) de doi octeți în ordinea octeților little-endian.

    melong
        O valoare de patru octeți în ordinea octeților middle-endian (PDP-11).

    medate
        O valoare de patru octeți în ordinea octeților middle-endian (PDP-11), interpretată ca o dată UNIX.

    meldate
        O valoare de patru octeți în ordinea octeților middle-endian (PDP-11), interpretată ca o dată în stil UNIX, dar interpretată ca oră locală în loc de oră UTC.

    indirect
        Începând de la poziția dată, se consultă din nou baza de date a magiei. Poziția magiei indirect este implicit absolută în fișier, dar se poate specifica /r pentru a indica faptul că poziția este relativă de la începutul intrării.

    name
        Definește o instanță magică “named” (numită) care poate fi apelată de la o altă intrare magică use, ca un apel de subrutină. Pozițiile magice directe ale instanței numite sunt relative la poziția intrării corespondente anterioare, dar pozițiile indirecte sunt relative la începutul fișierului, ca de obicei. Intrările magice numite returnează „true” dacă a existat o potrivire în evaluarea intrării sau dacă a existat o potrivire anterioară.

    use Apelează recursiv magia numită începând de la poziția curentă. Dacă numele referinței începe cu ^, atunci endianness-ul magiei este schimbat; dacă magia numită leshort, de exemplu, aceasta este tratată ca beshort și viceversa. Acest lucru este util pentru a evita dublarea regulilor pentru diferite endianness-uri.

    regex
        O potrivire a expresiei regulate în sintaxa POSIX extinsă a expresiei regulate (precum egrep). Procesarea expresiilor regulate poate dura un timp exponențial, iar performanța lor este greu de prevăzut, astfel încât utilizarea lor este descurajată. Atunci când sunt utilizate în medii de producție, performanța lor trebuie verificată cu atenție. Dimensiunea șirului de caractere de căutat trebuie, de asemenea, limitată prin specificarea /<length>, pentru a evita problemele de performanță în scanarea fișierelor lungi. Specificarea tipului poate fi, de asemenea, urmată opțional de /[c][s][l]. Fanionul “c” face ca potrivirea să fie insensibilă la majuscule, în timp ce fanionul “s” actualizează pozițial la poziția de început a potrivirii, în loc de cea de la sfârșit. Modificatorul “l”, schimbă limita de lungime în număr de linii în loc de un număr de octeți. Liniile sunt delimitate de delimitatorul de linie nativ al platformelor. Atunci când se specifică un număr de linii, se calculează și un număr implicit de octeți, presupunând că fiecare linie are o lungime de 80 de caractere. Dacă nu este specificat nici un număr de octeți, nici un număr de linii, căutarea este limitată automat la 8Kio. ^ și $ se potrivesc cu începutul și sfârșitul liniilor individuale, respectiv, nu cu începutul și sfârșitul fișierului.

    search
        O căutare literală de șir de caractere începând de la poziția dată. Se pot utiliza aceleași fanioane modificatoare ca pentru modelele de șir de caractere. Expresia de căutare trebuie să conțină intervalul sub forma /de număr care este numărul de poziții la care se va încerca potrivirea, începând de la poziția de pornire. Aceasta este potrivită pentru căutarea în expresii binare mai mari cu poziții variabile, utilizând eludările \ pentru caracterele speciale. Ordinea modificatorului și a numărului nu este relevantă.

    default
        Acesta este destinat a fi utilizat cu testul x (care este întotdeauna adevărat) și nu are tip. Se potrivește atunci când niciun alt test la acel nivel de continuare nu s-a potrivit înainte. Ștergerea testelor potrivite pentru un nivel de continuare se poate face folosind testul clear.

    clear
        Acest test este întotdeauna adevărat și șterge fanionul de potrivire pentru nivelul de continuare respectiv. Este destinat a fi utilizat împreună cu testul default.

    der Analizează fișierul ca pe un fișier de certificat DER. Câmpul de testare este utilizat ca un tip DER care trebuie să fie comparat. Tipurile DER sunt: eoc, bool, int, bit_str, octet_str, null, obj_id, obj_desc, ext, real, enum, embed, utf8_str, rel_oid, time, res2, seq, set, num_str, prt_str, t61_str, vid_str, ia5_str, utc_time, gen_time, gr_str, vis_str, gen_str, univ_str, char_str, bmp_str, date, tod, datetime, duration, oid-iri, rel-oid-iri. Aceste tipuri pot fi urmate de o dimensiune numerică opțională, care indică lățimea câmpului în octeți.

    guid
        Un identificator unic global, analizat și imprimat ca XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Formatul său este un șir de caractere.

    poziția
        Aceasta este o valoare cvadruplă care indică poziția curentă a fișierului. Aceasta poate fi utilizată pentru a determina dimensiunea fișierului sau a tamponului magic. De exemplu, intrările magice:

            -0	offset	x	acest fișier are %lld octeți
            -0	offset	<=100	trebuie să fie mai mare de 100 de octeți \
                                    	și este de doar %lld de octeți

    octal
        Un șir reprezentând un număr octal.

    Pentru compatibilitate cu standardul Unix unic (Single UNIX Standard), specificatorii de tip dC și d1 sunt echivalenți cu byte, specificatorii de tip uC și u1 sunt echivalenți cu ubyte, specificatorii de tip dS și d2 sunt echivalenți cu short, specificatorii de tip uS și u2 sunt echivalenți cu ushort, specificatorii de tip dI, dL, și d4 sunt echivalenți cu long, specificatorii de tip uI, uL, și u4 sunt echivalenți cu ulong, specificatorul de tip d8 este echivalent cu quad, specificatorul de tip u8 este echivalent cu uquad, iar specificatorul de tip s este echivalent cu string. În plus, specificatorul de tip dQ este echivalent cu quad, iar specificatorul de tip uQ este echivalent cu uquad.

    Fiecare model magic de nivel superior (a se vedea mai jos pentru o explicație a nivelurilor) este clasificat ca text sau binar în funcție de tipurile utilizate. Tipurile “regex” și “search” sunt clasificate ca teste text, cu excepția cazului în care în model sunt utilizate caractere neimprimabile. Toate celelalte teste sunt clasificate ca binare. Un model de nivel superior este considerat a fi un test text atunci când toate modelele sale sunt modele text; altfel, este considerat a fi un model binar. La potrivirea unui fișier, se încearcă mai întâi modelele binare; dacă nu se găsește nicio potrivire, iar fișierul arată ca un text, se determină codificarea acestuia și se încearcă modelele text.

    Tipurile numerice pot fi urmate opțional de și de o valoare numerică, pentru a specifica faptul că valoarea trebuie să fie evaluată cu operatorul logic AND cu valoarea numerică înainte de efectuarea oricărei comparații. Sunt acceptați următorii operanzi: ,,, +, -, *, /, %. Pre-adăugarea unui u la tip indică faptul că comparațiile ordonate trebuie să fie fără semn.

test
    Valoarea care urmează să fie comparată cu valoarea din fișier. Dacă tipul este numeric, această valoare este specificată în format C; dacă este un șir de caractere, este specificată ca un șir de caractere C cu eludările obișnuite permise (de exemplu, \n pentru linie nouă).

    Valorile numerice pot fi precedate de un caracter care indică operația care urmează să fie efectuată. Acesta poate fi =, pentru a specifica faptul că valoarea din fișier trebuie să fie egală cu valoarea specificată,, pentru a specifica faptul că valoarea din fișier trebuie să fie mai mică decât valoarea specificată,, pentru a specifica faptul că valoarea din fișier trebuie să fie mai mare decât valoarea specificată,, pentru a specifica faptul că valoarea din fișier trebuie să aibă activați toți biții care sunt activați în valoarea specificată, ^, pentru a specifica faptul că valoarea din fișier trebuie să fi eliminat oricare dintre biții care sunt activați în valoarea specificată sau ~, valoarea specificată după este negată înainte de testare. x, pentru a specifica că orice valoare se va potrivi. Dacă caracterul este omis, se presupune că este =. Operatorii, ^ și ~ nu funcționează cu numere cu virgulă flotantă și numere de precizie dublă. Operatorul! specifică faptul că linia se potrivește dacă testul nu reușește.

    Valorile numerice sunt specificate în format C; de exemplu, 13 este zecimal, 013 este octal, iar 0x13 este hexazecimal.

    Operațiile numerice nu sunt efectuate pe tipuri de date, în schimb valoarea numerică este interpretată ca un decalaj.

    Pentru valorile șir de caractere, șirul din fișier trebuie să corespundă șirului specificat. Operatorii =, și (dar nu și) pot fi aplicați șirurilor de caractere. Lungimea utilizată pentru potrivire este cea a argumentului șirului de caractere din fișierul magic. Aceasta înseamnă că o linie se poate potrivi cu orice șir nevid (utilizat de obicei pentru a imprima apoi șirul), cu \0 (deoarece toate șirurile nevid sunt mai mari decât șirul gol).

    Datele sunt tratate ca valori numerice în reprezentarea internă respectivă.

    Testul special x este întotdeauna evaluat ca fiind „true” (adevărat).

message
    Mesajul care urmează să fie afișat dacă comparația reușește. Dacă șirul conține o specificație de format printf(3), valoarea din fișier (cu orice mascare specificată) este imprimată folosind mesajul ca șir de format. Dacă șirul de caractere începe cu “\b”, mesajul imprimat este restul șirului de caractere, fără niciun spațiu alb adăugat înainte de acesta: în mod normal, potrivirile multiple sunt separate de un singur spațiu.

Creatorul și tipul unui APPLE cu 4+4 caractere APPLE pot fi specificate ca:

    !:apple	CREATYPE

O listă de extensii de nume de fișiere des întâlnite, separate prin bară oblică, poate fi specificată ca:

    !:ext	ext[/ext...]

adică șirul literal “!:ext” urmat de o listă de extensii des întâlnite; de exemplu pentru imagini JPEG:

    !:ext jpeg/jpg/jpe/jfif

Un tip MIME este dat pe o linie separată, care trebuie să fie următoarea linie fără spațiu liber sau comentariu după linia magică care identifică tipul de fișier, și are următorul format:

    !:mime	MIMETYPE

adică șirul literal “!:mime” urmat de tipul MIME.

Un punct forte opțional poate fi furnizat pe o linie separată, care se referă la descrierea magică curentă folosind următorul format:

    !:strength OPERAND VALOARE

Operandul OPERAND poate fi: +, -, * sau /, iar VALOARE este o constantă între 0 și 255. Această constantă este aplicată folosind operandul specificat la puterea magică implicită calculată în prezent.

Unele formate de fișiere conțin informații suplimentare care trebuie afișate împreună cu tipul de fișier sau necesită teste suplimentare pentru a determina adevăratul tip de fișier. Aceste teste suplimentare sunt introduse de unul sau mai multe caractere care preced pozișia. Numărul de de pe linie indică nivelul testului; o linie fără la început este considerată a fi la nivelul 0. Testele sunt aranjate într-o ierarhie arborescentă: dacă testul de pe o linie de la nivelul n reușește, toate testele următoare de la nivelul n+1 sunt efectuate, iar mesajele afișate dacă testele reușesc, până când apare o linie cu nivelul n (sau mai puțin). Pentru fișiere mai complexe, se pot utiliza mesaje goale pentru a obține doar efectul „if/then”, în felul următor:

    0      string    MZ
    0x18  uleshort  0x40   MS-DOS executable
    0x18  uleshort  0x3f   extended PC executable (e.g., MS Windows)

Decalajele nu trebuie să fie constante, ci pot fi citite și din fișierul examinat. Dacă primul caracter după ultimul este un ( atunci șirul de caractere de după paranteză este interpretat ca un decalaj indirect. Aceasta înseamnă că numărul de după paranteză este utilizat ca un decalaj în fișier. Valoarea de la acel decalaj este citită și este utilizată din nou ca decalaj în fișier. Decalajele indirecte sunt de forma: (x [[.,][bBcCeEfFgGhHiIlmosSqQ]][+-][ y ]). Valoarea lui x este utilizată ca decalaj în fișier. Un octet, o lungime id3, un număr scurt sau lung este citit la acel decalaj, în funcție de specificatorul de tip [bBcCeEfFgGhHiIlLmsSqQ]. Valoarea este tratată ca având semn dacă se specifică “”, sau fără semn dacă se specifică “”.. Tipurile cu majuscule interpretează numărul ca o valoare big endian, în timp ce versiunile cu litere mici interpretează numărul ca o valoare little endian; tipul m interpretează numărul ca o valoare middle endian (PDP-11). La acest număr se adaugă valoarea y, iar rezultatul este utilizat ca decalaj în fișier. Tipul implicit dacă nu este specificat unul este long. Sunt recunoscute următoarele tipuri:
Tip | Sy Mnemonic | Sy Endian | Sy Dim.
bcBC | Byte/Char | N/A | 1
efg | Double | Little | 8
EFG | Double | Big | 8
hs | Half/Short | Little | 2
HS | Half/Short | Big | 2
i | ID3 | Little | 4
I | ID3 | Big | 4
l | Long | Little | 4
L | Long | Big | 4
m | Middle | Middle | 4
o | Octal | Textual | Variable
q | Quad | Little | 8
Q | Quad | Big | 8

În acest fel se pot examina structuri de lungime variabilă:

    # Executabilele MS Windows sunt de asemenea executabile MS-DOS valide
    0           string   MZ
    0x18       uleshort 0x40  MZ executable (MS-DOS)
    # sare peste întregul bloc de mai jos dacă nu este un executabil extins
    0x18       uleshort 0x3f
    (0x3c.l)  string   PE\0\0 PE executable (MS-Windows)
    (0x3c.l)  string   LX\0\0 LX executable (OS/2)

Această strategie de examinare are un dezavantaj: trebuie să vă asigurați că în cele din urmă se imprimă ceva, altfel utilizatorii pot obține o ieșire goală (cum ar fi atunci când nu există nici PE\0\0, nici LE\0\0 în exemplul de mai sus).

Dacă acest decalaj indirect nu poate fi utilizată direct, sunt posibile calcule simple: adăugarea [+-*/%|^]număr între paranteze permite modificarea valorii citite din fișier înainte ca aceasta să fie utilizată ca decalaj:

    # Executabilele MS Windows sunt de asemenea executabile MS-DOS valide
    0           string   MZ
    # uneori, valoarea de la 0x18 este mai mică decât 0x40, dar există încă un
    # executabil extins, adăugat pur și simplu la fișier
    0x18       uleshort 0x40
    (4.s*512) leshort  0x014c  COFF executable (MS-DOS, DJGPP)
    (4.s*512) leshort  !0x014c MZ executable (MS-DOS)

Uneori nu cunoașteți decalajul exact, deoarece acesta depinde de lungimea sau de poziția (în cazul în care a fost utilizată indirectă anterior) câmpurilor precedente. Puteți specifica un decalaj relativ la sfârșitul ultimului câmp de nivel superior folosind ‘’ ca prefix al decalajului:

    0           string   MZ
    0x18       uleshort 0x3f
    (0x3c.l)  string   PE\0\0    PE executable (MS-Windows)
    # imediat după semnătura PE este tipul de CPU
    0       leshort  0x14c     for Intel 80386
    0       leshort  0x8664    for x86-64
    0       leshort  0x184     for DEC Alpha

Decalajele indirecte și relative pot fi combinate:

    0             string   MZ
    0x18         uleshort 0x40
    (4.s*512)   leshort  !0x014c MZ executable (MS-DOS)
    # dacă nu este COFF, merge înapoi cu 512 octeți și adaugă
    # decalajul luat de la octetul 2/3, care este un alt mod de a
    # găsi începutul executabilului extins
    (2.s-514) string   LE      LE executable (MS Windows VxD driver)

Sau invers:

    0                 string   MZ
    0x18             uleshort 0x3f
    (0x3c.l)        string   LE\0\0  LE executable (MS-Windows)
    # la decalajul 0x80 (-4, deoarece decalajele relative încep de la
    # sfârșitul potrivirii nivelului superior) în interiorul antetului LE,
    # găsim decalajul absolut către zona de cod, unde căutăm o semnătură specifică
    (0x7c.l+0x26) string   UPX     \b, UPX compressed

Sau chiar amândouă!

    0                string   MZ
    0x18            uleshort 0x3f
    (0x3c.l)       string   LE\0\0 LE executable (MS-Windows)
    # la decalajul 0x58 în interiorul antetului LE, găsim decalajul relativ
    # către o zonă de date în care căutăm o semnătură specifică
    (0x54.l-3)  string   UNACE  \b, ACE self-extracting archive

Dacă trebuie să aveți de-a face cu perechi decalaj/lungime în fișierul dvs., chiar și a doua valoare dintr-o expresie în paranteze poate fi preluată din fișierul însuși, utilizând un alt set de paranteze. Rețineți că acest decalaj indirect suplimentar este întotdeauna relativ la începutul decalajului indirect principal.

    0                 string       MZ
    0x18             uleshort     0x3f
    (0x3c.l)        string       PE\0\0 PE executable (MS-Windows)
    # caută secțiunea PE numită „.idata”...
    0xf4          search/0x140 .idata
    # ...și merge la sfârșitul acesteia, calculat de la start+lungime;
    # acestea sunt situate la 14 și 10 octeți după numele secțiunii
    (0xe.l+(-4)) string       PK\3\4 \b, ZIP self-extracting archive

Dacă aveți o listă de valori cunoscute la un anumit nivel de continuare și doriți să furnizați un caz implicit de tip comutator:

    # curăță această continuare a nivelului de potrivire
    18	clear	x
    18	lelong	1	one
    18	lelong	2	two
    18	default	x
    # imprimă potrivirea implicită
    18	lelong	x	unmatched 0x%x

CONSULTAȚI ȘI
file(1) - comanda care citește acest fișier.

ERORI
Formatele long, belong, lelong, melong, short, beshort și leshort nu depind de lungimea tipurilor de date C short și long de pe platformă, chiar dacă specificația unică UNIX implică acest lucru. Cu toate acestea, deoarece OS X Mountain Lion a trecut de suita de validare a specificației unice UNIX și furnizează o versiune a file(1) în care acestea nu depind de dimensiunile tipurilor de date C și care este construită pentru un mediu pe 64 de biți în care long are 8 octeți în loc de 4 octeți, probabil că suita de validare nu testează dacă, de exemplu, long se referă la un element cu aceeași dimensiune ca tipul de date C long. Probabil că ar trebui să existe nume de tip int8, uint8, int16, uint16, int32, uint32, int64 și uint64, precum și variante ale acestora cu ordinea octeților specificată, pentru a fi mai clar că aceste tipuri au lățimile specificate.

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3: https://www.gnu.org/licenses/gpl-3.0.html sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.