[Speel van musiek] David J. Malan Alle regte. Dit is CS50, en dit is die einde van die week Vier. En een van die onderwerpe vandag is dié van digitale forensiese, die kuns van die herstel van inligting. En inderdaad, selfs al jy in die midde nou van Vrede by Three en Breakout, volgende week, Die fokus sal wees op juis hierdie domein. So een van die coolste werk wat ek ooit gehad het, was terug in die nagraadse skool, toe ek besig was om die plaaslike Middlesex County Distrik Prokureur se kantoor, doen forensiese werk. So in wese, die Massachusetts Staat polisie, op die geleentheid, wanneer op gevalle sou bring in dinge soos hardeskywe en diskettes en geheue kaarte en dies meer. En hulle sal hulle oorhandig aan my en my mentor, en ons doel was om getuienis te vind, As daar enige, op hierdie media. Nou, kan jy dit gesien het 'n kykie van hierdie wêreld van forensiese in die media, TV en films. Maar die werk wat ek gehad het, en daresay daardie wêreld is nie heeltemal soos jy dit sal sien. Kom ons neem 'n blik op wat jy het waarskynlik gesien. [Video speel] -OK. Nou, laat ons kry 'n goeie blik op jou. [Speel van musiek] -Hold Dit. Begin dit terug. Hoekom mag 'n minuut. Gaan regs. -Daar. Vries dit. -Volledig-skerm. -OK. Vries dit. -Tighten Op, sal jy? Vector in daardie man deur die agterwiel. -Zoom In reg hier op hierdie plek. -Met die regte toerusting, die beeld kan vergroot word en geslyp. -Wat Is dit? -Dit Is 'n verbetering program. -Kan Jy duidelik dat tot enige? -Ek Weet nie. Kom ons verbeter dit. Verbeter Artikel A6. Ek versterk die detail, and-- -Ek Dink daar is genoeg om te verbeter. Stel dit aan my skerm. -Ek Versterk die weerspieëling in haar oë. -Laat Se loop dit deur video verbetering. -Edgar, Kan jy dié? -Hang Op. -I've Werk op die besinning. Hulle vernietig iemand se besinning. -Reflection. -Daar Is 'n weerspieëling van die man se gesig. -Die weerspieëling! -Daar Is 'n weerspieëling. -Zoom In die spieël. Jy kan sien 'n weerspieëling. -Kan Jy verbeter die beeld van hier af? -Kan Jy dit verbeter? -Kan Jy dit verbeter? -Kan Ons verbeter dit? -Kan Jy dit verbeter? -Hold Op 'n tweede. Ek sal verbeter. -Zoom Op die deur. -Times 10. -Zoom. -Move In. -Meer. Hoekom mag, stop. -Stop. -Pause Dit. -Rotate Ons 75 grade rondom die vertikale, asseblief. -Stop. Gaan terug na die gedeelte oor die deur weer. -Got 'N beeld verbete wat bitmap? -Maybe Ons kan gebruik om die Pradeep Singh metode om te sien in die vensters. -Die sagteware is die staat van die kuns. -Die eiewaarde af. -Met die regte kombinasie van algorithms-- -He Se geneem verligting algoritmes na die volgende vlak, en ek kan gebruik om hulle te verbeter die foto. -Lock Op en vergroot die z-as. Verbeter. Verbeter. Verbeter. -Freeze En te verbeter. [Einde video speel] David J. Malan So dit is al die woorde, maar hulle was nie gebruik in sinne korrek. En inderdaad in die toekoms, enige tyd, asseblief, jy hoor iemand sê die woord, "Verbeter," giggel net 'n bietjie. Want wanneer jy probeer om te verbeter, byvoorbeeld, dit is wat gebeur. So hier is 'n pragtige foto. Dit is CS50 se eie Daven. En veronderstel dat ons wou fokus op die vonkel in sy oog, of die weerspieëling van die slegte ou wat duidelik gevang deur die sekuriteit kamera. Dit is wat gebeur wanneer jy zoom in op 'n beeld wat het slegs 'n beperkte aantal bisse wat verband hou met dit. Dit is wat jy sou kry. En inderdaad, in Daven se oog is maar vier, miskien ses pixels wat komponeer presies wat is daar flikkering. So Probleem Stel Vier uiteindelik sal jy verken die wêreld, veral deur die aard van iets ons noem lêer I / O, waar i / o is net 'n fancy manier sê toevoer en afvoer. So tot dusver al die interaksies ons met 'n rekenaar gehad het het grootliks met jou klawerbord en die skerm, maar nie so baie met die hardeskyf, of spaar van lêers buite die mense wat jy jouself skryf. Jou programme dusver het nie skep en spaar, en afhangende van hul eie lêers. Wel, wat is 'n lêer? Wel, iets soos 'n JPEG. Dit is 'n beeld wat jy mag het of oplaai na Facebook, of sien op enige plek op die web. Trouens, die foto het ons net saag van Daven was 'n JPEG. En wat is interessant oor lêers soos JPEG is dat hulle geïdentifiseer kan word, Tipies, deur sekere patrone van stukkies. Met ander woorde, wat is dit wat onderskei 'n JPEG van 'n GIF van 'n PING van 'n Woord dokument van 'n Excel-lêer? Wel, dit is net verskillende patrone van stukkies. En die verskillende patrone is gewoonlik aan die begin van die lêers. Sodat wanneer jou rekenaar 'n Woord oopmaak Doc, of wanneer 'n rekenaar 'n JPEG oopmaak, dit lyk tipies by die eerste paar stukkies in die lêer. En as dit erken 'n patroon, dit sê, o, dit is 'n beeld. Laat my vertoon dit te die gebruiker as 'n grafiese. Of, o, dit lyk soos 'n Word doc. Laat my toe om dit vir die gebruiker as 'n opstel. So byvoorbeeld, JPEG, dit blyk, is redelik gesofistikeerde onder die enjinkap. Maar die eerste drie grepe in die meeste elke JPEG begin met hierdie drie nommers. So byte nul, een, en twee is, in die meeste elke JPEG, 255, dan is die aantal 216, dan is die getal 255. En wat sal jy in staat wees om om te begin doen volgende week is eintlik skeer onder die kap van lêers soos JPEG en soos bitmap lêers, en sien wat altyd daar vir so lank as jy het al met behulp van 'n rekenaar. Maar wat is daar gewoonlik nie geskryf soos desimale getalle soos hierdie. Rekenaar wetenskaplikes doen nie geneig om te praat in desimaal. Hulle het nie regtig praat nie in binêre. Tipies, wanneer ons wil getalle uit te druk, ons eintlik gebruik heksadesimale, wat jy kan onthou van, sê, Probleem Stel Een, wat uitgedaag om te dink oor 'n ander stelsel. Ons, natuurlik, is bekend met desimale, zero deur nege. Ons het gepraat oor binêre. En ons het nie regtig om dit te gebruik veel hier uit, want rekenaars sal gebruik nie. Maar programmeerders sal baie dikwels, maar nie altyd nie, gebruik heksadesimale, wat net beteken jy het 16 letters in jou alfabet, teenoor twee of 10. So hoe reken jy na hoër as nege in heksadesimaal? Jy gaan van 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, net deur konvensie. Maar wat is die sleutel is dat elke hierdie is 'n enkele simbool. Daar is geen 10. Daar is geen 11 per se nie, want elke van jou syfers, net soos in desimale en net soos in binêre, moet net 'n enkele karakter, deur konvensie. So, wat dan is die alfabet ons het tot ons beskikking vir heksadesimaal. So, wat nie 'n JPEG lyk as jy was daardie eerste drie uit te skryf grepe nie as desimale maar byvoorbeeld as heksadesimale? En hoekom is Hex al wat nuttig? Wel, 'n vinnige blik op 'n voorbeeld. So as ek skryf uit die stukkies wat stel hierdie desimale numbers-- hierdie dalk 'n bietjie verroes wees nou van 'n paar weke terug, maar die linker een en regte een is redelik maklik. 255 was die grootste getal wat ons kon stel met agt stukkies. Dit was al kinders. Dus is die enigste een wat effens interessant is, is die middelste een. En as jy soort van doen uit die wiskunde, sal jy aflei dat, wel, dat patroon van een en nulle verteenwoordig 216. So laat ons net bepaal vir nou dat dit korrek is. Maar hoekom is dit interessant? Wel, 'n greep, natuurlik, is agt stukkies. En dit blyk dat as jy dink van 'n greep as twee stukke van vier stukkies, soos hierdie. Laat my net 'n bietjie ruimte. So voor, na. Ek het net bygevoeg 'n paar wit spasie ter wille van hier visualisering se. Hoe kan ons nou in te stel, sê, heksadesimale elke quad van stukkies, elke stel van vier stukkies? So byvoorbeeld, aan die linkerkant Nou, ons het 1111 in die program nie. Wat is dat die getal in desimale, As jy dit doen uit die wiskunde? Jy het die mense plek, die twee-twee plek, die viere plek, en die agts plek. Publiek: 15. David J. MALAN: Dit is 15. So as ons dit doen agt plus vier plus twee plus een, kry ons 15. So kan ek hier neer te skryf 15 1111, maar die hele punt hier is heksadesimaal, nie desimaal. So in plaas van af te skryf 15, 1-5, Ek is van plan om dit te skryf in blok is, wat as jy dink terug, as jy ' zero deur f, wat 15 gaan wees? Publiek: f. David J. Malan So dit blyk dit se f. En jy kan uitwerk wat deur te sê, Wel, as 'n 10, dan is OK, f is 15. So ja, kan ons herskryf dieselfde stel van die nommers as f f. En dan as ons 'n bietjie van wiskunde, ons sal aflei dat dit is d. Agt is redelik maklik nie, want ons het 'n mens in die agts plek. En dan het ons nog 'n paar f f se. So, wat mense geneig is om te doen deur die konvensie wanneer hulle heksadesimaal is hulle net skryf dit 'n bietjie meer saaklik, ontslae te raak van die meeste van die wit spasie. En net super duidelik te wees lesers dat dit heksadesimaal, die eenvoudige konvensie onder mens is jy nul skryf x, wat geen betekenis ander as 'n visuele identifikasie van, hier kom 'n blok is nommer. En dan, jy sit die twee syfers f f in hierdie geval is, dan d a, dan is f f. So lang storie kort, heksadesimale net geneig nuttig te wees, want elkeen van sy syfers, zero deur f, perfek lyne met 'n patroon van vier stukkies. So as jy twee heksadesimale syfers, zero deur F, weer en weer, wat gee jou volkome agt stukkies of een byte. So dit is waarom dit is geneig om te wees konvensionele nuttig. Daar is geen intellektuele inhoud regtig verder as dit, anders as die werklike nut. Nou JPEG is nie die enigste Lêerformaat vir grafiese. Jy sal onthou dat daar lêers soos dié in die wêreld, ten minste 'n paar jaar terug. So dit was eintlik geïnstalleer in Windows XP op miljoene rekenaars regoor die wêreld. En dit was 'n bitmap lêer, BMP. En 'n bitmap lêer, as jy die volgende sien week, beteken net 'n patroon van punte, pixels as hulle geroep het, 'n kaart op stukkies, regtig. So, wat is interessant, al is, oor hierdie formaat, BMP, is dat onder die enjinkap, dit het meer as net drie grepe dat sy kop komponeer, so te spreek, het die eerste paar byt. Dit lyk eintlik 'n bietjie ingewikkeld met die eerste oogopslag. En jy sal sien dit in die P stel. En om iets veral uit die nou is nie so belangrik nie, as net die feit wat aan die begin van elke bitmap lêer, 'n grafiese formaat, Daar is 'n hele klomp van die nommers. Nou Microsoft, die skrywer van hierdie formaat, geneig diegene te roep dinge nie ints en karakters en dryf, maar woorde en d woorde en verlang en grepe. So hulle is net verskillende datatipes. Hulle is verskillende name vir dieselfde ding. Maar jy sal sien dat in P Stel Vier. Maar dit is net om te sê dat as 'n mens dubbel-kliek 'n paar .BMP lêer op sy of haar hardeskyf, en 'n venster oop up wat hom of haar dat die beeld, wat gebeur het, omdat die bedryfstelsel stelsel vermoedelik opgemerk nie net die .BMP lêer uitbreiding in die naam, maar ook die feit dat daar is 'n paar konvensie na die patroon van stukkies aan die begin van daardie bitmap lêer. Maar laat ons nou fokus op so 'n ingewikkelde lêer, maar op iets soos hierdie. Veronderstel hier in gedit, ek net die begin van 'n program wat is redelik maklik. Ek het 'n paar sluit tot bo-op. Nou het ek include "structs.h", maar Ek sal terug kom in 'n oomblik. Maar dit is nuttig vir nou. So dit is 'n program wat gaan om te implementeer soos die registrateur se databasis. So 'n databasis van studente, en elke student in die wêreld het 'n naam en 'n huis en waarskynlik 'n paar ander dinge, maar ons sal dit eenvoudig hou. Elke student het 'n naam en 'n huis. So as ek wou 'n te skryf program wie se doel in die lewe was net te Itereer van nul tot drie, As daar is drie studente aan die Harvard Universiteit. En ek wil net te kry, met behulp van GetString, elke student se naam en huis en dan net druk diegene wat nie. Dit is soort van soos Week Een, Week Twee dinge nou, waar ek wil net 'n vir lus of iets soos dit. En ek wil GetString te roep 'n paar keer, en dan druk f 'n paar keer. So, hoe kan ek dit doen, al is, wanneer beide 'n naam en 'n huis betrokke is vir elke student? So my eerste instink mag wees om so iets te doen. Ek kan sê eers goed, gee my, sê, 'n verskeidenheid van snare name genoem. En ek wil nie 'n Kodeer drie hier. Wat wil ek nie daar te vestig? So STUDENTE, want dit is net 'n konstante verklaar by die top, net sodat ek nie hoef te hardcode drie in verskeie plekke. Op hierdie manier, kan ek dit verander een plek, en dit raak 'n verandering oral. En dan, kan ek doen string huisves studente. En nou, kan ek iets soos doen for (int i = 0; i