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
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 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 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 ofstream fout(bestandsnaam, ios::app | ios::binair); fout.write(herinterpreteer_cast 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 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. [
]
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: 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 | . ............| 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. 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: 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 | ...............| Wikimedia Stichting. 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. ... WikipediaVisualisatie
octetten
aantal bits
hexadecimaal
octaal
decimale
niet ondertekenddecimale
iconisch1
8
00
…
FF000
…
377
0
…
255
-128
…
127
2
16
0000
…
FFFF000000
…
177777
0
…
65535
-32768
…
32767
4
32
00000000
…
FFFFFFFF00000000000
…
37777777777
0
…
4294967295
-2147483648
…
2147483647
Hulpmiddelen
Voor visualisatie
Voor bewerken
Visualisatie
octetten
aantal bits
hexadecimaal
octaal
decimale
niet ondertekenddecimale
iconisch1
8
00
…
FF000
…
377
0
…
255
-128
…
127
2
16
0000
…
FFFF000000
…
177777
0
…
65535
-32768
…
32767
4
32
00000000
…
FFFFFFFF00000000000
…
37777777777
0
…
4294967295
-2147483648
…
2147483647
Hulpmiddelen
Voor visualisatie
Voor bewerken
Literatuur
2010.