Binaire bestanden c. Hoe een binair bestand te lezen

Een binair bestand is elk bestand op uw computer. Alle informatie op een computer en aanverwante media wordt vastgelegd in bits (vandaar de naam). Ter vergelijking: een tekstbestand kan echter worden gelezen in lezers die overeenkomen met de extensie (de eenvoudigste - zelfs in Kladblok), maar een uitvoerbaar bestand niet. En hoewel een txt-bestand in feite hetzelfde binaire bestand is, bedoelen ze als ze het hebben over het probleem van het openen van de inhoud van binaire bestanden uitvoerbare bestanden, evenals gecomprimeerde gegevens.

Je zult nodig hebben

  • - Hex Edit-programma.

Instructies

  • Download het Hex Edit-programma naar uw harde schijf - een bestandseditor die de inhoud ervan presenteert binair. Open het programma door te dubbelklikken op start bestand. Gegeven software Hiermee kunt u binaire bestanden in realtime lezen, de inhoud wijzigen en uw eigen bestanden toevoegen eigen opnames en nog veel meer. Om volledig in deze omgeving te kunnen werken, moet je er een beetje over weten algemene concepten binaire bestanden.
  • Het programmavenster verschilt niet veel van vaste redacteur: vertrouwd menu en paneel met knoppen, de hoofdtekst van het bewerkte bestand, bladwijzers en statusbalk. Open binair bestand via het menu Bestand of door op het overeenkomstige pictogram op het paneel te klikken. Het binaire bestand verschijnt voor u in de vorm van reeksen met cijfers en letters. Verwar deze symbolen niet met afgedrukte gegevens tekstbestanden. Je kunt ze ook bewerken door tekens te verwijderen, maar in dit geval verwijder je cellen met gegevens, stukjes van het bestand.
  • Breng wijzigingen aan in de inhoud van het bestand. De applicatie kan belangrijke delen van het bestand voor meer informatie weergeven handig zoeken, en heeft dat ook flexibele opstelling grafische weergave binaire code. Schakel de inhoudsweergave naar de ASCII+IBM/OEM-modus om te zien programmacode bestand. Als u de verkeerde regels in een bestand plaatst, werkt het mogelijk niet correct, wat ernstige gevolgen voor u kan hebben. besturingssysteem persoonlijke computer.
  • Sla uw wijzigingen op. Als u geen ervaring heeft met dit soort bestandsbewerking, wees er dan op voorbereid dat het bestand niet wordt geopend en weigert te werken nadat u wijzigingen hebt aangebracht. Je zult waarschijnlijk eerder meerdere exemplaren verpesten je zult resultaten boeken. Probeer niet alle wijzigingen op te slaan bronbestand zodat de inhoud ongewijzigd blijft.
  • De voorbeelden die we tot nu toe hebben besproken, hebben geformatteerde invoer/uitvoer van informatie in bestanden aangetoond. Het is aan te raden om geformatteerde bestandsinvoer/uitvoer van getallen alleen te gebruiken als deze klein zijn in omvang en kwantiteit, en ook als het nodig is om de mogelijkheid te garanderen om bestanden te bekijken zonder software. Anders is het natuurlijk veel efficiënter om binaire I/O te gebruiken, waarbij getallen op dezelfde manier worden opgeslagen als in het OP van de computer, in plaats van als tekenreeksen. Laat me u eraan herinneren dat een geheel getal (int) of reële (float) waarde 4 bytes aan geheugen in beslag neemt, de waarde typ dubbel– 8 bytes en de symbolische waarde typ char- 1 byte. Het getal 12345 in een tekstbestand (geformatteerd) neemt bijvoorbeeld 5 bytes in beslag, en in een binair bestand 4 bytes.

    Binaire bestanden, d.w.z. bestanden waarin informatie is opgeslagen in een interne representatievorm worden gebruikt voor later gebruik door software; ze kunnen niet als niet-software worden bekeken. Het voordeel van binaire bestanden is dat ten eerste bij het lezen/schrijven geen tijd wordt verspild aan het converteren van gegevens van de symbolische representatievorm naar de interne en vice versa, en ten tweede dat er geen verlies aan nauwkeurigheid van reële getallen optreedt. Zowel bij geformatteerde invoer/uitvoer als bij binaire invoer/uitvoer moet u, om informatie uit een bestand “correct” te verwerken, weten welke soorten gegevens, hoe en in welke volgorde naar het binaire bestand worden geschreven. -bestand, vooral sinds het bekijken van een binair bestand met behulp van teksteditor zal niets geven.

    Laten we eens kijken naar een voorbeeld dat het schrijven van integer-elementen demonstreert dynamische reeks naar een binair bestand en lees ze uit dit bestand.

    #erbij betrekken

    #erbij betrekken

    #erbij betrekken

    naamruimte std gebruiken;

    uit<< "Vvedite kol-vo elementov celochisl. massiva: "; cin >> N;

    int *mas = nieuwe int [N];

    voor(i=0; ik

    uit<< " Vvedite " << i << "-i element: "; cin >> mas[i];

    uit<< "\nIdet zapis dannyh v fail..." << endl;

    ofstream fout("c:\\os\\bin.dat", ios::binary);//gemaakt Uitgang binaire stroom

    if(!fout) ( cout<< "\n Oshibka otkrytiya faila!"; getch(); return 1; }

    fout.write(herinterpreteer_cast (mas), N*groottevan(int));// schrijf array naar bestand

    fout.close();//de stroom sluiten

    uit<< "Dannye uspeshno zapisany!" << endl;

    voor(i=0; ik

    ifstream fin("c:\\os\\bin.dat", ios::binary); //maak een thread aan om het bestand te lezen

    if(!fin) ( cout<< "\n Oshibka otkrytiya faila!"; getch(); return 1; }

    uit<< "Fail sodergit:" << endl;

    fin.read(herinterpreteer_cast (mas), N*groottevan(int));// lees array uit bestand

    voor(i=0; ik

    haal(); retour 0;

    In dit programma moet speciale aandacht worden besteed aan het gebruik van de functies write() (ofstream-klassemethode) en read() (ifstream-klassemethode). Deze functies denken aan gegevens in termen van bytes en zijn ontworpen om een ​​bepaald aantal bytes over te dragen van een gegevensbuffer naar een bestand en weer terug. De parameters van deze functies zijn het bufferadres en de lengte ervan in bytes.

    De functie write() is ontworpen om het aantal bytes dat is opgegeven in de tweede parameter naar een bestand te schrijven, vergeleken met het aantal dat is opgegeven in de eerste parameter. adressen gegevensbuffer en de functie read() is ontworpen om gegevens uit een bestand te lezen. Hierbij moet worden opgemerkt dat deze functies alleen werken met een gegevensbuffer van het type char. In dit opzicht hebben we in dit programma de operator gebruikt herinterpreteer_cast<> die onze gegevensbuffer van het type int (mas) omzet in een buffer van het type char.

    Het is belangrijk om te onthouden dat casten met behulp van de operator herinterpreteer_cast alleen nodig in gevallen waarin de eerste parameter van de functies schrijven() En lezen() is geen karakterarray (tenslotte een karakter van type verkoold neemt slechts 1 byte in beslag). Als u bovendien geen array, maar individuele variabelen wilt schrijven of lezen, moet u een referentiemechanisme gebruiken (een link naar het adres van de gegevensbuffer), bijvoorbeeld:

    ofstream fout(bestandsnaam, ios::app | ios::binair);

    fout.write(herinterpreteer_cast (& cb), groottevan(float));

    Nu is het noodzakelijk om de tweede parameter van de beschouwde functies te bespreken. In dit programma gebruikten we als tweede parameter de uitdrukking N*sizeof(int), waarmee we het aantal bytes berekenden. Als we bijvoorbeeld vijf integer-array-elementen hebben, is het aantal bytes 20. De functie sizeof() retourneert het aantal bytes dat is toegewezen voor het gegevenstype dat is opgegeven als parameter. Bijvoorbeeld sizeof( int) zal terugkeren 4.

    Met het programma uit dit voorbeeld kunt u dus gegevens in binaire vorm naar het bestand bin.dat schrijven en deze uit dit binaire bestand lezen. Bovendien worden deze gegevens na het lezen geconverteerd naar het int-type, krijgen ze een array-structuur en kunnen alle bewerkingen ermee worden uitgevoerd.

    Stel je nu voor dat je een programma moet schrijven waarmee je gegevens uit het bestand bin.dat kunt lezen, en we weten alleen dat dit bestand de elementen van een integer-array in binaire vorm bevat. Aantal geschreven elementen ( N ) dat weten we niet. Bij het maken van een programma hebben we niet het recht om een ​​constante array te gebruiken, d.w.z. wijs er geheugen voor toe in de fase van het maken van het programma. Dit zal tot een foutief resultaat leiden. Omdat een te kleine N-waarde ertoe zal leiden dat niet alle elementen van de array worden geteld, en een te grote N-waarde ertoe zal leiden dat extra cellen worden gevuld met willekeurige waarden.

    Laten we een voorbeeld bekijken van een programma waarmee u de elementen van een integer-array uit een binair bestand kunt lezen door dynamisch geheugen toe te wijzen, en om het realisme van de gelezen gegevens te bewijzen, hun som kunt berekenen.

    #erbij betrekken

    #erbij betrekken

    #erbij betrekken

    naamruimte std gebruiken;

    int N, ik, som=0, dfb; //dfb - bestandslengte in bytes

    ifstream fin("c:\\os\\bin.dat", ios::binair);

    if(!fin) ( cout<< "Oshibka otkrytiya faila!"; getch(); return 1; }

    fin.seekg(0, ios::end);// stel de leespositie in op het einde van het bestand (0 bytes vanaf het einde)

    dfb = fin.tellg();//haal de waarde op van het einde van de bestandspositie (in bytes)

    N=dfb/4;// wetende dat een geheel getal 4 bytes in beslag neemt, berekent u het aantal getallen

    int *arr = nieuwe int [N];//maak een dynamische array

    fin.seekg(0, ios::beg);//verplaats de huidige positie naar het begin van het bestand voordat u gegevens leest

    fin.read(herinterpreteer_cast (arr), dfb);

    uit<< "Iz faila schitano " << N << " elementov:" << endl;

    voor(i=0; ik

    voor(i=0; ik

    uit<< "\n Ih summa = " << sum;

    haal(); retour 0;

    Laten we dit programma eens nader bekijken, waarin we actief gebruik hebben gemaakt van de functies seekg() en tellg(), methoden van de klasse ifstream. Hierbij moet worden opgemerkt dat Elk bestand dat wordt geopend, wordt geassocieerd met een zogenaamde huidige lees- of schrijfpositie. Wanneer een bestand wordt geopend om te lezen, wordt deze standaardpositie ingesteld op het begin van het bestand. Maar vaak is het nodig om de positie handmatig te regelen om te kunnen lezen en schrijven vanaf een willekeurige locatie in het bestand. Met de functies seekg() en tellg() kunt u de huidige leesaanwijzer instellen en controleren, terwijl de functies seekp() en tellp() hetzelfde doen voor de schrijfaanwijzer.

    De methode seekg(1_parameter, 2_parameter) verplaatst de huidige leespositie uit het bestand met het aantal bytes dat is opgegeven in de 1_parameter, relatief ten opzichte van de locatie die is opgegeven in de 2nd_parameter. 2_parameter kan een van de volgende drie waarden aannemen:

    ios::beg – vanaf het begin van het bestand;

    ios::cur – vanaf de huidige positie;

    ios::end – vanaf het einde van het bestand.

    Hier zijn beg, cur en end constanten die zijn gedefinieerd in de ios-klasse, en de symbolen:: vertegenwoordigen de toegangsbewerking tot deze klasse. De exploitant bijvoorbeeld fin.seekg(-10, ios::end); Hiermee kunt u de huidige leespositie van een bestand instellen op 10 bytes vóór het einde van het bestand.

    Laten we nu terugkeren naar de beschrijving van de werking van het programma. Gebaseerd op het feit dat we niet weten hoeveel getallen er in het bestand zijn geschreven, moeten we eerst het aantal getallen achterhalen. Om dit te doen, gebruikt u fin.seekg(0, ios::end); we gaan naar het einde van het bestand en retourneren met behulp van de tellg()-functie de bestandslengte in bytes naar de dfb-variabele. De tellg() functie retourneert de huidige pointerpositie in bytes. Omdat we de lengte van één geheel getal in bytes (4 bytes) kennen, is het eenvoudig om het aantal getallen dat naar het bestand is geschreven te berekenen, wetende de lengte van het bestand in bytes ( N=dfb/4;). Nadat we het aantal getallen hebben ontdekt, maken we een dynamische array en gaan we naar het begin van het bestand om gegevens te lezen met behulp van de functie read(). Nadat het gespecificeerde aantal databytes (dfb) is overgedragen naar de databuffer (arr), krijgen de op deze manier gelezen data een arraystructuur en worden ze volledig geschikt voor alle codebewerkingen en transformaties.

    Bestanden. Bovendien zijn tekstbestanden, vanuit het oogpunt van technische implementatie op hardwareniveau, een speciaal geval van binaire bestanden, en dus voldoet elk bestand in de brede zin van het woord aan de definitie van “binair bestand”.

    Over het algemeen vertegenwoordigt deze term een ​​maatstaf voor de relatie tussen de consument van een binair bestand en het bestand zelf. Als de consument de structuur en regels kent waarmee hij een bepaald bestand naar een bestand op een hoger niveau kan converteren, dan is het voor hem niet binair. Uitvoerbare bestanden zijn bijvoorbeeld binair voor de computergebruiker, maar niet binair voor het besturingssysteem. [ ]

    Visualisatie

    Om een ​​binair bestand visueel weer te geven, wordt het opgedeeld in stukken van gelijke grootte, weergegeven als getallen, meestal geschreven in hexadecimaal, soms in octaal, binair of decimaal. De aangegeven chunkgrootte kan gelijk zijn aan één octet, maar ook aan twee of vier (in het geval van opsplitsing in chunks van meerdere octetten wordt de bytevolgorde gebruikt die op het gebruikte platform is aangenomen). De afhankelijkheid van het bereik van weergegeven getallen van de grootte van het stuk wordt weergegeven in de tabel:

    octetten aantal bits hexadecimaal octaal decimale
    niet ondertekend
    decimale
    iconisch
    1 8 00

    FF
    000

    377
    0

    255
    -128

    127
    2 16 0000

    FFFF
    000000

    177777
    0

    65535
    -32768

    32767
    4 32 00000000

    FFFFFFFF
    00000000000

    37777777777
    0

    4294967295
    -2147483648

    2147483647

    Vaak worden naast de numerieke bytewaarden ook codepaginatekens, zoals ASCII, uitgevoerd. Het volgende voorbeeld toont de zogenaamde. klassieke dump(hexadecimale weergave van octet voor octet van 16 bytes per regel, met afdrukbare ASCII-tekens aan de rechterkant) van het begin van het PNG-bestand met het Wikipedia-logo:

    00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR| 00000010 00 00 00 87 00 00 00 a0 08 03 00 00 00 11 90 8f |............| 00000020 b6 00 00 00 04 67 41 4d 41 00 00 d6 d8 d4 4f 58 |.....gAMA.....OX| 00000030 32 00 00 00 19 74 45 58 74 53 6f 66 74 77 61 72 |2....tEXtSoftwar| 00000040 65 00 41 64 6f 62 65 20 49 6d 61 67 65 52 65 61 |e.Adobe ImageRea| 00000050 64 79 71 c9 65 3c 00 00 03 00 50 4c 54 45 22 22 |dyq.e<....PLTE""| 00000060 22 56 56 56 47 47 47 33 33 33 30 30 30 42 42 42 |"VVVGGG333000BBB| 00000070 4b 4b 4b 40 40 40 15 15 15 4f 4f 4f 2c 2c 2c 3c |KKK@@@...OOO,<| 00000080 3c 3c 3e 3e 3e 3a 39 39 04 04 04 1d 1d 1d 35 35 |<<>>>:99......55| 00000090 35 51 50 50 37 37 37 11 11 11 25 25 25 0d 0d 0d |5QPP777...%%%...| 000000a0 27 27 27 1a 1a 1a 38 38 38 2a 2a 2a 08 08 08 20 |"""...888**... | 000000b0 20 20 17 17 17 2e 2e 2e 13 13 13 bb bb bb 88 88 | . ............|

    Hulpmiddelen

    Voor visualisatie

    • debuggen (op Microsoft Windows, gedeeltelijk)
    • hexdump (op FreeBSD, GNU/Linux, enz.)

    Voor bewerken

    • HEX-editor
      • beye (voor alle besturingssystemen, gratis software)
      • hiew (voor DOS, Microsoft Windows, Windows NT)
      • WinHex (voor Windows)

    Bestanden. Bovendien zijn tekstbestanden, vanuit het oogpunt van technische implementatie op hardwareniveau, een speciaal geval van binaire bestanden, en dus voldoet elk bestand in de brede zin van het woord aan de definitie van “binair bestand”.

    Binaire bestanden worden vaak genoemd uitvoerbare bestanden En gecomprimeerde gegevens Het is echter onjuist om dit concept zo sterk te beperken.

    Visualisatie

    Om een ​​binair bestand visueel weer te geven, wordt het opgedeeld in stukken van gelijke grootte, weergegeven als getallen, meestal geschreven hexadecimaal systeem, soms binnen octaal , binair of decimale. De aangegeven stukgrootte kan gelijk zijn aan één octet, evenals twee of vier (in het geval van opsplitsing in stukken van meerdere octetten, bytevolgorde, overgenomen op de gebruikte platform). De afhankelijkheid van het bereik van weergegeven getallen van de grootte van het stuk wordt weergegeven in de tabel:

    octetten aantal bits hexadecimaal octaal decimale
    niet ondertekend
    decimale
    iconisch
    1 8 00

    FF
    000

    377
    0

    255
    -128

    127
    2 16 0000

    FFFF
    000000

    177777
    0

    65535
    -32768

    32767
    4 32 00000000

    FFFFFFFF
    00000000000

    37777777777
    0

    4294967295
    -2147483648

    2147483647

    Vaak worden naast de numerieke bytewaarden ook het volgende weergegeven: symbolen codepagina, Bijvoorbeeld afdrukbare ASCII-tekens rechts) begonnen PNG-bestand logo Wikipedia:

    00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR| 00000010 00 00 00 87 00 00 00 a0 08 03 00 00 00 11 90 8f |............| 00000020 b6 00 00 00 04 67 41 4d 41 00 00 d6 d8 d4 4f 58 |.....gAMA.....OX| 00000030 32 00 00 00 19 74 45 58 74 53 6f 66 74 77 61 72 |2....tEXtSoftwar| 00000040 65 00 41 64 6f 62 65 20 49 6d 61 67 65 52 65 61 |e.Adobe ImageRea| 00000050 64 79 71 c9 65 3c 00 00 03 00 50 4c 54 45 22 22 |dyq.e<....PLTE""| 00000060 22 56 56 56 47 47 47 33 33 33 30 30 30 42 42 42 |"VVVGGG333000BBB| 00000070 4b 4b 4b 40 40 40 15 15 15 4f 4f 4f 2c 2c 2c 3c |KKK@@@...OOO,<| 00000080 3c 3c 3e 3e 3e 3a 39 39 04 04 04 1d 1d 1d 35 35 |<<>>>:99......55| 00000090 35 51 50 50 37 37 37 11 11 11 25 25 25 0d 0d 0d |5QPP777...%%%...| 000000a0 27 27 27 1a 1a 1a 38 38 38 2a 2a 2a 08 08 08 20 |"""...888***... | 000000b0 20 20 17 17 17 2e 2e 2e 13 13 13 bb bb bb 88 | ...............|

    Hulpmiddelen

    Voor visualisatie

    Voor bewerken

    Literatuur

    • Webster's New World Dictionary of Computer Terms, 4e. Ed, Prentice Hall, NY, 1992. ISBN 0-671-84651-5
    • Leontyev BK

    Wikimedia Stichting.

    2010.

      Zelfstandig naamwoord, m., gebruikt. vergelijken vaak Morfologie: (nee) wat? bestand, niet? bestand, (zie) wat? bestand, wat? dossier, waarover? over het bestand; pl. Wat? bestanden, (nee) wat? bestanden, wat? bestanden, (zie ik) wat? bestanden, wat? bestanden, waarover? over bestanden 1. Een bestand is een array... ... Dmitrievs verklarend woordenboek

      Binair bestand in de breedste zin van het woord: een reeks willekeurige bytes. De naam is te danken aan het feit dat bytes uit bits bestaan, dat wil zeggen binaire cijfers. In de enge zin van het woord zijn binaire bestanden het tegenovergestelde van tekstbestanden.... ...Wikipedia

      Binair bestand in de breedste zin van het woord: een reeks willekeurige bytes. De naam is te danken aan het feit dat bytes uit bits bestaan, dat wil zeggen binaire cijfers. In de enge zin van het woord zijn binaire bestanden tegengesteld... ...Wikipedia

      configuratiebestand- Een binair of tekstbestand met informatie die het gedrag van een applicatie, computer of netwerkapparaat bepaalt. Onderwerpen computernetwerk NL configuratiebestand...

      Handleiding voor technische vertalers

      Deze term heeft andere betekenissen, zie IPA (betekenissen). .IPA-formaat voor archiefbestanden van Apple-applicaties voor iPhone, iPod Touch en iPad. Bestanden met deze extensie worden opgeslagen in de App Store en gedownload met iTunes voor... ... Wikipedia

      Dit artikel of deze sectie heeft herziening nodig. Er zijn geen modules, OOP of andere nieuwerwetse trends in Pascal. Beschrijvingen van extensies mogen alleen aanwezig zijn in artikelen over de overeenkomstige ... Wikipedia

      Pascal Semantiek: procedureel Uitvoeringstype: compiler Verscheen in: 1970 Auteur(s): Niklaus Wirth Pascal is een programmeertaal voor algemene doeleinden op hoog niveau. Een van de beroemdste programmeertalen, op grote schaal... ... Wikipedia

      Gopher-naam: Gopher Poort/ID: 70/TCP-specificatie: RFC 1436 Belangrijkste implementaties (clients): Mozilla Firefox, Microsoft Windows: IE 5.x, IE 6 (beperkt tot MS) Gopher-netwerkprotocol voor gedistribueerd ophalen en documentoverdracht, voorheen veel gebruikt... Wikipedia

      Naam: Gopher Poort/ID: 70/TCP Specificatie: RFC 1436 Belangrijkste implementaties (clients): Mozilla Firefox, Microsoft Windows: Internet Explorer 5.x, Internet Explorer 6 (beperkt tot MS) Gopher-netwerkprotocol voor gedistribueerd zoeken en verzenden. ... Wikipedia