[Muziek] DAVID J. MALAN: Oke. Dit is CS50, en dit het einde van week vier. En een van de onderwerpen van vandaag is dat van digitale recherche, de kunst van het herstellen van gegevens. Inderdaad, hoewel je bent in het midden op dit moment van de Vrede bij Drie en Breakout, volgende week, de nadruk zal liggen op Juist dit domein. Dus een van de coolste banen die ik ooit hadden was terug in de graduate school, toen ik werkte voor de lokale Middlesex County District Attorney's kantoor, het doen van forensisch werk. Dus in wezen, het Massachusetts State Police, bij gelegenheid, bij het werken aan de gevallen zou brengen in dingen als harde schijven en diskettes en geheugenkaarten en dergelijke. En ze zouden hen overhandigen voor mij en mijn mentor, en ons doel was om bewijs te vinden, of er een, op deze media. Nu, zou je gezien hebben glimpen van deze wereld van forensisch onderzoek in de media, televisie en films. Maar de baan die ik had, en durf te stellen dat de wereld, is niet helemaal zoals je het zou zien. Laten we eens kijken naar wat je waarschijnlijk hebt gezien. [VIDEO AFSPELEN] -OK. Nu, laten we eens goed naar je. [Muziek] Wacht even het. Lopen dat terug. Wacht even. Ga naar rechts. -Er. Bevriezen dat. -Full-Scherm. -OK. Bevriezen dat. -Tighten Op dat, wil je? -vector In op die man door het achterwiel. -ZOOM In hier op deze plek. -Met De juiste apparatuur, het afbeelding kan worden vergroot en verscherpt. Wat is dat? -Het is een verbetering programma. Kun je duidelijk dat je geen? Ik weet het niet. Laten we verbeteren het. -Verbeter Sectie A6. Ik verbeterde het detail, en-- Ik denk dat er genoeg te verbeteren. Los om mijn scherm. Ik verbeterde de bezinning in haar ogen. -Laten Deze lopen door video enhancement. -Edgar, Kunt u dit verbeteren? -Hang Op. -Ik Gewerkt aan deze reflectie. Reflectie -Er's van iemand. -Reflection. -Er is een weerspiegeling van de man gezicht. -het Reflectie! -Er is een reflectie. -ZOOM In op de spiegel. U kunt een reflectie zien. Kun je het beeld te verbeteren van hier? Kun je het te verbeteren? Kun je het te verbeteren? Kunnen we dit verbeteren? Kun je het te verbeteren? Wacht even op een tweede. Ik zal verbeteren. -ZOOM In de deur. -maal 10. -zoom. -Verplaatsen In. -Meer. Wacht, stop. -stop. -PAUSE Het. -Draai Ons 75 graden rond de verticale, alstublieft. -stop. Ga terug naar de kant de deur weer. Hebbes een beeld enhancer die kan bitmap? Misschien hebben we de Pradeep Singh kan gebruiken Werkwijze om in de ramen. -De Software is state of the art. -De Eigenwaarde is uitgeschakeld. -Met De juiste combinatie van algorithms-- Hij is genomen verlichting algoritmen naar het volgende niveau, en ik kan ze gebruiken om versterken deze foto. Lock op en vergroten de z-as. -Verbeter. Verbeteren. -Verbeter. -Freeze En verbeteren. [END VIDEO AFSPELEN] DAVID J. MALAN: Dus dat zijn alle woorden, maar ze waren niet toegepast in zinnen correct. En inderdaad in de toekomst op elk ogenblik alsjeblieft, hoor je iemand zeggen dat het woord, "Verbeteren", grinniken maar een klein beetje. Want als je probeert te verbeteren, Zo, dit is wat er gebeurt. Dus hier is een prachtige foto. Dit is eigen Daven CS50's. En stel dat we wilden focussen op de twinkeling in zijn ogen, of de reflectie van de slechte kerel die duidelijk was gevangen door de bewakingscamera. Dit is wat er gebeurt als je inzoomen op een beeld dat slechts een eindig aantal bits verbonden. Dat is wat je zou krijgen. En inderdaad, in het oog van Daven's is maar vier, misschien zes pixels dat componeren precies wat werd er glimmende. Dus Probleemverzameling Vier zal uiteindelijk u deze wereld te verkennen, met name door de aard van iets wij noemen file i / o, waar i / o is gewoon een mooie manier om zeggen input en output. Tot nu toe zijn alle interacties we met een computer hebt gehad grotendeels lid van de toetsenbord en het scherm, maar niet zo veel met de harde schijf, of opslaan van bestanden buiten de degene die je zelf schrijven. Uw programma's tot nu toe hebben niet is het creëren en opslaan, en updaten van hun eigen bestanden. Nou, wat is een bestand? Nou, zoiets als een JPEG. Dit is een afbeelding die je misschien hebben of uploaden naar Facebook, of zie overal op het web. Inderdaad, die foto hebben we net zaag van Daven was een JPEG. En wat interessant over bestanden als JPEG is dat zij kunnen worden geïdentificeerd typisch, door bepaalde bitpatronen. Met andere woorden, wat is het dat onderscheidt een JPEG van een GIF van een PING uit een Word- document uit een Excel-bestand? Nou, het is gewoon anders bitpatronen. En die verschillende patronen zijn meestal aan het begin van deze bestanden. Zodat wanneer uw computer opent een Word doc, of wanneer een computer opent een JPEG, lijkt typisch bij de eerste paar bits in het bestand. En als het herkent een patroon, het zegt, oh, dit is een beeld. Laat me weer aan de gebruiker als grafisch. Of, oh, dit ziet eruit als een Word-doc. Laat me laten zien aan de gebruiker als een essay. Dus bijvoorbeeld, JPEG, het blijkt, zijn vrij gesofisticeerde onder de motorkap. Maar de eerste drie bytes elkste JPEG u volgende drie cijfers. Dus byte nul, een, en twee, in de meeste elke JPEG, 255, dan is het aantal 216, dan is het nummer 255. En wat je zult in staat zijn te gaan doen volgende week is eigenlijk eronder porren de motorkap van bestanden zoals JPEG en als bitmap-bestanden, en het zien van wat is er altijd voor zo lang als je met behulp van een computer geweest. Maar wat is er meestal niet geschreven als decimale getallen als deze. Informatici niet hebben de neiging in decimalen te spreken. Ze niet echt in binaire spreken. Typisch, als we willen om cijfers uit te drukken, we eigenlijk gebruiken hexadecimale, die u zich wellicht herinnert van, zeg, Probleemverzameling Een, die uitgedaagd u na te denken over een ander systeem. We natuurlijk vertrouwd met decimaal, nul tot negen. We spraken over binary. En we hebben niet echt veel here gebruiken op uit, want computers zullen gebruiken. Maar programmeurs zal zeer Vaak, maar niet altijd, Gebruik hexadecimaal, wat betekent gewoon je hebt 16 letters in je alfabet, in plaats van twee of 10. Dus hoe kan je tellen tot hogere dan negen in hexadecimale? Ga 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, alleen volgens afspraak. Maar wat is belangrijk is dat elke Deze is een symbool. Er is geen 10. Er is geen 11, per se, omdat elke van uw cijfers, net als in decimale en net als in binaire, moet gewoon zijn een enkel teken, volgens afspraak. Dat is dan het alfabet we tot onze beschikking voor hexadecimaal. Dus wat doet een JPEG eruit als je waren uit te schrijven die eerste drie bytes niet als decimale maar bijvoorbeeld hexadecimaal? En waarom is hex al wat nuttig? Nou ja, een snelle blik op een voorbeeld. Dus als ik schrijf uit de bits die vertegenwoordigen deze decimaal numbers-- Dit is misschien een beetje roestig zijn nu van een paar weken terug, maar de linker en juiste zijn vrij gemakkelijk. 255 was het grootste aantal dat we kunnen vertegenwoordigen met acht bits. Het was allemaal enen. Dus het enige dat is mild Interessanter is de middelste. En als je soort te doen uit de wiskunde, zal je afleiden dat, inderdaad, dat patroon van een en nullen vertegenwoordigt 216. Dus laten we gewoon bepalen voor nu dat deze correct zijn. Maar waarom is dit interessant? Welnu, een byte, uiteraard is acht bits. En het blijkt dat als je denkt een byte twee stukjes vier bits, als deze. Laat me even wat ruimte toe te voegen. Dus voordat na. Ik heb net wat witte ruimte toegevoegd omwille hier visualisatie's. Hoe kunnen wij nu vertegenwoordigen, zeg, hexadecimale elke quad bits, elk stel van vier bits? Dus bijvoorbeeld links nu hebben we 1111 in binaire. Wat is dat nummer in decimale, als je uit de wiskunde? Je hebt degenen die plek, de tweeën plaats, de fours plaats, en de achten plaats. Publiek: 15. DAVID J. MALAN: Het is 15. Dus als we acht plus vier plus twee plus een, krijgen we 15. Dus ik kon beneden schrijven 15 1111, maar het hele punt here is hexadecimaal, niet decimaal. Dus in plaats van naar beneden te schrijven 15, 1-5, Ik ga om te schrijven dat in hex, die, als je terugdenkt, als je nul tot en met f, wat 15 gaat worden? PUBLIEK: f. DAVID J. MALAN: Zo blijkt uit het is f. En je kunt werken dat uit door te zeggen, goed, als er een is 10, dan OK, f 15. Dus inderdaad, we kunnen herschrijven dezelfde reeks nummers f f. En dan, als we een beetje van wiskunde, we afleiden dat dat d. Acht is vrij eenvoudig, omdat we een een op de achten plaats. En dan hebben we nog een paar f f's. Dus wat mensen hebben de neiging om te doen volgens afspraak wanneer zij gebruik maken van hexadecimale is ze gewoon schrijf dit een beetje kort en bondig, zich te ontdoen van de meeste van die witte ruimte. En alleen maar om super duidelijk te zijn lezers dat dit hexadecimale, de eenvoudige conventie onder mensen wordt je schrijft nul x, die geen andere betekenis heeft dan een visuele identificatie van, hier komt een hexadecimaal getal. En dan zet je de twee cijfers, f f in dit geval, dan d een, dan is f f. Zo lang verhaal kort, hexadecimale gewoon de neiging nuttig zijn omdat elk van de cijfers, nul tot en met f, perfect lijnen met een patroon van vier bits. Dus als je twee hexadecimale cijfers, nul tot en met F, opnieuw en opnieuw, dat geeft je perfect acht bits of een byte. Dus dat is de reden waarom het de neiging om zijn gewoonlijk nuttig. Er is geen intellectuele inhoud echt verder dan dat, andere dan de werkelijke nut. Nu JPEG's zijn niet de enige bestandsformaten voor afbeeldingen. U herinnert zich nog wel dat er bestanden als dit in de wereld, althans van een paar jaar terug. Dus dit was eigenlijk in Windows XP geïnstalleerd op miljoenen pc's over de hele wereld. En dit was een bitmap-bestand, BMP. En een bitmap-bestand, zoals u zult zien krijgen week, betekent gewoon een patroon van punten, pixels als ze worden opgeroepen, een kaart op beetjes, echt. Dus wat is interessant, hoewel, over dit bestandsformaat, BMP, is dat onder de motorkap, het meer dan drie bytes die samen de header, dus te spreken, de eerste paar happen. Het ziet er eigenlijk een beetje ingewikkeld op het eerste gezicht. En je zult dit zien in de P set. En het krijgen van iets bijzondere van deze nu is niet zo belangrijk, omdat alleen het feit dat aan het begin van elk bitmap bestand, een grafisch formaat, er is een hele hoop nummers. Nu Microsoft, de auteur van dit formaat, neigt deze bellen dingen niet ints en chars en praalwagens maar woorden en d woorden en verlangt en bytes. Dus ze zijn gewoon verschillende soorten data. Ze zijn verschillende namen voor hetzelfde ding. Maar je zult zien dat er in P Set Four. Maar dit is slechts zeggen dat als een menselijke dubbelklikt op een aantal BMP-bestand op zijn of haar harde schijf, en een venster opent up hem of haar dat beeld blijkt, dat gebeurde omdat de operationele systeem waarschijnlijk gemerkt niet alleen het BMP-bestand extensie in de bestandsnaam, maar ook het feit dat er een aantal conventie om het patroon van stukjes aan het begin van die bitmap-bestand. Maar laten we nu focussen op zo'n ingewikkeld bestand, maar in plaats daarvan op iets als dit. Stel hier in GEdit, I alleen maar het begin van een programma dat is vrij simpel. Ik heb een aantal omvat boven. Nu heb ik # include "structs.h", maar Ik ga terug naar die komen in een moment. Maar dit is handig voor nu. Dit is een programma dat gaat implementeren zoals de database van de registrar. Dus een database van studenten, en elke student in de wereld heeft een naam en een huis en waarschijnlijk ook enkele andere dingen, maar we zullen het simpel houden. Iedere student heeft een naam en een huis. Dus als ik wilde een schrijven programma waarvan het doel in het leven was gewoon te herhalen uit nul op maximaal drie, als er drie studenten aan de Harvard University. En ik wil gewoon te krijgen, met behulp van GetString, naam van elke student en huis, en dan gewoon af te drukken die uit. Dit is een soort als Week One, Week Twee dingen nu, waar ik wil gewoon een voor lus of iets dergelijks. En ik wil GetString een paar noemen keer, en vervolgens afdrukken f een paar keer. Dus hoe zou ik dit doen, hoewel, wanneer zowel een naam en een huis betrokken zijn voor elke leerling? Dus mijn eerste instinct zou zijn om zoiets te doen. Ik zou eerst zeggen, nou, geef me, zeggen, een array van strings uitgescholden. En ik wil niet dat een hardcode drie hier. Wat wil ik daar te zetten? Zodat studenten, want dat is gewoon een constante aangegeven bovenaan, zodat ik niet hoeft te hardcoden drie op meerdere plaatsen. Op deze manier kan ik het veranderen een plaats, en dat een wijziging van invloed overal. En dan zou ik doen reeks studenten gehuisvest. En nu, ik zou zoiets doen for (int i = 0; i