[Powered by Google Translate] [SAPTAMANII 5] [David J. Malan, Universitatea Harvard] [Acest lucru este CS50.] [CS50.TV] [Femeia] Minte, despre ceea ce, nu știu. [Omul] Deci, ce știm? [Femeie] Asta la ora 9:15, Ray Santoya a fost la ATM. [Omul] Deci, întrebarea este, ce făcea la 9:16? [Femeia] tragere de 9 mm la ceva. Poate că el a văzut lunetist. [Omul] Sau el a fost de lucru cu el. [Femeia] Stai. Du-te înapoi unul. [Man] Ce vezi? [♫ ♫ Muzica suspans] [Femeia] Aduceți fața în sus. Ecran complet. [Man] Lui pahare. >> E o reflecție. [♫ ♫ Muzica suspans] [Omul] Asta e echipa lui Nuevita baseball. Asta e logo-ul lor. [Femeia] Și el vorbește cu oricine poartă haina aia. [David Malan] Deci, aceasta este CS50 săptămână 5, iar astăzi ne strice un pic de televiziune și film pentru tine. Deci, ori de câte ori te uiți la un spectacol ca cel de aici, și polițiștii spun "Poți să curăț?" sau "Sporirea," nu există nici o spori în lumea reală. De fapt, ceea ce este într-adevăr ceva de genul asta. Am tras la una dintre fotografiile de personal de la pagina. Acesta este un program numit Photoshop. Aceasta este de 1 din 2 Bowdens, 1 din 3 Bowdens de fapt, azi, pentru că avem doamna Bowden aici la fel de bine, cu Rob și Pavel. Dar aici este Rob pe ecran, și dacă vom mări pe această licărire el mereu a avut în ochi, ceea ce vezi de fapt este că ceea ce vezi este ceea ce primești. Acest lucru este "îmbunătățită", atât de "CSI" au un pic greșit. Nu e un clip parte, dacă ne putem alege pe "CSI" doar un pic mai mult. Aceasta este o expresie frumos să rostească acum înainte, dacă doriți să suna tehnică cu prietenii tăi atunci când, într-adevăr, vrei să spui absolut nimic. [Man] Pentru săptămâni am fost investigarea crimelor Cabby Killer cu o anumită fascinație morbidă. [Femeia # 1] Acest lucru este în timp real. [Femeia # 2] Voi crea o interfață GUI utilizând Visual Basic, să văd dacă pot urmări o adresă IP. [Malan] Deci audio desincronizat deoparte, creând o interfață GUI folosind Visual Basic pentru a urmări o adresă IP este un nonsens total. Aceste zile nu s-ar folosi Visual Basic, nu e nevoie de un GUI, si adresa IP a fost un termen tehnic corecte. Asa ca un ochi pentru acestea, și unul dintre favoritele mele: Asta e un pic mai arcane, pentru că aveți nevoie să știți o altă limbă. Există un limbaj numit Objective-C, care este un superset a lui C. Ceea ce înseamnă că e C, plus unele caracteristici suplimentare, printre care programarea orientată pe obiecte. Și aceasta este limba pe care Apple a popularizat pentru programare iOS. Și așa că aici e un clip dintr-un spectacol cu ​​totul diferit, de la "Numeri", că, dacă te uiți de fapt, strâns pe TiVo dvs. și pauză la momentul potrivit, veți vedea că ceea ce ei se uită la nu este destul de ceea ce este descris. Și lasă-mă să încerc un conector diferit audio aici și să vedem dacă nu putem păstrați în sincronizare audio de data asta. Te-am da "Numere". [Man # 1] E o adresă de 32 de biți IPv4. [Man # 2] IP, care este internetul. >> Privată de rețea. E rețea privată lui Anita. [Malan] Ok. Acest lucru este Objective-C, si e pentru programul de colorat un copil lui, cum se poate deduce, probabil, de la numele variabilei acolo. Așa că, atunci, a fost "Numere". Deci, astăzi și în această săptămână vom introduce un pic de lumea criminalistica și contextul în problemele prin urmare. Astazi va fi o prelegere prescurtată, deoarece exista un eveniment special în aici după aceea, așa că vom lua o privire, și șicana atât elevii și părinții deopotrivă azi cu unele din lucrurile care sunt pe orizont. Printre ei, începând de luni, va avea o colegii ceva mai multe. EDX, Harvard si MIT nouă inițiativă on-line pentru cursuri deschise și mai mult, se lanseaza pe campusul Harvard luni. Ceea ce înseamnă că vin luni va avea - ca de ultima numaratoare, 86000 colegii suplimentare vor fi în urma împreună cu prelegeri despre CS50 și secțiuni și walkthroughs și seturi de probleme. Și ca parte a acest lucru, vor deveni membri ai clasei inaugurala a CS50 și acum CS50x. Ca parte a acestei, acum, realizăm că vor exista unele upsides, de asemenea. Pentru a obține gata pentru asta, pentru numărul masiv de studenți, este suficient să spunem că, deși avem 108 TFS și CAS, nu destul de bun elev / cadru didactic o dată ne-am lovit 80,000 alți elevi. Deci, nu vom fi triat problemă atât de multe seturi manual. Deci, a introdus în această săptămână în setul problema va fi CS50 Cec, care va fi un utilitar linie de comandă în cadrul aparatului că veți obține odată ce ați fi actualizat în cursul acestui week-end, și veți fi capabil să ruleze o comandă, verificați 50, pe PSET ta, și veți obține unele feedback-ul pentru a stabili dacă programul dumneavoastră este corecte sau incorecte în conformitate cu caietul de sarcini diferite de design pe care le-au furnizat. Deci, mai mult pe faptul că și setul de caietul de sarcini și problema de colegii CS50x vor folosi aceasta, de asemenea. Deci, set de probleme 4 este totul despre criminalistica. Și această piesă a fost inspirat de unele lucruri din viata reala, care atunci când am fost în școală absolvent, am internat pentru o vreme, cu Oficiul Județean Middlesex de procuror a lui face munca medico-legale cu lor investigator medico-legale de plumb, și ce-au ridicat la este, cred că am menționat trecut o săptămână câteva, este poliția în masă de stat sau de alte persoane ar veni în, ei ar drop off lucruri, cum ar fi hard disk-uri și CD-uri și dischete și cum ar fi, și apoi obiectivul de birou criminalistica a fost de a stabili dacă a fost sau nu a fost o dovadă de un anumit fel. Acest lucru a fost de Investigații Speciale Unitatea, asa ca a fost alb-guler a criminalității, a fost un fel mult mai tulburator de infracțiuni, ceva care implică un fel de mass-media digitale; se dovedește că nu faptul că mulți oameni scrie un e-mail spunând: "Am făcut-o." Deci, destul de des aceste căutări criminalistica nu sa prezentat tot ceea ce mult rod, dar, uneori, oamenii ar scrie e-mailuri astfel. Asa ca, uneori eforturile au fost răsplătite. Dar, pentru a duce până la această PSET medico-legale, vom fi introducerea în PSET 4 un pic de grafică. Deci ai luat, probabil, aceste lucruri de la sine, JPEG, GIF și cum ar fi în aceste zile, dar dacă într-adevăr crezi despre asta, o imagine, la fel ca fata lui Rob, ar putea fi modelată ca o secvență de puncte, sau pixeli. Acum, în cazul fetei lui Rob, există tot felul de culori, și am început să vedem de puncte individuale, otherwide cunoscut sub numele de pixeli, odată ce am început pentru a mări inch Dar dacă ne simplifica lumea un pic, și să spun doar că aici este această Rob în alb și negru, bine, să reprezinte în alb și negru, putem folosi doar binar. Și dacă vom folosi binar, 1 sau 0, putem exprima această imagine același din față zâmbitoare lui Rob cu acest model de biți: 11000011 reprezintă alb, alb, negru, negru, negru, negru, alb negru. Și așa nu e un salt imens, apoi, să începem să discutăm despre fotografii pline de culoare. Lucruri pe care le-ar vedea pe Facebook sau de a lua cu un aparat de fotografiat digital, dar, cu siguranță, atunci când vine vorba de culori, ai nevoie de mai mulți biți. Și destul de comună în lumea de fotografii este de a utiliza, nu 1-bit color, deoarece acest lucru sugerează, dar 24-bit color, în cazul în care veți obține de fapt, milioane de culori. Deci, ca în cazul în care am mărită pe ochi lui Rob, că a fost orice număr de milioane de posibilități diferite colorate. Deci vom introduce acest set de probleme, în 4, precum și în walkthrough, care va avea loc azi la ora 3:30 în loc de 2:30 de obicei, din cauza curs de vineri aici. Dar video va fi online, ca de obicei, mâine. Vom introduce, de asemenea, vă într-un alt format de fișier. Deci, acest lucru este în mod deliberat menit să se uite intimidant la început, dar aceasta este doar o documentație pentru o struct C. Se pare că Microsoft, de ani în urmă, a ajutat la popularizarea acest format, numit formatul de fișier bitmap, BMP, iar acest lucru a fost un super-simplu, colorat format de fișier grafic care a fost folosit de ceva timp și, uneori, încă de wallpapere pe desktop. Dacă credeți că inapoi la Windows XP și dealuri și cerul albastru, care a fost de obicei un BMP, sau o imagine bitmap, și bitmap sunt distractive pentru noi, deoarece acestea au complexitate un pic mai mult. Nu e chiar așa de simplu ca această grilă a lui 0 și 1 a lui; în schimb, aveți lucruri, cum ar fi un antet la începutul unui fișier. Deci, cu alte cuvinte, într-un fișier. BMP este o grămadă de 0 și 1 ale lui, dar există unele suplimentare de 0 și 1 în acolo. Și se dovedește că ceea ce am, probabil, luat de la sine de ani de zile, formate de fișiere, cum ar fi doc sau.. xls sau. MP3 sau. mp4, indiferent de formatele de fișiere pe care sunteți familiarizați cu. Ei bine, ce înseamnă să fie chiar un format de fișier? Pentru că la sfârșitul zilei, toate aceste fișiere folosim avem doar 0 și 1 în și, poate, cei 0-uri și 1 reprezintă o, b, c, prin ASCII sau similare, dar pana la sfarsitul zilei, e doar a lui 0 și 1 a lui. Deci, oamenii pur și simplu să decidă ocazional pentru a inventa un nou format de fișier în cazul în care acestea standardiza ce modele de biți va însemna, de fapt. Și în acest caz aici, oameni buni care a proiectat formatul de fișier de tip bitmap a declarat că, la prima octet într-un fișier bitmap, cum notată prin compensare 0, acolo, acolo va fi un nume criptic bfType variabilă numită, care tocmai vine de la tipul de fișier de tip bitmap; ce tip de fișier bitmap acest lucru este. Puteți deduce, probabil, din al doilea rând că diferența 2, numărul de octet 2, are un model al lui 0 și 1 în care reprezintă ceea ce? Dimensiunea de ceva, și merge mai departe de acolo. Deci, în set de probleme 4, veți fi umblat prin unele dintre aceste lucruri. Noi nu se va termina pese de toate acestea, dar observați că începe să se interesante în jurul valorii de linie sau octet 54, rgbtBlue, verde și roșu. Dacă ați auzit vreodată acronimul RGB, rosu verde albastru, aceasta este o referire la asta. Pentru că se pare că poți picta toate culorile curcubeului cu o combinatie de rosu si albastru si verde. Și, de fapt, părinții în cameră ar putea aminti unele dintre cele mai vechi proiectoare. Aceste zile, veți vedea doar 1 lumina strălucitoare care vine dintr-o lentilă. Dar sa revenim la zi, ați avut lentila roșie, lentile albastre, iar lentila verde și împreună au ca scop ecran și a format o imagine colorată. Și destul de des de școli medii și licee ar avea aceste lentile tot-așa-ușor Askew, asa ca au fost un fel de a vedea imagini duble sau triple, dar asta a fost ideea. Ai avut lumină roșie și verde și albastru pictura o imagine. Și că același principiu este folosit în calculatoare. Deci, printre provocările, atunci, pentru tine, în problema set 4 vor fi cateva lucruri, unul este de a redimensiona o imagine, de fapt. Pentru a lua într-un model al lui 0 și 1 a lui, dau seama care bucăți ale lui 0 și 1 în ceea ce reprezintă într-o structură de acest fel, și dau apoi cum să reproducă în pixeli: rosu, albastru, de la verde în interiorul, astfel că, atunci când o imagine arata ca acest lucru inițial, s-ar putea arata ca acest loc după aceea. Printre alte provocări, de asemenea, va fi ca vei fi pronunțată o imagine medico-legală a unui fișier real de la un aparat de fotografiat digital și pe care aparatul foto, o dată la un moment dat, erau o grămadă de fotografii. Problema este, am avut accidental șterse sau imaginea corupt cumva. Se întâmplă lucruri rele cu camere digitale, și așa am copiat rapid toate de 0 și 1 în off de acel card pentru tine, salvat-le pe toate într-un fișier mare, iar apoi le vom preda la tine în problema set 4, astfel încât să puteți scrie un program în C, cu care să recupereze toate aceste JPEG-urile, în mod ideal. Și se pare că JPEG, chiar dacă ele sunt oarecum de un format de fișier complexă, ei sunt mult mai complexe decât acest chip zâmbitor aici. Se pare că fiecare JPEG începe cu aceleași tipare ale lui 0 și 1 a lui. Deci, folosind o buclă în timp ce pentru o buclă sau sau similare, puteți itera peste tot de 0 și 1 în această imagine medico-legale și de fiecare dată când vezi modelul specială care este definită în caietul de sarcini set de probleme, a poți presupune, "Oh, aici este, cu o probabilitate foarte mare, începutul unui JPEG ", și de îndată ce veți găsi același model, un numar de bytes sau kilobytes sau megaocteți mai târziu, poți presupune, "Ooh! Aici este un JPEG al doilea rând, am luat fotografie, după prima. Permiteți-mi să vă opriți din citit ca primul dosar, începe să scrie această unul nou. " Și de ieșire din programul tau pentru PSET 4 se va fi la fel de multe ca 50 JPEG. Și dacă nu e 50 JPEG, aveti un pic de o buclă. Dacă aveți un număr infinit de imagini JPEG, aveți o buclă infinită. Așa că, de asemenea, va fi destul de un caz comun. Asta e ceea ce e la orizont. Quiz 0, în spatele nostru. Seama, pe e-mail meu, care în mod invariabil există oameni buni care sunt atât un fel fericiți, de neutru, și trist în jurul valorii de 0 Timp Quiz. Și vă rugăm să nu ajungă la mine, TFS cap, Zamyla, TF ta sau unul dintre AC pe care știi, dacă doriți, pentru a discuta modul în care au decurs lucrurile. Deci, pentru a impresiona părinții aici, în camera, ceea ce este biblioteca CS50? Bună treabă. Care e biblioteca CS50? Da? [Răspunde Student, neinteligibil] Bine >>, bine. Deci e un set predefinită de cod pe care noi, personal, a scris, care vi le oferim, pentru a oferi unele funcționalități comune. Chestii de genul adu-mi un șir de; adu-mi un int, toate funcțiile care sunt listate aici. Începând de acum, vom începe să ia într-adevăr aceste roți de formare oprit. Deci, vom începe să ia un "șir" de la tine, care, rechemare, a fost doar un sinonim pentru ceea ce efectiv tip de date? char *. Deci, pentru parinti, asta a fost, probabil, - asta e bine, asa char * vom începe să vedem pe ecran tot mai mult cu cât vom elimina "string" din vocabularul nostru, cel puțin atunci când vine vorba de a scrie, de fapt cod. În mod similar, ne vom opri folosind unele dintre aceste funcții la fel de mult, deoarece programele noastre sunt mergi la a lua mai sofisticate , mai degrabă decât doar scrie programe care stau acolo cu o clipește prompt, de așteptare pentru utilizator să tastați ceva inch Vei primi intrări dvs. de altă parte. De exemplu, veți le obține dintr-o serie de biți de pe hard disc. Vei primi în schimb ei în viitor de la o conexiune de rețea, unele site-ul undeva. Așa că hai să coaja înapoi acest strat pentru prima dată, și trageți în sus aparatul CS50 și acest fișier numit CS50.h, care ai fost ascuțite, inclusiv de săptămâni. Dar hai sa vedem de fapt ce e înăuntru de acest lucru. Deci, partea de sus a fișierului în albastru este doar o grămadă de comentarii, informații privind garanția și licențiere. Aceasta este un fel de paradigmă comună în software-ul, pentru că o mulțime de software in aceste zile este ceea ce se numeste "open source", ceea ce înseamnă că cineva a scris codul și a făcut-o în mod liber la dispoziție, nu doar pentru a rula și de a folosi, dar, de fapt citit și modifice și să se integreze în munca ta. Deci, asta e ceea ce ai folosit, software-ul open source, deși într-o formă foarte mic. Dacă aș defilați în jos trecut de comentariile, însă, vom începe pentru a vedea unele lucruri mult mai familiare. Deci, observați în partea de sus aici, că dosarul CS50.h include o grămadă de fișiere antet. Acum, cele mai multe dintre acestea nu am văzut până acum, dar unul este familiar; care dintre acestea am văzut, chiar dacă pentru scurt timp, până în prezent? Da, biblioteci standard. Stdlib.h are malloc, Deci, odată ce am început să vorbim despre alocarea dinamică a memoriei, care ne vom întoarce la săptămâna viitoare, precum și, am început inclusiv acel fișier. Se pare că bool și adevărat și fals, nu există de fapt în C, în sine, excepția cazului în care ați inclus acest fisier aici. Deci ne-am, de câteva săptămâni, a fost inclusiv de iarnă bool.h astfel încât să puteți utiliza noțiunea de. bool, adevărat sau fals Fără acest lucru, va trebui să-l sortați de fals și de a folosi un int și doar presupune că arbitrar 0 este falsă și 1 este adevărat. Acum, dacă am derula în jos în continuare, aici este definiția noastră a unui șir. Se pare că, așa cum am spus înainte, că în cazul în care aceasta este * nu contează cu adevărat. Puteți avea chiar tot în jurul valorii de spațiu. Noi, acest semestru, au fost l promoveze ca acest lucru să facă clar faptul că are de a face * cu tipul. Dar dau seama, la fel ca și comună, în cazul în care nu un pic mai comun, este să-l puneți acolo dar funcțional e același lucru. Dar acum, dacă citim mai departe în jos, haideți să aruncăm o privire la cuvânt de spus, GetInt, deoarece am folosit faptul că, probabil, înainte de orice altceva în acest semestru. Și aici este GetInt. Aceasta este ceea ce? Acesta este prototipul. De multe ori, ne-am pus prototipuri la topuri ale noastre. Fișiere c, dar puteți pune, de asemenea, prototipuri în fișiere antet, fișiere h., ca asta de aici, așa că, atunci când scrii unele funcții pe care doriți alte persoane să poată utiliza, care este exact cazul cu biblioteca CS50, nu numai în aplicare funcțiile în ceva de genul CS50.c, ai pus, de asemenea, prototipurile nu la partea de sus a acelui fișier, dar la partea de sus a unui fișier antet, apoi acel fișier header este ceea ce prietenii și colegii includ, cu ascuțite includă în propriul lor cod. Deci, tot acest timp ai fost, inclusiv toate aceste prototipuri efectiv la partea de sus a fișierului, dar prin intermediul acestui mecanism se numără ascuțite că, în esență copii și paste acest fișier în propria voastră. Acum, aici este unele documente destul de detaliate. Ne-am luat destul de mult pentru a acordat ca GetInt devine un int, dar se pare că există unele cazuri de colț, nu? Ce se întâmplă dacă utilizatorul tipuri într-un număr care e mult prea mare? Un quintillion, care pur si simplu nu poate încăpea în interiorul unui int? Care este comportamentul așteptat? Ei bine, în mod ideal, e previzibil. Deci, în acest caz, dacă ai citit, de fapt amendă de imprimare, veți vedea că, dacă linia nu poate fi citit, acest INT_MAX întoarce. Nu ne-am vorbit despre asta, dar bazate pe capitalizarea acesteia, ceea ce este, probabil? E o constantă, așa că e un constantă de construcții care este, probabil, a declarat intr-unul din aceste fișiere header care-i treaba mare în dosar, și INT_MAX este, probabil, ceva de genul, aproximativ, 2 miliarde de euro. Ideea fiind că, deoarece avem nevoie de pentru a semnifica faptul că într-un fel ceva nu a mers bine, ne, da, au numere de 4 miliarde la dispoziția noastră, negativ 2 miliarde de până la 2 miliarde de euro, da sau de a lua. Ei bine, ceea ce este comun în programarea este furi doar unul dintre aceste numere. Poate 0, poate 2 miliarde de euro, poate negativ 2 miliarde. Deci, vă petrece una dintre valorile posibile, astfel încât să vă puteți angaja în lume că, dacă ceva nu merge bine, voi reveni această valoare super-mare. Dar tu nu vrei ceva de utilizatorul tastarea criptic de genul "2, 3, 4 ..." numărului foarte mare, în cazul în care ați generalizeze în schimb ca o constantă. Deci, într-adevăr, dacă au fost anal în ultimele săptămâni, oricând te sun GetInt, ar trebui să fi fost verificarea cu o condiție în cazul în care. Credeți tip de utilizator în INT_MAX, sau mai precis, a făcut GetInt INT_MAX retur? Pentru că dacă a făcut-o, că înseamnă, de fapt nu l-au tastați; ceva nu a mers bine în acest caz. Deci, asta este ceea ce, în general, cunoscut sub numele de "santinela" valoare, ceea ce înseamnă doar speciale. Ei bine, să ne întoarcem acum în a fisierelor. C. Dosarul C a existat în aparatul de ceva timp, și, de fapt, aparatul are pe precompilat pentru tine în chestia aia l-am numit "cod obiect", dar pur si simplu nu conteaza pentru tine în cazul în care aceasta se datorează faptului că sistemul știe, în acest caz, în cazul în care aceasta este, aparatul. Dar hai să defilați în jos acum la GetInt, și a vedea cum GetInt a lucrat in tot acest timp. Deci, aici avem comentarii similare din înainte. Lasă-mă să mări doar pe porțiunea de cod, și ceea ce avem pentru GetInt este următorul. Este nevoie de nici o intrare și returnează un int, în timp ce (adevărat), așa că avem o buclă infinită deliberată dar, probabil, vom iesi din aceasta într-un fel, sau pentru a reveni la cadrul asta. Deci, hai sa vedem cum funcționează. Ei bine, se pare a fi utilizarea getString în această primă linie în interiorul buclei, 166. Acest lucru este acum bună practică, deoarece în ce circumstanțe ar putea reveni getString acest cuvânt cheie specială, NULL? În cazul în care ceva nu merge bine. Ce ar putea merge prost, atunci când apelați ceva de genul getString? Da? [Răspuns Student, neinteligibil] >> Da. Deci, poate malloc eșuează. Undeva sub capota este de asteptare getString malloc, prin care se alocă memorie, care permite magazin de calculatoare toate caracterele pe care utilizatorul tipuri de tastatură în. Și să presupunem utilizatorul a avut o mulțime de timp liber și mai tastat, de exemplu, peste 2 miliarde de caractere. Mai multe caractere decât calculatorul are chiar memorie RAM. Ei bine, getString trebuie să fie în măsură pentru a semnifica faptul că la tine, chiar dacă acesta este un caz super, super-colț mai puțin frecvente. Ea trebuie să fie cumva capabil să se ocupe de acest lucru, și așa mai getString, dacă mergem înapoi și citiți documentația sa, este, de fapt, întoarce NULL. Acum, în cazul în care nu reușește getString prin returnarea NULL, GetInt este de gând să eșueze prin returnarea INT_MAX, la fel ca o santinelă. Acestea sunt doar convenții umane. Singura modalitate ar ști acest caz este este prin citirea documentației. Deci, haideți să defilați în jos pentru a în cazul în care este de fapt int GotInt. Deci, dacă am defilați în jos un pic mai departe, în linie 170, avem un comentariu de mai sus aceste linii. Așa că am declara, în 172, o int n și un char C, iar apoi această nouă funcție pe care unii dintre voi au dat peste înainte, dar sscanf. Acest lucru vine de la f șir de scanare. Cu alte cuvinte, da-mi un șir și o voi scana pentru piese de informații de interes. Deci, ce înseamnă asta? Ei bine, să presupunem că am tip în, literalmente, 1 2 3 la tastatură, și a lovit apoi introduceți. Care este tipul de date de 1 2 3 atunci când sa întors de getString? Este, evident, un șir de caractere, nu? Am un șir de caractere, astfel încât 1 2 3 este într-adevăr "1 2 3" cu 0 \, la sfârșitul anului acesta. Asta nu este un int. Asta nu e un număr. Se pare ca un număr, dar acesta nu este de fapt. Deci, ce are GetInt trebuie să fac? Ea are de a scana acel șir la stânga la dreapta, 1 2 3 \ 0, și cumva converti la un întreg real. Acum, ai putea da seama cum să facă acest lucru. Dacă credeți că inapoi la PSET 2, probabil ai luat un pic confortabil cu Cezar sau Vigenere astfel încât să puteți repeta peste un șir, puteți converti caractere la Ints cu murături. Aceasta este o mulțime de muncă. De ce nu suna ca o funcție sscanf care face asta pentru tine? Deci, sscanf așteaptă un argument, în acest caz numit linie, care este un șir de caractere. Tu specificați apoi, în ghilimele, foarte similar cu printf, ce te astepti sa vezi in acest șir? Ceea ce vreau să spun aici este, mă aștept să văd un număr zecimal și poate un caracter. Și vom vedea de ce acesta este cazul într-o clipă. Se pare că această notație este acum amintește de lucruri am început să vorbim despre doar peste o săptămână în urmă. Ce este & N și C & faci pentru noi aici? [Răspunde Student, neinteligibil] Da >>. Se dă-mi adresa lui n și adresa c.. Acum, de ce este așa de important? Ei bine, știi că, cu funcții în C îl poți returna o valoare sau nici o valoare, la toate. Puteți returna un int, un șir, un float, char o, indiferent. Sau vă puteți întoarce nule, dar vă puteți întoarce doar 1 lucru maxim. Dar aici vrem să-mi întoarcă sscanf poate un int, un număr zecimal, și, de asemenea, o. char, și vă voi explica de ce char într-un moment Deci, în mod eficient doriți să se întoarcă f 2 lucruri, că nu e doar posibil, în C. Astfel încât să puteți lucra în jurul valorii de faptul că prin trecerea în 2 adrese, deoarece de îndată ce vă dai o funcție 2 adrese, ceea ce poate că funcția face cu ei? Se poate scrie la acele adrese. Aveți posibilitatea să utilizați operațiunea * și "du-te acolo" la fiecare din aceste adrese. E un fel de backdoor acestui mecanism, dar foarte comună pentru modificarea valorilor variabilelor la mai mult de doar 1 loc, în acest caz, 2. Acum, eu sunt observați de verificare pentru == la1, iar apoi revenind n cazul în care nu, de fapt, evaluează la true. Deci, ce se întâmplă? Ei bine, tehnic, tot ce doresc cu adevărat să se întâmple în GetInt este aceasta. Dorim să elimine, ca să spunem așa, ne-o dorim pentru a citi șir "1 2 3" si daca se pare ca exista un numar acolo, ceea ce ne spune sscanf să faceți este să pună acest număr, 1 2 3, în această variabilă n pentru mine. De aceea, atunci, nu am asta la fel de bine? Care este rolul, de asemenea, zicând:, sscanf, s-ar putea obține, de asemenea un caracter aici. [Vorbind Student, neinteligibil] >> Nu - un punct zecimal ar putea funcționa. Să susțin că gandit pentru un moment. Ce altceva? [Student, neinteligibil] >> Deci, gand bun, ar putea fi caracterul NULL. Nu e de fapt, în acest caz. Da? [Student, neinteligibil] ASCII >>. Sau, permiteți-mi să generalizăm și mai mult. C% este doar pentru verificare erori. Noi nu vrem să existe un caracter după numărul, dar ce-mi permite să fac este următorul: Se pare că sscanf, pe lângă stocarea valori în N și C, în acest exemplu aici, ceea ce, de asemenea, nu este returnează numărul de variabile pus valorile inch Deci, dacă tastați numai în 1 2 3, apoi doar% d este de gând să se potrivească și numai n este stocat cu o valoare cum ar fi 1 2 3 si nimic nu se pune în c; C rămâne o valoare gunoi, ca să spunem așa. Gunoi, pentru că niciodată nu a fost initializat ca o anumită valoare. Deci, în acest caz, sscanf returnează 1, pentru că am populat una dintre aceste indicii, caz în care, mare. Am un int, asa ca am elibera linia pentru a elibera memorie că de fapt getString alocate, iar apoi mă voi întoarce nr. Altfel, dacă ați întrebat vreodată în cazul în care încercați declarație vine de la, provine chiar de aici. În cazul în care, prin contrast, de tip I în 1 2 3 foo, doar câteva ordine aleatoare de text, sscanf se va vedea, ooh, numărul, ooh, numărul, ooh, numărul, ooh - f. Și se va pune 1 2 3 din nr. Se va pune f în c, iar apoi să se întoarcă 2. Deci avem, folosind doar definiția de bază a comportamentului lui scanf, un mod foarte simplu - bine, complexă, la prima vedere, dar la sfârșitul zilei, Mecanismul destul de simplu de a spune, există un întreg, și dacă da, este ca singurul lucru pe care-am găsit? Și spațiul alb aici este deliberată. Dacă ați citit documentația pentru sscanf, se va spune că, dacă includ o bucată de spațiu alb de la începutul sau la sfârșitul, sscanf prea va permite utilizatorului, indiferent de motiv, pentru a lovi bara de spațiu 1 2 3, și care va fi legitim. Acesta nu va țipa la utilizatorul doar pentru că au lovit bara de spațiu la începutul sau la sfârșitul, care este doar un pic mai user-friendly. Orice întrebări, apoi, pe GetInts? Da? [Întrebare Student, neinteligibil] Bună întrebare >>. Ce se întâmplă dacă ai tastat într-un char, cum ar fi f, și apăsați tasta Enter fără tastarea vreodată 1 2 3; ce crezi comportamentul această linie de cod ar fi atunci? Deci, sscanf poate acoperi asta, deoarece, în acest caz, nu este de gând să umple n sau C; se va întoarce în locul 0. În care caz, eu sunt de capturare, de asemenea, faptul că scenariul, pentru că valoarea așteptată vreau este 1. Vreau doar 1, și numai 1 lucru să fie umplut. Bună întrebare. Altele? În regulă, deci să nu se treacă prin toate funcțiile de aici, dar una care pare a fi, probabil, de interes rămase este getString deoarece se pare că GetFloat, GetInt, GetDouble, GetLongLong toate punt o mulțime de funcționalități lor de a getString. Deci, haideți să aruncăm o privire la modul în care el este pus în aplicare aici. Asta arata un complex pic, dar se folosește fundamentele aceleași că am început să vorbim despre săptămâna trecută. Deci, în getString, care ia nici un argument ca pe vid aici, și-l întoarce un șir, așa am declarat un șir de caractere numit tampon. Nu știu cu adevărat ce se întâmplă să fie utilizate pentru încă, dar vom vedea. Se pare ca capacitate este, în mod implicit, 0, nu destul de sigur că în cazul în care acest lucru se întâmplă. Nu sunt sigur ce n va fi utilizat pentru inca. Dar acum e un pic cam mult mai interesantă, astfel încât în ​​linie 243, ne pronunțăm un c int, aceasta este un fel de detaliu prost. Un caracter este de 8 biți, 8 biți și poate stoca câte valori diferite? 256. Problema este, dacă doriți să aveți 256 de caractere ASCII diferite, care există, dacă credeți înapoi, iar acest lucru nu este ceva să memoreze. Dar, dacă credeți că inapoi la tabela ASCII mare am avut săptămâni în urmă, au existat, în acest caz, 128 sau 256 de caractere ASCII. Am folosit toate modelele de 0 și 1 ale e sus. Asta este o problemă în cazul în care doriți să fie în măsură să detecteze o eroare. Pentru că dacă utilizați deja 256 de valori pentru personajele tale, nu ai de gând cu adevărat înainte, pentru că acum nu ai nici o modalitate de a spune, "Acesta nu este un caracter legal, aceasta este un mesaj eronat." Deci, ce face lumea este, ei folosesc valoarea cea mai mare următoare, ceva de genul un int, astfel încât să aveți un număr nebun de biți, 32 pentru 4 miliarde valori posibile, astfel încât să puteți ajunge pur și simplu prin utilizarea, în esență, 257 din ele, 1 din care are o semnificație specială ca o eroare. Deci, hai sa vedem cum funcționează. În conformitate 246, am avea această buclă în timp ce de mare care este de asteptare fgetc; f fisier sens, getc, și apoi stdin. Se pare că aceasta este doar mod mai precis de a spune "citește de intrare de la tastatură." Standard tastatură mijloace de intrare, de ieșire standard de mijloace ecran, și eroarea standard, pe care le vom vedea în PSET 4, înseamnă ecran, dar o parte specială a ecranului, astfel încât nu este confundat cu producția efectivă pe care ați intenționat să imprimați, dar mai mult pe faptul că, în viitor. Deci, fgetc înseamnă doar citi un caracter de la tastatură, și păstrați-l în cazul în care? Depozitați-l în c, și să verificați apoi, așa că eu sunt doar folosind unele conjunctii booleene aici, verificați că acesta nu este egal \ n, astfel încât utilizatorul a lovit introduceți. Dorim să se oprească la acel moment, sfârșitul buclei, iar noi, de asemenea, doriți să verificați pentru constanta speciale, EOF, care, dacă știți sau ghici - ce inseamna sa stea? Sfârșitul de fișier. Deci, acesta este un fel de lipsită de sens, pentru că dacă mă tastarea la tastatura, nu există cu adevărat nici un fișier nu implicat în acest lucru, dar acest lucru este doar sorta de termen generic folosit pentru a înțelege că nimic altceva nu vine de la degetele omului. EOF. Sfârșitul de fișier. Ca o paranteza, dacă v-ați lovit vreodată de control d la tastatură, Nu că ar avea încă; ați lovit de control c.. Dar de control d trimite acest EOF specială numită constantă. Deci, acum avem doar niște alocare de memorie dinamică. Deci, dacă n + 1> capacitate, acum voi explica nr. n este doar cât de multe bytes sunt în prezent în tampon, șir că ești în prezent, construirea de utilizator. Dacă aveți mai multe caractere din buffer-ul dvs. decât aveți capacitatea în tampon, intuitiv, ceea ce trebuie să facem, atunci se aloce o capacitate mai mare. Am de gând să răsfoiesc peste unele dintre aritmetică aici și să se concentreze doar pe această funcție aici. Știi ce malloc este, sau cel puțin, în general, familiar. Ia ghici ce-o face realloc. [Răspuns Student, neinteligibil] Da >>. Și nu e destul de memorie adăugând, ea realocă de memorie, după cum urmează: Dacă există încă loc la sfârșitul șir pentru a vă oferi mai mult de faptul că memoria decât a fost inițial ți-o dă, atunci veți obține că memorie suplimentară. Astfel încât să puteți pune doar caracterele siruri de caractere spate în spate la spate în spate. Dar dacă asta nu e cazul, pentru că ai așteptat prea mult timp și ceva aleatoriu ajuns plopped în memorie acolo, dar nu e in plus de memorie în jos aici, e în regulă. Realloc este de gând să facă tot grea pentru tine, muta șirul ați citit în astfel departe de aici, a pus-o acolo, si apoi da pistei ceva mai mult de la acel moment. Deci, cu un val de mana, permiteți-mi să spun că ceea ce face getString este că începe cu un tampon mic, poate 1 singur caracter, și dacă utilizatorul tipurile din 2 caractere, getString sfârșește de asteptare realloc și spune, "Oh, 1 caracter nu a fost suficient. Dă-mi 2 caractere. " Apoi, dacă ai citit prin logica bucla, se va spune, "Oh, utilizatorul tastat în 3 caractere. Dă-mi acum, nu 2, dar 4 caractere, atunci da-mi 8, atunci dă-mi 16 și 32. " Faptul că am dublarea capacității de fiecare dată înseamnă că buffer-ul nu este de gând să crească lent. O să crească super rapid, și ceea ce ar putea fi avantajul de asta? De ce am dublarea dimensiunea tampon, chiar dacă utilizatorul s-ar putea nevoie doar de 1 caracter suplimentar de la tastatură? [Răspuns Student, neinteligibil]. >> Ce e asta? Exact. Nu trebuie să-l crească la fel de des. Iar acesta este doar un fel de - Esti acoperire pariurile tale aici. Ideea fiind că nu doriți să apelați realloc foarte mult, pentru că tinde să fie lent. Orice moment să vă întreb sistemul de operare pentru memorie, după cum veți vedea în curând într-un set de probleme în viitor, aceasta tinde să ia ceva timp. Deci, minimizarea că suma de timp, chiar dacă îți pierzi ceva spațiu, tinde să fie un lucru bun. Dar dacă citim prin partea finală a getString aici, și, din nou, înțelegerea fiecare linie unică aici nu este atât de importantă astăzi. Dar observa că în cele din urmă solicită malloc din nou, și se alocă exact așa cum bytes pe care îl are nevoie pentru șirul și apoi aruncă prin apel gratuit, tampon excesiv de mare, în cazul în care într-adevăr s-au dublat de prea multe ori. Pe scurt, asta e modul în care getString a lucrat in tot acest timp. Tot ceea ce face este citit de un caracter la un moment dat din nou și din nou și din nou și de fiecare dată când are nevoie de memorie suplimentară, aceasta solicită să se stabilească un sistem de operare pentru aceasta sunand la realloc. Alte întrebări? Bine. Un atac. Acum că am înțeles pointeri, sau cel puțin sunt din ce în ce familiarizați cu pointeri, să ia în considerare modul în care toată lumea începe să se prăbușească dacă nu apara destul de contradictorii împotriva utilizatorilor, oameni care încearcă să hack în sistemul dumneavoastră. Oamenii care încearcă să fure software-ul dvs. prin ocolirea un cod de înregistrare că acestea ar putea avea altfel de tip inch Aruncati o privire la acest exemplu aici, care este la doar codul C care are o funcție principală la partea de jos, care apelează o funcție foo, și pentru ce se trece la foo? [Student] Un singur argument. >> Single argument. Deci, argv [1], ceea ce înseamnă primul cuvânt tastat de utilizator la linia de comandă, după a.out sau orice program este numit. Deci foo, în partea de sus, are într-un char *, dar char * este doar ceea ce? Șir. Nu e nimic nou aici, și că șirul este arbitrar fiind numit bar. În această linie de aici, char c [12], într-un fel de semi-tehnic limba engleză, ceea ce se face această linie? Matrice de -? Caractere. Dă-mi un tablou de 12 caractere. Așa că am putea numi asta un tampon. Se numește punct de vedere tehnic C, dar un tampon în programare înseamnă doar o grămadă de spațiu pe care le puteți pune niște chestii inch Apoi în sfârșit, memcpy, nu ne-am folosit înainte. Dar puteți ghici, probabil, ceea ce face. Se copiază memoria. Ce face? Ei bine, se pare că acesta copiază bar, intrare său, în c, dar numai până la lungimea de bare. Dar există un bug aici. Ok, deci punct de vedere tehnic ar trebui să facem cu adevărat strlen (bar) x sizeof (char), asta e corect. Dar, în cel mai rău caz aici, să presupunem că that - așa, bine. Apoi, există 2 bug-uri. Deci, sizeof (char), în regulă, să facem acest lucru un pic mai larg. Deci, acum, există încă un bug, care este ceea ce? [Răspuns Student, neinteligibil] Data Check >> pentru ce? Ok, deci ar trebui să fim de verificare pentru NULL, pentru că lucrurile rele se întâmplă atunci când indicatorul este NULL, Pentru că s-ar putea sfârși prin a merge acolo, și nu ar trebui să fie niciodată de gând să NULL prin dereferencing cu operatorul *. Așa că e bine, si ce altceva facem? În mod logic nu e un defect aici. [Răspuns Student, neinteligibil] Deci, dacă verificați >> argc ≥ 2? Ok, deci nu e bug-uri 3 în acest program aici. Noi nu suntem verifica dacă utilizatorul efectiv introdus în nimic în argv [1], bine. Deci, ce e bug treia? Da? [Răspuns Student, neinteligibil] >> Bine. Așa că am verificat-un scenariu. Noi implicit verificat nu copiați mai multă memorie decât ar depăși lungimea de bara. Deci, dacă șirul de utilizator introdus este de 10 de caractere în lungime, acest lucru este spus, "copie numai 10 caractere." Și asta e bine, dar ce se întâmplă dacă utilizatorul tastat într-un cuvânt la prompt ca un cuvânt personaj 20; acest lucru este, spunând copiere de 20 de caractere de la barul în ce? C, altfel cunoscut sub numele tampon noastră, ceea ce înseamnă că a scris doar datele la 8 locații octet care nu vă aparțin, și nu le dețin în sensul că niciodată nu le-ai alocat. Deci, asta este ceea ce, în general, cunoscut sub numele de atac de tip buffer overflow, sau tampon atac depășire, iar atacul este în sensul că, dacă utilizatorul sau program care sună funcția dumneavoastră este de a face această răutate, ceea ce se întâmplă de fapt viitoare ar putea fi destul de rău. Să aruncăm o privire la această imagine aici. Această imagine reprezintă stiva de memorie. Și reamintească faptul că de fiecare dată când apelați o funcție, te acest cadru mic pe stivă și apoi altul și apoi altul și apoi altul. Și astfel acum am doar un fel de departe ca acestea captată dreptunghiuri fie acolo, pe bord sau pe ecran aici. Dar, dacă ne apropia pe una dintre aceste dreptunghiuri, atunci când apelați o funcție foo, se pare că există mai mult pe stivă în interiorul cadrului de faptul că și acest dreptunghi mult decât x și y, iar a și b, asa cum am facut vorbim despre swap. Se pare că există unele detalii de nivel inferior, printre ele se întoarcă adresa. Deci, se dovedește atunci când solicită principal foo, principala trebuie sa informeze foo ce adresa principală este în memoria calculatorului. Pentru că altfel, de îndată ce foo se face de executare, la fel ca în acest caz aici, Odată ce ați ajunge la acest bretele aproape cret, la sfârșitul anului foo, cum naiba nu știe unde foo control al programului, ar trebui să mergem? Se pare că răspunsul la această întrebare este, în acest dreptunghi roșu aici. Aceasta reprezintă un pointer, și este de până la computer pentru a stoca, temporar, pe stiva așa-numita adresa principale, astfel încât, cât mai curând foo se face de executare, calculatorul știe unde și ce linie în principal pentru a reveni la. Indicatorul frame Salvat se referă în mod similar cu acest lucru. Barul char * aici reprezintă ceea ce? Ei bine, acum acest segment albastru aici este cadrul foo lui, ceea ce este barul? Ok, deci bara este doar argument pentru funcția de foo. Deci, acum ne-am întors de la imaginea familiară. Există mai multe lucruri și mai multe distrageri pe ecran dar acest segment albastru este ceea ce am fost bazându-se pe tablă pentru ceva de genul swap. Acesta este cadrul pentru foo și singurul lucru în ea acum este bar, care este acest parametru. Dar ce altceva ar trebui să fie în stivă, în conformitate cu acest cod aici? Char c [12]. Deci, ar trebui să vedem, de asemenea, 12 patrate de memorie, alocată o variabilă numită c.. Și într-adevăr, avem că pe ecran. Foarte de sus este c [0], iar apoi autorul acestei diagrame nu sa deranjat desen toate pătrate, dar există într-adevăr, există 12 pentru că dacă te uiți la dreapta jos, c [11], în cazul în care te numeri de la 0, este de 12 octeți astfel. Dar aici e problema: În ce direcție se c în creștere? Un fel de sus în jos, nu? În cazul în care începe de la partea de sus și partea de jos creste la, nu arata ca am plecat noi înșine pista de mult aici, la toate. Ne-am pictat un fel de noi înșine într-un colț, și că, C [11] este dreptul de până împotriva bar, care este dreptul de până împotriva indicatorul frame stivă, care este dreptul de până împotriva adresa de retur; nu e loc nu mai mult. Deci, ce e implicație, apoi, dacă o dai în bară, si tu incearca sa citesti 20 bytes într-un buffer de 12 byte? În cazul în care sunt cele 8 octeți suplimentare de gând să mergi? În interiorul orice altceva, dintre care unele sunt foarte importante. Și cel mai important lucru, potențial, este caseta roșie acolo, adresa expeditorului. Pentru că să presupunem că sunteți în mod accidental sau adversarially suprascrie aceste 4 octeți, care se adreseaza indicatorul, nu doar cu gunoaie, dar cu un număr care se întâmplă să reprezinte o adresă reală în memorie? Ce e implicaiton, în mod logic? [Răspunde Student, neinteligibil] >> Exact. Când se întoarce foo și hit-uri ca bretele cret, programul se va proceda, nu pentru a reveni la principal, se va reveni la orice adresă este în cutie roșie. Acum, în cazul înregistrării software-ului eluda, ceea ce este adresa pe care a fost returnat la funcția este care în mod normal este chemat după ce ați plătit pentru software-ul și introduse codul de inregistrare? Ai putea sorta de truc calculatorului în nu merge aici, dar în schimb, merge aici. Sau, dacă sunteți cu adevărat inteligent, un adversar poate tastezi in la tastatură, de exemplu, nu este un cuvânt real, nu 20 de caractere, dar să presupunem că el sau ea tipurile din unele caractere care reprezintă codul? Și nu va fi cod C, aceasta va fi de caractere care reprezintă codurile binare de mașini, a lui 0 și 1 a lui. Dar să presupunem că acestea sunt suficient de inteligent pentru a face acest lucru, pentru a lipi cumva în promptul getString ceva care este compilat în esență cod, iar ultimele 4 octeți suprascrie că adresa expeditorului, adresa si ce face ca intrarea fac? Se stochează în acest dreptunghi roșu adresa primul octet de tampon. Deci, va trebui să fie cu adevărat inteligent, iar acest lucru este o mulțime de studiu și de eroare pentru oameni răi acolo, dar dacă vă puteți da seama cât de mare acest buffer este, astfel încât octeți în ultimele câteva intrare pe care le furnizați la programul de se întâmplă să fie echivalentă cu adresa de start a buffer-ul tău, puteți face acest lucru. Dacă spunem, în mod normal, Buna, ziua, si \ 0, asta e ceea ce se termină până în tampon. Dar dacă suntem mai inteligent, și am umple acel buffer cu ceea ce vom numi generic codul de atac, A, A, A, A: atac, atac, atac, atac, în cazul în care acest lucru este doar ceva care face ceva rău. Ei bine, ce se întâmplă dacă sunteți cu adevărat inteligent, s-ar putea face acest lucru: În caseta roșie aici este o secvență de numere: 80, CO, 35, 08. Observați că se potrivește cu numărul pe care-i treaba aici. E în ordine inversă, dar mai multe despre aceasta altă dată. Observați că această adresă de retur a fost în mod deliberat modificat la egal adresa aici, nu adresa de principal. Deci, dacă cel rău este super inteligent, el sau ea este de gând să includă în acest cod de atac ceva de genul, "Ștergeți toate fișierele utilizatorului." Sau "Copiați parole," sau "Creați un cont de utilizator pe care le pot conecta la." Nimic, la toate, și acest lucru este atât pericolul și puterea lui C. Pentru că ai acces la memorie prin pointeri și, prin urmare, puteți scrie orice vrei în memoria unui computer. Puteți face un calculator face orice vrei pur și simplu prin după ce-l sari în jurul valorii de în spațiul său de memorie proprie. Și astfel, la această zi, atât de multe programe și site-uri atât de multe, care sunt compromise fierbe în jos la oameni care profită de acest lucru. Și acest lucru ar putea parea un atac super-sofisticate, dar nu pornește întotdeauna așa. Realitatea este că ceea ce oamenii răi vor face de obicei, este, indiferent dacă este un program la o linie de comandă sau a unui program de GUI sau un site web, este de a începe furnizarea de doar prostii. Tastați într-un cuvânt cu adevărat mare în câmpul de căutare și apăsați tasta Enter, și vă așteptăm să vedem dacă se blochează site-ul web. Sau vă așteptați să vedeți dacă programul se manifestă unele mesaj de eroare. Pentru că, dacă ai noroc, ca rau tipul, și vă oferim unele de intrare nebun care se blochează programul, înseamnă că programatorul nu a anticipa comportamentul rău ceea ce înseamnă că puteți, probabil, cu un efort suficient, încercare și eroare destul, dau seama cum să ducă un atac mult mai precis. Deci, la fel de mult o parte din securitate nu este doar evitarea acestor atacuri cu totul, dar le detecteze si de fapt se uită la gater și de a vedea ce intrări nebun avea oameni tastate in site-ul tau. Ce termeni de căutare au oamenii tastate in site-ul dvs. in speranta de a debordant-un buffer? Și toate astea se reduce la elementele de bază a ceea ce este simplu o matrice, și ce înseamnă să aloce și de a folosi memoria? Și legat de faptul că, de asemenea, este aceasta. Așa că hai să privi in ​​interiorul unui hard disk nou. Deci, vă reamintesc de o săptămână sau două în urmă că, atunci când trageți fișiere la coșul de reciclare sau coș de gunoi, ce se întâmplă? [Student] Nimic. Da >>, absolut nimic. În cele din urmă, dacă aveți o mică spațiu liber pe disc, Windows sau Mac OS va începe ștergerea fișierelor pentru tine. Dar, dacă vă trageți ceva acolo, atunci nu e deloc sigur. Toate statele ta roomate, prietenul sau de familie are de a face este să faceți clic dublu, și voila. Nu e toate fișierele schematice pe care ați încercat să le ștergeți. Deci, cele mai multe dintre noi, cel puțin știu că trebuie să faceți clic dreapta sau faceți clic controla și gol coșul de gunoi, sau ceva de genul asta. Dar chiar și atunci, că nu face destul de truc. Pentru că ceea ce se întâmplă atunci când aveți un fișier de pe hard disk care reprezintă o parte sau un document Word JPEG? Și acest lucru reprezintă hard disk, și să spunem că această țeapă aici reprezintă acel dosar, si este compus dintr-o grămadă de 0 și 1 ale lui. Ce se întâmplă atunci când nu vă trageți numai că dosarul a gunoi sau coșul de gunoi, dar, de asemenea, goliți-l? Un fel de nimic. Nu e absolut nimic acum. Acum e doar nimic, pentru că ceva se întâmplă în formă de tabel. Deci, există un fel de bază de date sau tabel în interiorul memoriei unui computer care are în esență, o coloană pentru numele fișierelor, și 1 coloană pentru locația fișierului, în cazul în care aceasta ar putea fi locatia 123, doar un număr aleatoriu. Deci, am putea avea ceva de genul X.jpg, și locația 123. Și ce se întâmplă atunci, când golit gunoiul? Asta dispare. Dar ceea ce nu merge mai departe este de 0 și 1 a lui. Deci, ce este, apoi, conexiunea la PSET 4? Ei bine, cu PSET 4, doar pentru că ne-am șterse în mod accidental flash card compact, care a avut toate aceste fotografii, sau pur si simplu pentru ca de ghinion a devenit corupt, nu înseamnă că 0 și 1 în care nu sunt încă acolo. Poate câteva dintre ele sunt pierdute pentru că ceva a fost corupt în sensul că unii au devenit 0 al lui 1 și 1 a devenit 0 lui. Lucruri rele se pot întâmpla din cauza software-ului sau hardware-ul defect buggy. Dar multe dintre aceste biți, poate chiar 100% dintre ei sunt încă acolo, e doar că calculatorul sau aparatul foto nu știe unde JPEG 1 a început și în cazul în care a început JPEG 2, dar dacă, programator, Știi, cu un pic de pricepere, în cazul în care aceste imagini JPEG sunt sau ceea ce arata ca, puteți analiza lui 0 și 1 si spune, "Ooh. JPEG. Ooh, JPEG. " Puteți scrie un program cu esență, doar o buclă în timp ce pentru sau care recupereaza fiecare și fiecare dintre aceste fișiere. Deci, lecția atunci, este de a începe "în siguranță" ștergerea fișierelor dacă doriți, pentru a evita asta cu totul. Da? [Întrebare Student, neinteligibil] Au memorie >> mai mult decât ai făcut-o înainte - Oh! Bună întrebare. Deci, de ce, apoi, după golirea de gunoi, Are computerul să vă spun că aveți mai mult spațiu liber decât ai făcut-o înainte? Într-un cuvânt, pentru că minte. Mai multe punct de vedere tehnic, tu ai mai mult spațiu. Pentru că acum ați spus, puteți pune alte lucruri în cazul în care dosarul a fost odată, dar asta nu inseamna ca bitii de gând departe, și asta nu inseamna ca bitii sunt schimbate toate 0 lui, de exemplu, pentru protecția dumneavoastră. În schimb, dacă aveți "in siguranta", a șterge fișiere sau fizic distruge aparatul, că într-adevăr este singura cale, uneori, în jurul valorii de asta. Deci, de ce să nu lăsăm pe această notă semi-înfricoșător, iar noi te vom vedea pe luni. CS50.TV