[Powered by Google Translate] [Woche 5] [David J. Malan - Harvard University] [Dies ist CS50. - CS50.TV] Dies ist CS50, Woche 5. Heute und in dieser Woche stellen wir ein wenig von der Welt der Forensik im Rahmen des Problems Set 4. Heute wird eine gekürzte Vortrages sein, weil es ein besonderes Ereignis hier hinterher. So nehmen wir einen Blick und necken sowohl Studenten und Eltern gleichermaßen heute mit einigen der Dinge, die am Horizont. Unter ihnen ab Montag, haben Sie noch ein paar Klassenkameraden. EDX, Harvard und MIT das neue Online-Initiative für OpenCourseWare und mehr, auf Harvard-Campus startet am Montag, die kommen Montag bedeutet Sie haben, wie der letzten Zählung, 86.000 zusätzliche Klassenkameraden wer wird nach zusammen mit CS50 Vorlesungen und Sektionen und Komplettlösungen und Problem-Sets. Und als Teil dieser, werden Sie Mitglied der konstituierenden Klasse von CS50 und jetzt CS50x werden. Als Teil dieser jetzt erkennen, dass es einige upsides als gut. Um bereit für diese, für die große Anzahl von Studenten, es genügt zu sagen, dass, obwohl wir 108 TFs und CAs es ist nicht ganz der beste Schüler-Lehrer-Verhältnis, wenn wir 80.000 der Studenten getroffen. Wir gehen nicht zu einem Gehalt so viele Probleme setzt manuell eingeführt, so in dieser Woche das Problem Set wird CS50 prüfen sein, was wird ein Befehlszeilen-Dienstprogramm innerhalb des Gerätes dass Sie bekommen, wenn Sie es später aktualisieren an diesem Wochenende. Du wirst in der Lage sein, um einen Befehl, check50, auf eigene Faust pset laufen, und du wirst eine sofortige Rückmeldung zu bekommen, ob das Programm richtig oder falsch ist nach verschiedenen Design-Spezifikationen, die wir zur Verfügung gestellt haben. Mehr dazu in dem Problem set-Spezifikation. Die CS50x Klassenkameraden verwenden werden diese als gut. Problem Set 4 dreht sich alles um Forensik, und dies pset war wirklich von einigen realen Sachen inspirieren wodurch dann, wenn ich in Graduiertenschule war ich interniert für eine Weile mit Middlesex County District Attorney Büro zu tun forensische Arbeit mit ihren Blei Forensiker. Was diese beliefen sich auf, wie ich glaube, ich erwähnte ein paar Wochen vorbei, ist die Masse State Police oder andere würde kommen, sie würden Drop-off Dinge wie Festplatten und CDs und Disketten und dergleichen, und dann das Ziel der Forensik Büro war, zu bestimmen ob es war oder nicht Beweise einiger sortieren. Dies war der Special Investigations Unit, so war es von Wirtschaftskriminalität. Es war mehr beunruhigende Art von Verbrechen, nichts mit irgendeine Art von digitalen Medien. Es stellt sich heraus, dass nicht so viele Leute eine E-Mail zu sagen schreiben, "ich es tat." So oft hatten diese forensische Suchbegriffe nicht erscheinen, dass alle viel Obst, aber manchmal Leute schreiben würden solche E-Mails. Also manchmal wurden die Bemühungen belohnt. Aber zu führen bis zu diesem forensischen pset, wir in pset4 vorstellen ein bisschen von Grafiken. Sie wahrscheinlich diese Dinge für selbstverständlich - JPEGs, GIFs und dergleichen - in diesen Tagen. Aber wenn du wirklich darüber nachdenken, ein Bild, ähnlich wie Rob Gesicht, konnte als eine Sequenz von Punkten oder Pixeln modelliert werden. Im Falle der Rob Gesicht, gibt es alle Arten von Farben, und wir damit begonnen, die einzelnen Punkte, die auch als Pixel bezeichnet sehen, sobald wir angefangen zu vergrößern in. Aber wenn wir zu vereinfachen, die Welt ein wenig und nur sagen, dass dies hier ist Rob in schwarz und weiß, auf Schwarz und Weiß darstellen, können wir einfach binär. Und wenn wir gehen, um binäre verwenden, 1 oder 0, können wir ausdrücken dieses gleiche Bild von Rob lächelndes Gesicht mit diesem Muster von Bits. 11000011 stellt weiß, weiß, schwarz, schwarz, schwarz, schwarz, weiß, weiß. Und so ist es nicht ein großer Sprung dann darüber zu sprechen bunten Fotografien, Dinge, die man auf Facebook sehen oder mit einer Digitalkamera hatte. Aber sicherlich, wenn es um Farben geht, brauchen Sie mehr Bits. Und recht häufig in der Welt der Fotos ist nicht 1-Bit-Farbe zu verwenden, da dies nahe legt, aber. 24-Bit-Farbe, wo Sie tatsächlich Millionen von Farben So wie in dem Fall, wenn wir uns auf Rob Auge gezoomt, das war eine beliebige Anzahl von Millionen von verschiedenen bunten Möglichkeiten. Also werden wir dies Problem Set 4 sowie in der exemplarischen Vorgehensweise einzuführen, die wird heute um 3:30 Uhr statt der üblichen 02.30 aufgrund Freitag Vortrag hier. Aber Video online sein wird wie gewohnt morgen. Wir werden auch eine Einführung in ein anderes Dateiformat. Dies ist absichtlich soll auf den ersten Blick einschüchternd, aber das ist nur Teil der Dokumentation für eine C-Struktur. Es stellt sich heraus, dass Microsoft vor Jahren geholfen zu popularisieren dieses Format als die Bitmap-Datei-Format, bmp, und dies war ein super einfache, bunte grafische Dateiformat Das war für einige Zeit verwendet und manchmal noch für Tapeten auf Desktops. Wenn Sie glauben, zurück zu Windows XP und den sanften Hügeln und den blauen Himmel, das war in der Regel ein BMP-oder Bitmap-Bild. Bitmaps sind ein Spaß für uns, weil sie ein bisschen mehr Komplexität zu haben. Es ist nicht ganz so einfach, wie dieses Netz von 0s und 1s. Stattdessen müssen Sie Dinge wie ein Header am Anfang einer Datei. Also mit anderen Worten, innerhalb eines. Bmp-Datei ist ein ganzes Bündel von 0 und 1, aber es gibt einige zusätzliche 0s und 1s drin. Und es stellt sich heraus, dass das, was wir haben wahrscheinlich gemacht für für Jahre gewährt - Dateiformate wie. doc oder. xls oder. mp3,. mp4, unabhängig von den Dateiformaten dass Sie vertraut sind - was bedeutet das sogar bedeuten, ein Dateiformat, denn am Ende des Tages alle diese Dateien benutzen wir haben nur 0 und 1. Und vielleicht die 0 und 1 stellen ABC über ASCII oder dergleichen, aber am Ende des Tages, es ist immer noch nur 0 und 1. So Mensch nur gelegentlich entscheiden, ein neues Dateiformat erfinden wo sie zu standardisieren, was Abfolgen von Bits wird eigentlich bedeuten. Und in diesem Fall hier, die Leute, die konzipiert die Bitmap-Datei-Format sagte, dass bei der ersten Byte in einer Bitmap-Datei, wie Offset 0 gibt bezeichnet, es wird einige kryptisch benannten Variable namens bfType sein, die gerade steht für Bitmap-Datei-Typ, welche Art von Bitmap-Datei ist. Sie können vielleicht folgern aus der zweiten Reihe, dass 2 Offset-Byte-Zahl 2, ein Muster von 0 und 1, was bedeutet? Die Größe von etwas. Und es geht weiter von dort. Also Problem Set 4, werden Sie durch einige dieser Dinge begangen werden. Wir werden am Ende nicht die Sorge um alle von ihnen. Aber merkt es beginnt zu umgehen Byte 54 interessant: rgbtBlue, Grün und Rot. Wenn Sie jemals gehört habe die Abkürzung RGB - rot, grün, blau - das ist ein Hinweis auf, dass weil sich herausstellt, können Sie malen alle Farben des Regenbogens mit einer Kombination aus rot und blau und grün. Und in der Tat, könnte Eltern im Zimmer erinnern an einige der frühesten Projektoren. In diesen Tagen, die Sie gerade sehen ein helles Licht, das aus einer Linse, aber wieder in den Tag hatten Sie die rote Linse, die blaue Linse, und die grüne Linse, und gemeinsam ausgerichtet auf einen Bildschirm und bildeten ein buntes Bild. Und ziemlich oft, würde Mittelschulen und Gymnasien haben diese Linsen immer so leicht schief, so dass Sie waren irgendwie sehen doppelt oder dreifach Bildern. Aber das war die Idee. Sie hatten rote, grüne und blaue Licht ein Bild zu malen. Und das gleiche Prinzip wird bei Computern verwendet. So gehören zu den Herausforderungen dann für Sie in Problem Set 4 gehen, um ein paar Dinge zu sein. Eines ist, um tatsächlich die Größe eines Bildes, die in einem Muster von 0 und 1 annehmen, herauszufinden, welche Brocken von 0 und 1, was in einer Struktur wie folgt darstellen, und dann herausfinden, wie man die Pixel replizieren - die Roten, die Blues, die Greens - innen, so dass, wenn ein Bild so aussieht zunächst Es könnte wie folgt statt zu suchen danach. Zu den weiteren Herausforderungen zu sein wird, dass Sie eine forensische werde übergeben werden einer tatsächlichen Datei von einer Digitalkamera. Und auf dieser Kamera, einmal eine Zeit, da waren eine ganze Reihe von Fotos. Das Problem ist, dass wir versehentlich gelöscht oder hatten das Bild verfälscht irgendwie. Schlimme Dinge passieren mit digitalen Kameras. Und so haben wir schnell alle 0s und 1s aus dieser Karte für Sie kopiert, rettete sie alle in eine große Datei, und dann werden wir sie Ihnen Hand in Problem-Set 4 so dass Sie ein Programm schreiben, in C, mit denen all diese JPEGs erholen, ideal. Und es stellt sich heraus, dass die JPEGs, obwohl sie etwas sind ein komplexes Dateiformat - sie sind viel komplexer als dieses lächelnde Gesicht hier - es stellt sich heraus, dass jeder JPEG mit den gleichen Mustern von 0 und 1 beginnt. Also mit letztlich eine while-Schleife oder einer for-Schleife oder ähnliches, Sie können über alle 0s und 1s in diesem forensische durchlaufen, und jedes Mal, wenn Sie das spezielle Muster, die in dem Problem set-Spezifikation definiert ist, Sie können hier davon ist, mit sehr hoher Wahrscheinlichkeit, der Beginn eines JPEG. Und sobald Sie das gleiche Muster findet eine gewisse Anzahl von Bytes oder Kilobyte oder Megabyte später, können Sie hier annehmen können, ist eine zweite JPEG, das Foto nahm ich nach dem ersten ein. Lassen Sie mich aufhören zu lesen, dass die erste Datei, mit dem Schreiben beginnen dieses neue, und die Ausgabe des Programms für pset4 wird, so viele wie 50 JPEG. Und wenn es nicht 50 JPEGs, müssen Sie ein bisschen einer Schleife. Wenn Sie eine unendliche Anzahl von JPEGs haben, haben Sie eine Endlosschleife. Damit auch Sie eine ganz gewöhnliche Fall sein. Also das ist, was am Horizont. Quiz 0 hinter uns, pro meine E-Mail erkennen, dass immer gibt es Leute, die beide glücklich sind, Art neutral, traurig und rund Quiz 0 mal. Und bitte erreichen, um mich, der Kopf TF Zamyla, Ihr eigenes TF, oder eine der CAs, die Sie, wenn Sie möchten, zu diskutieren, wie es ging kennen. So um die Eltern hier beeindrucken im Raum, was ist der CS50-Bibliothek? [Gelächter] Good job. Was ist der CS50-Bibliothek? Yeah. >> [Schüler] Es ist ein pre-geschriebenen Satz von Code [unverständlich] Okay, gut. Es ist ein pre-geschriebenen Satz von Code, dass wir das Personal schrieb, bieten wir Ihnen, das bietet einige gemeinsame Funktionalität, Sachen wie mir ein String, hol mir einen int - alle Funktionen, die hier aufgelistet sind. Ab sofort beginnen wir wirklich diese Stützräder aus. Wir werden beginnen, nehmen einen String von Ihnen, die Rückrufaktion war nur ein Synonym für das, was tatsächliche Datentyp? >> [Mehrere Schüler] Char *. Char *. Für die Eltern, das war wahrscheinlich [macht whooshing sound]. Das ist gut. Char * wir beginnen, auf dem Bildschirm umso sehen, wie wir Zeichenfolge zu entfernen aus unserem Wortschatz, zumindest wenn es darum geht, tatsächlich das Schreiben von Code. Ebenso werden wir aufhören, einige dieser Funktionen so viel weil unsere Programme bekommen werden immer ausgefeilter. Anstatt nur Programme schreiben, die dort sitzen mit einem Prompt blinkt, Wartezeit für den Benutzer etwas eintippen, werden Ihnen Ihre Eingaben von anderswo zu bekommen. Zum Beispiel werden Sie sie aus einer Reihe von Bits auf der lokalen Festplatte zu bekommen. Sie stattdessen bekommen sie in Zukunft von einem Netzwerk-Anschluss, einige Website irgendwo. Also lasst uns abziehen dieser Schicht zum ersten Mal und ziehen Sie den CS50 Appliance und diese Datei mit dem Namen cs50.h, die Sie schon # habe auch für Wochen, aber wir tatsächlich sehen, was drin ist dafür. Der Anfang der Datei in blau ist nur eine ganze Reihe von Kommentaren: Informationen zur Garantie und Lizenzierung. Dies ist eine Art gemeinsames Paradigma in der Software weil eine Menge von Software in diesen Tagen ist, was Open Source genannt, was bedeutet, dass jemand den Code geschrieben und machte es frei verfügbar nicht nur zu laufen und zu bedienen, aber tatsächlich zu lesen und zu verändern und zu integrieren in Ihre eigene Arbeit. Also das ist, was Sie bisher über Open-Source-Software, wenn auch in einem sehr kleinen Form. Wenn ich mich an den Kommentaren zu blättern, aber wir beginnen, einige weitere vertraute Dinge zu sehen. Hinweis am Anfang hier, dass die cs50.h Datei eine ganze Reihe von Header-Dateien enthält. Die meisten von ihnen haben wir nicht gesehen, aber man kennt. Welche davon haben wir gesehen, wenn auch nur kurz, so weit? >> [Student] Standard-Bibliothek. Yeah, Standard-Bibliothek. stdlib.h hat malloc. Sobald wir kamen ins Gespräch über die dynamische Speicherzuweisung, welche wir kommen zurück, um nächste Woche sowie begannen wir mit dieser Datei. Es stellt sich heraus, dass bool und wahr und falsch nicht wirklich in C per se existiert es sei denn, Sie gehören diese Datei hier. Wir haben seit Wochen einschließlich stdbool.h so dass man mit dem Begriff des a bool, true oder false. Ohne diese müsste man von gefälschten zu sortieren und verwenden Sie ein int und nur willkürlich annehmen, dass 0 falsch ist und 1 wahr ist. Wenn wir weiter nach unten scrollen, hier ist unsere Definition einer Zeichenkette. Es stellt sich heraus, wie wir schon gesagt, dass dort, wo dieser Stern ist nicht wirklich wichtig. Sie können sogar Platz rundherum. Wir in diesem Semester wurden fördern, da dies deutlich zu machen, dass der Stern hat mit der Art zu tun, aber erkennen, wie üblich, wenn nicht ein wenig mehr gemeinsam, ist es dort setzen, aber funktional ist es das Gleiche. Aber jetzt, wenn wir unten weiter lesen, lassen Sie uns einen Blick auf GetInt weil wir, dass vielleicht zuerst, bevor irgendetwas anderes in diesem Semester verwendet. Hier ist GetInt. Dies ist, was? >> [Schüler] Ein Prototyp. >> Das ist nur ein Prototyp. Oft haben wir Prototypen an den Spitzen unserer setzen. C Dateien, aber du kannst auch Prototypen in Header-Dateien,. h-Dateien, wie dieses hier so dass, wenn Sie einige Funktionen schreiben, dass Sie möchten, dass andere Menschen in der Lage sein zu verwenden, Das ist genau der Fall mit der CS50 Bibliothek, Sie nicht nur die Umsetzung Ihrer Funktionen in so etwas wie cs50.c, Sie auch setzen die Prototypen nicht an der Spitze dieser Datei aber an der Spitze einer Header-Datei. Dann, dass die Header-Datei ist, was Freunde und Kollegen sind mit # in ihren eigenen Code. So all dieser Zeit, Sie haben auch alle diese Prototypen, effektiv bei der Anfang der Datei, sondern über diese # include-Mechanismus, die im Wesentlichen Kopien und Pasten diese Datei in Ihre eigenen. Hier finden Sie einige ziemlich detaillierte Dokumentation. Wir haben ziemlich viel für selbstverständlich, dass GetInt einen int bekommt, aber es stellt sich heraus, es gibt einige Grenzfälle sind. Was, wenn der Benutzer in einer Zahl, die viel zu groß ist, eine Trillion, das kann einfach nicht innerhalb eines int passen? Was ist das erwartete Verhalten? Im Idealfall ist es vorhersehbar. Also in diesem Fall, wenn Sie tatsächlich das Kleingedruckte lesen, Sie tatsächlich sehen, dass, wenn die Leitung nicht gelesen werden kann, diese Renditen INT_MAX. Wir haben nie darüber gesprochen, aber auf der Grundlage ihrer Marktkapitalisierung, was ist es wohl? [Schüler] A konstant. >> Es ist eine Konstante. Es gibt einige spezielle Konstante, die wahrscheinlich in einem dieser Header-Dateien deklariert ist das ist bis oben in der Datei, und INT_MAX ist wahrscheinlich so etwas wie rund 2 Mrd. Die Idee ist, dass, weil wir irgendwie bedeuten, dass etwas brauchen schief ging, wir, ja, 4 Milliarden Nummern zur Verfügung: -2 Milliarden bis zu 2 Milliarden, geben oder nehmen. Nun, was ist üblich in der Programmierung Sie stehlen nur eine von diesen Zahlen, maybe 0, vielleicht 2 Milliarden, vielleicht -2000000000, so verbringen Sie eine Ihrer möglichen Werte, so dass Sie in die Welt begehen kann dass, wenn etwas schief geht, werde ich zurückkehren diese super großen Wert. Aber Sie wollen nicht der Benutzer Eingabe etwas kryptisch wie 234 ..., eine wirklich große Nummer. Sie verallgemeinern statt als Konstante. Also wirklich, wenn Sie als wurden anal in den vergangenen Wochen, jedes Mal, wenn als GetInt, Sie sollten mit einem wurden überprüft, wenn die Bedingung haben die Benutzer in INT_MAX, oder, genauer gesagt, tat GetInt Rückkehr INT_MAX, denn wenn doch, das tatsächlich bedeutet, dass sie nicht geben Sie es. Irgendetwas ging in diesem Fall falsch. Also das ist, was allgemein als Sentinel-Wert, der bedeutet nur spezielle bekannt. Lassen Sie uns nun in die. C-Datei. Die C-Datei in das Gerät für einige Zeit existierte. Und in der Tat hat das Gerät es vorkompilierte für Sie in dieser Sache, die wir als Objekt-Code, aber es ist einfach nicht zu Ihnen egal, wo es, weil das System kennt, ist In diesem Fall, wo sie: das Gerät. Lassen Sie nach unten scrollen nun GetInt und sehen, wie GetInt gearbeitet hat die ganze Zeit. Hier haben wir ähnliche Kommentare von früher. Lassen Sie mich vergrößern nur auf die Codeteil. Und was haben wir für GetInt ist die folgende. Es dauert keine Eingabe. Es gibt einen int, while (true), so haben wir eine bewusste Endlosschleife, aber vermutlich werden wir brechen aus dieser irgendwie wieder aus diesem. Mal sehen, wie das funktioniert. Wir scheinen mit GetString in dieser ersten Zeile innerhalb der Schleife, 166. Das ist jetzt eine gute Praxis, weil unter welchen Umständen GetString zurückkehren konnten dem Schlüsselwort NULL? >> [Schüler] Wenn etwas schief geht. Wenn etwas schief geht. Und was könnte schief gehen, wenn Sie so etwas wie GetString nennen? Yeah. >> [Schüler] Malloc nicht geben ihm die ints. Yeah. Vielleicht malloc fehlschlägt. Irgendwo unter der Haube wird GetString malloc, die Speicher zuweist, das lässt den Computer zu speichern alle Zeichen dass der Nutzer in der Tastatur. Und angenommen, der Benutzer hatte eine ganze Menge freie Zeit und mehr, zum Beispiel eingegeben, als 2 Milliarden Zeichen, mehr Zeichen als der Computer hat sogar RAM. GetString muss in der Lage sein, dass Sie bedeuten. Auch wenn dies ist ein super, super selten Ecke Fall, es hat irgendwie in der Lage sein, dies zu umgehen, und so GetString, wenn wir wieder und lesen Sie die Dokumentation, in der Tat Rückkehr NULL. So jetzt, wenn GetString durch Rücksendung NULL fehlschlägt, wird GetInt werde durch Rücksendung INT_MAX nicht ebenso wie ein Wächter. Dies sind nur menschliche Konventionen. Der einzige Weg, Sie wissen, ist dies der Fall wäre, ist durch das Lesen der Dokumentation. Lassen Sie nach unten scrollen, wo die int tatsächlich bekommen. Wenn ich mich ein bisschen weiter zu blättern, in Zeile 170 haben wir einen Kommentar über diesen Linien. Wir erklären in 172 ein int, n, und ein char, c, und dann diese neue Funktion, die einige von euch haben über vor, sscanf gestolpert. Dies steht für String scanf. In anderen Worten, gib mir einen String und ich werde es für Stücke von Informationen von Interesse zu scannen. Was bedeutet das? Angenommen, ich buchstäblich 123 geben über die Tastatur und drücken Sie dann die Eingabetaste. Was ist der Datentyp von 123, wenn sie von GetString zurückgekehrt? >> [Schüler] String. Es ist offensichtlich ein String, nicht wahr? Ich habe einen String. So 123 ist wirklich, quote-unquote, 123 mit dem \ 0 am Ende. Das ist nicht ein int. Das ist nicht eine Nummer. Es sieht aus wie eine Zahl, aber es ist nicht wirklich. Also, was bedeutet GetInt zu tun haben? Es muss die Zeichenfolge links nach rechts zu scannen - 123 \ 0 - und irgendwie zu einer tatsächlichen Ganzzahl umzuwandeln. Sie könnten herausfinden, wie dies zu tun. Wenn Sie zurück zu pset2 denken, Sie vermutlich habe ein wenig bequem mit Caesar oder Vigenere, so können Sie über einen String durchlaufen, können Sie Zeichen auf ints zu konvertieren. Aber was solls, es ist eine ganze Menge Arbeit. Warum nicht eine Funktion aufrufen, wie sscanf, die das tut für dich? So sscanf erwartet ein Argument - in diesem Fall als Linie, die ist ein String. Sie dann in Anführungszeichen angeben, sehr ähnlich printf, was Sie in dieser Zeichenfolge erwarten. Und was ich hier sage, ist erwarte ich eine Dezimalzahl und vielleicht ein Zeichen sehen. Und wir werden sehen, warum dies der Fall ist in nur einem Augenblick. Und es stellt sich heraus, dass diese Notation ist jetzt erinnert an Sachen, die wir kamen ins Gespräch über knapp über eine Woche her. Was ist & n und & c zu tun für uns hier? >> [Schüler] Adresse n und Anschrift des c. Yeah. Es gibt mir die Adresse n und Anschrift des c. Warum ist das so wichtig? Sie wissen, dass mit Funktionen in C, können Sie immer einen Wert zurückgeben oder überhaupt keinen Wert. Sie können zurückgeben int, einen String, einen Schwimmer, einen char, was auch immer, oder Sie können void zurückgeben, Sie können jedoch nur die Rückkehr eine Sache maximal. Aber hier wollen wir sscanf mir vielleicht wieder ein int, eine Dezimalzahl, und auch ein char, und ich werde, warum die Zeichen in einem Moment erklären. Sie effektiv möchten sscanf auf zwei Dinge zurück, aber das ist einfach nicht in C möglich Sie können rund um das funktionieren, indem in zwei Adressen denn sobald Sie eine Funktion übergeben zwei Adressen, was kann diese Funktion mit ihnen tun? >> [Schüler] Schreiben an diese Adressen. Es kann an diese Adressen schreiben. Sie können den Stern Betrieb und dorthin gehen, um jede dieser Adressen. Es ist eine Art des Back-Door-Mechanismus, sondern sehr häufig zum Ändern der Werte der Variablen mehr als nur einer Stelle - in diesem Fall, zwei. Jetzt merke ich bin für == 1 überprüfen und dann wieder n, wenn das bedeutet in der Tat, zu true ausgewertet. Also, was ist los? Technisch ist alles, was wir wirklich wollen, in GetInt passiert dies. Wir wollen analysieren, so zu sprechen, wollen wir den String lesen - quote-unquote 123 - und wenn es so aussieht, als gäbe es eine Reihe gibt, was wir sagen sscanf zu tun gelegt wird, diese Zahl - 123 - in dieser Variable n für mich. Also, warum dann habe ich tatsächlich diese als gut? Was ist die Rolle der sscanf sagen Sie vielleicht auch einen Charakter hier? [Unverständlich Student Response] >> Ein Dezimalpunkt tatsächlich funktionieren könnte. Halten wir, dass dachte einen Moment nach. Was sonst noch? [Schüler] Es könnte sein, NULL. >> Gute Gedanken. Es könnte die Null-Zeichen sein. Es ist eigentlich nicht in diesem Fall. Yeah. >> [Schüler] ASCII. ASCII. Oder lassen Sie mich noch weiter zu verallgemeinern. Die% c gibt es nur für die Fehlerprüfung. Wir haben dort nicht wollen ein Zeichen sein, nach der Zahl, aber was dies ermöglicht mir zu tun ist die folgende. Es stellt sich heraus, dass sscanf neben Speichern von Werten in n und c in diesem Beispiel hier was es auch tut, ist es gibt die Anzahl der Variablen, die es genommen Werte in. Also, wenn Sie in 123 nur eingeben, dann wird nur die% d wird übereinstimmen, und nur n wird mit einem Wert wie 123 gespeichert, und nichts wird in c setzen. C bleibt ein Müll-Wert, so zu sprechen - Müll, weil es nie auf einen Wert initialisiert wurde. So dass in diesem Fall kehrt sscanf 1 I aufgefüllt, da ein solcher Zeiger, In diesem Fall toll, ich habe einen int, damit ich die Linie, um den Arbeitsspeicher freizugeben befreien dass GetString tatsächlich zugeteilt, und dann habe ich wieder n, else if Sie sich jemals gefragt, wo das Wiederholen Aussage kommt, es kommt von hier. Also, wenn dagegen vom Typ I in 123foo - nur einige zufällige Abfolge von Text - sscanf wird, Nummer, Zahl, f sehen, und es geht um die 123 in n setzen; es geht um die f in c setzen und dann wieder 2. So haben wir, nur mit der grundlegenden Definition des sscanf das Verhalten, eine sehr einfache Art und Weise - auch komplexe auf den ersten Blick, aber am Ende des Tages ziemlich einfachen Mechanismus - zu sagen, ist es ein int und wenn ja, ist, dass die einzige Sache, die ich gefunden habe? Und das Leerzeichen ist hier gewollt. Wenn Sie die Dokumentation für sscanf lesen, erzählt er, dass, wenn Sie ein Stück von Leerzeichen beinhalten am Anfang oder am Ende zu ermöglichen sscanf den Benutzer, aus irgendeinem Grund, um Platz bar 123 getroffen und das wird legitim. Sie werden nicht beim Anwender schreien, nur weil sie die Leertaste am Anfang oder am Ende ist das nur ein wenig mehr benutzerfreundlich. Fragen Sie dann auf GetInt? Yeah. >> [Schüler] Was ist, wenn Sie nur in einem char setzen? Gute Frage. Was ist, wenn Sie nur in einem char wie f eingegeben und drücken Sie Enter, ohne jemals die Eingabe 123? Was denken Sie, das Verhalten dieser Zeile Code wäre dann? [Unverständlich Studenten Antwort] Yeah, so sscanf können, dass zu decken, da in diesem Fall ist es nicht geht, um n oder c füllen. Es wird stattdessen 0 zurückgeben, in welchem ​​Fall ich auch fangen bin dieses Szenario , weil der erwartete Wert ich will, ist ein. Ich will nur eins und nur eins gefüllt werden. Gute Frage. Andere? Gut. Lassen Sie uns nicht gehen durch alle Funktionen hier, aber derjenige, der vielleicht der restlichen Anteile scheint, ist GetString weil es sich heraus, dass GetFloat, GetInt, GetDouble, GetLongLong Alle punt viele ihrer Funktionalität GetString. So lassen Sie uns einen Blick darauf, wie er hier umgesetzt. Dieser sieht ein wenig komplex, aber es verwendet die gleichen Grundlagen dass wir reden letzte Woche gestartet. In GetString, nimmt das kein Argument nach der Leere hier und es gibt einen String zurück, ich anscheinend bin Deklaration einer Zeichenkette als Puffer. Ich weiß nicht wirklich, was das los, um für noch verwendet werden, aber wir werden sehen. Es sieht aus wie Kapazität ist standardmäßig 0. Nicht ganz sicher, wohin dieses geht, nicht sicher, was n wird für die noch verwendet werden, aber jetzt ist es immer ein wenig interessanter. Im Einklang 243 erklären wir, einen int, c. Dies ist eine Art von dummen Details. Ein char ist 8 Bit und 8 Bit können, wie viele verschiedene Werte speichern? >> [Schüler] 256. >> 256. Das Problem ist, wenn Sie 256 verschiedene ASCII-Zeichen, die dort sind, haben wollen Wenn Sie zurück denken - und das ist nicht etwas, das zu merken. Aber wenn Sie zurück zu diesem großen ASCII-Tabelle denke, wir hatten Wochen gab es in diesem Fall 128 oder 256 ASCII-Zeichen. Wir haben alle die Muster von 0 und 1 auf. Das ist ein Problem, wenn Sie in der Lage sein, um einen Fehler erkennen soll denn wenn Sie bereits mit 256 Werten für eure Charaktere, Sie nicht wirklich im Voraus zu planen, denn jetzt gibt es keine Möglichkeit zu sagen haben, dies ist keine legit Charakter, ist dies eine fehlerhafte Nachricht. Also, was die Welt tut, ist sie mit der nächst größeren Wert, so etwas wie ein int, so dass Sie eine verrückte Anzahl von Bits, 32, 4 Milliarden mögliche Werte so, dass man einfach am Ende mit im wesentlichen 257 von ihnen, 1 davon hat einige besondere Bedeutung als Fehler. Also mal sehen, wie das funktioniert. In line 246 Ich habe diesen großen while-Schleife, die einen Aufruf fgetc wird, f Bedeutung Datei, so getc, und dann stdin. Es stellt sich heraus, das ist nur die genauere Art zu sagen, lesen Eingaben über die Tastatur. Standard-Eingabe mittels Tastatur, bedeutet Standard-Ausgabe-Bildschirm, und Standardfehler, die wir in pset4 sehen werden, bedeutet, den Bildschirm sondern eine besondere Teil des Bildschirms, so dass es nicht mit den tatsächlichen Ausgang verschmolzen Sie soll zu drucken. Aber mehr dazu in der Zukunft. So fgetc bedeutet nur lesen ein Zeichen von der Tastatur und speichern Sie es wo? Bewahren Sie es in c. Und überprüfen Sie dann - so bin ich nur mit ein paar Boolean Konjunktionen hier - prüfen, ob es nicht gleich - \ n, so hat der Benutzer die Eingabetaste drücken, wollen wir an dieser Stelle zu stoppen, Ende der Schleife - und wir wollen auch für die spezielle Konstante EOF prüfen, die, wenn Sie oder erraten wissen, was macht er? >> [Schüler] Ende der Datei. >> Ende der Datei. Dies ist eine Art unsinnig, weil wenn ich auf der Tastatur eingeben, gibt es wirklich keine Datei daran beteiligt, Doch dies ist nur der Oberbegriff für meine sortieren nichts anderes wird aus dem menschlichen Finger kommt. EOF - Ende der Datei. Nebenbei, wenn Sie jemals Control D auf Ihrer Tastatur getroffen haben, nicht, dass Sie noch - Sie haben Control C getroffen - Control D sendet diese spezielle Konstante genannt EOF. So, jetzt müssen wir nur noch einige dynamische Speicherzuweisung. So dass, wenn (n + 1> Kapazität). Jetzt werde ich erklären, n. N ist nur, wie viele Bytes sind derzeit im Puffer die Zeichenfolge, die Sie derzeit den Aufbau des Benutzers. Wenn Sie mehr Zeichen in Ihrem Puffer als Sie im Puffer haben, intuitiv, was wir dann tun müssen, ist dafür mehr Kapazität. So werde ich überfliegen einige der arithmetischen hier und konzentrieren uns nur auf diese Funktion hier. Sie wissen, was malloc ist oder zumindest allgemein bekannt. Take a guess, was realloc tut. >> [Student] Fügt Speicher. Es ist nicht ganz das Hinzufügen von Arbeitsspeicher. Verteilt Speicher wie folgt. Wenn es immer noch Raum am Ende des Strings, um Ihnen mehr von dieser Erinnerung als es gibt ursprünglich Sie, dann bekommen Sie diesen zusätzlichen Speicher. So können Sie einfach weiter setzen die Zeichenfolge Zeichen Rücken an Rücken an Rücken an Rücken. Aber wenn das nicht der Fall, weil Sie zu lange gewartet und etwas zufällig wurde im Speicher plumpste es aber es gibt zusätzlichen Speicher hier unten, das ist okay. Realloc wird alle die Schwerstarbeit für Sie tun, bewegen Sie die Zeichenfolge, die Sie in gelesen habe damit weit von hier, legte es dort unten, und dann geben Sie etwas mehr Start-und Landebahn an diesem Punkt. Also mit einer Handbewegung, lassen Sie mich sagen, dass das, was GetString tut wird es mit einem kleinen Puffer, vielleicht ein einzelnes Zeichen ab, und wenn der Benutzer in beiden Zeichen, endet GetString bis Aufruf realloc und sagt ein Charakter war nicht genug, gib mir zwei Zeichen. Dann, wenn Sie durch die Logik der Schleife zu lesen, es geht zu sagen, der Benutzer in 3 eingegebenen Zeichen, gib mir jetzt nicht 2, sondern 4 Zeichen, dann gib mir 8, dann geben Sie mir 16 und 32. Die Tatsache, dass ich eine Verdoppelung der Kapazität jedes Mal bedeutet, dass der Puffer ist nicht zu langsam wachsen, es geht um superschnell wachsen. Und was könnte der Vorteil das sein? Warum bin ich die Verdoppelung der Größe des Puffers obwohl der Benutzer kann nur noch ein zusätzliches Zeichen von der Tastatur? [Unverständlich Student Response] >> Was ist das? >> [Schüler] Sie müssen nicht so oft zu wachsen. Genau. Sie müssen nicht so oft zu wachsen. Und dies ist nur eine Art du Absicherung Ihrer Wetten hier, Die Idee ist, dass Sie nicht wollen, zu nennen realloc eine Menge, weil es zu langsam neigt. Jedes Mal, wenn Sie sich an das Betriebssystem für Speicher, wie Sie bald in einem zukünftigen Problem Satz sehen werden, neigt sie dazu, einige Zeit dauern. So minimiert so viel Zeit, auch wenn Sie verschwenden etwas Platz, neigt dazu, eine gute Sache sein. Aber wenn wir lesen, durch den letzten Teil der GetString hier - und wieder das Verständnis jede einzelne Zeile ist hier nicht so wichtig, heute - feststellen, dass es schließlich ruft malloc wieder und es weist genau so viele Bytes, wie es nach der Zeichenfolge muss und dann wegwirft, indem Sie befreit den übermäßig großen Puffer wenn es tatsächlich wurde zu oft verdoppelt. Also kurz gesagt, das ist, wie GetString gearbeitet hat die ganze Zeit. Alles, was sie tut, ist ein Zeichen in einer Zeit zu lesen wieder und wieder und wieder, und jedes Mal, es braucht einige zusätzliche Speicher, fragt er das Betriebssystem für sie indem realloc. Haben Sie Fragen? Gut. Ein Angriff. Jetzt, da wir verstehen, Zeigern oder zumindest immer vertrauter mit Zeigern Lassen Sie uns überlegen, wie die ganze Welt zum Einsturz beginnt wenn Sie nicht ganz gegen kontradiktorischen Nutzer zu verteidigen, Menschen, die versuchen, in Ihr System zu hacken sind, Menschen, die versuchen, Ihre Software unter Umgehung einige Registrierungscode stehlen dass sie vielleicht sonst zu tippen in. Werfen Sie einen Blick auf dieses Beispiel hier, das ist nur C-Code, der eine Funktion main am Boden hat das ruft eine Funktion foo. Und wie ist es vorbei, um foo? [Schüler] Ein einziges Argument. >> [Malan] Ein einziges Argument. So argv [1], was bedeutet, dass das erste Wort, dass der Benutzer in der Befehlszeile eingegeben Nach a.out oder was auch immer das Programm aufgerufen wird. So foo an der Spitze erfolgt in einem char *. Aber char * ist nur was? >> [Schüler] Eine Zeichenfolge. [Malan] Ein String, also gibt es hier nichts Neues. Diese Zeichenfolge beliebig aufgerufen bar. In dieser Linie hier, char c [12]; in einer Art semi-technisches Englisch, ist das, was diese Linie zu tun? [Student] Ein Array von - >> Array of? >> [Schüler] Charaktere. >> Characters. Gib mir eine Reihe von 12 Zeichen. So könnten wir nennen dies einen Puffer. Es ist technisch genannt c, aber ein Puffer in der Programmierung bedeutet nur einen Haufen von Raum dass Sie legte ein paar Sachen in. Dann schließlich memcpy haben wir nicht vor, aber Sie können sich wahrscheinlich vorstellen, was es tut. Er kopiert Speicher. Was bedeutet es? Offenbar kopiert bar, dessen Eingang in c, jedoch nur bis zur Länge der Stange. Aber da ist ein Fehler hier. >> [Schüler] benötigen Sie den sizeof Charakter. >> Okay. Technisch, sollten wir wirklich tun strlen (bar) * sizeof (char)). Das ist richtig. Aber im schlimmsten Fall hier, gehen wir davon aus, dass that's - Okay. Dann gibt es zwei Fehler. So sizeof (char)); Lassen Sie uns das ein wenig breiter. So, jetzt gibt es noch einen Bug, das, was ist? >> [Unverständlich Studenten Antwort] Überprüfen Sie, was? >> [Schüler] prüfen NULL. Wir sollten in der Regel für NULL werden überprüft, weil schlechte Dinge passieren Wenn Sie den Mauszeiger NULL ist, weil Sie am Ende vielleicht bis dorthin zu gehen, und Sie sollten nicht immer gehen, um durch Dereferenzierung es mit dem Stern-Operator NULL. So das ist gut. Und was tun wir? Logisch, da ist ein Fehler auch hier. [Schüler] Überprüfen Sie, ob argc ist> = 2 ist. So prüfen Sie, ob argc> = 2. Okay, so gibt es drei Fehler in diesem Programm hier. Wir prüfen nun, ob der Benutzer tatsächlich etwas in argv eingegeben [1]. Gut. Also, was ist der dritte bug? Yeah. >> [Schüler] C möglicherweise nicht groß genug sein. Gut. Wir checkten ein Szenario. Wir implizit überprüft nicht kopieren mehr Speicher als würde die Länge der bar nicht überschreiten. Also, wenn die Zeichenfolge der Benutzer eingetippt 10 Zeichen lang ist, dies sagte nur kopieren 10 Zeichen. Und das ist okay. Aber was, wenn der Benutzer in einem Wort an der Eingabeaufforderung wie ein 20-Zeichen-Wort getippt? Dieses sagt copy 20 Zeichen aus bar in was? C, sonst als unser Puffer bezeichnet, was bedeutet, Sie gerade geschrieben haben Daten zu 8 Byte Orte, die Sie nicht besitzen, und Sie nicht besitzen sie in dem Sinne, dass man nie vergeben sie. Also das ist, was allgemein als Pufferüberlauf Angriff oder Pufferüberlauf Angriff bekannt. Und es ist ein Angriff in dem Sinne, dass, wenn der Benutzer oder das Programm, die einen Aufruf Ihrer Funktion ist tut dies böswillig, was tatsächlich passiert als nächstes könnte tatsächlich ziemlich schlecht. Werfen wir also einen Blick auf dieses Bild hier. Dieses Bild stellt Ihr Stack Speicher. Daran erinnern, dass jedes Mal, wenn Sie eine Funktion aufrufen Sie diesen kleinen Rahmen auf dem Stack zu bekommen und dann noch eine und dann noch eine und noch eine. Und so weit, haben wir nur irgendwie abstrahiert diese als Rechtecke entweder auf dem Board oder auf dem Bildschirm hier. Aber wenn wir zu vergrößern auf einem dieser Rechtecke, wenn Sie eine Funktion foo nennen, es stellt sich heraus, dass es mehr auf den Stapel innerhalb dieses Rahmens in diesem Rechteck als nur x-und y-und a und b, wie wir haben über Swap reden. Es stellt sich heraus, dass es einige unteren Level-Details, darunter Adressaufkleber. So stellt sich heraus, wenn der Haupt ruft foo hat Wesentlichen auf foo informieren Welches Hauptziel ist die Adresse in den Speicher des Computers denn sonst wird sobald foo getan ausführt, wie im vorliegenden Fall ist, sobald Sie erreichen dieses geschlossene geschweifte Klammer am Ende des foo, Wie zum Teufel soll foo wissen, wo die Kontrolle des Programms soll gehen? Es stellt sich heraus, dass die Antwort auf diese Frage in diesem roten Rechteck ist hier. Dies repräsentiert einen Zeiger, und es ist bis auf den Computer vorübergehend zu speichern auf der so genannten Stapel die Adresse des Haupt so daß, sobald foo erfolgt ausführt, der Computer weiß, wo und in welcher Zeile im Hauptspeicher, um wieder auf. Gespeichert Rahmen Zeiger bezieht ebenfalls dazu bei. Char * bar stellt hier was? Nun ist diese blaue Segment ist hier foo-Rahmen. Was ist bar? Bar ist nur das Argument der foo-Funktion. So, jetzt sind wir wieder auf eine Art der gewohnte Bild. Es gibt mehr Sachen und mehr Ablenkungen auf dem Bildschirm, aber dieses Licht blaues Segment genau das, was wir an die Tafel gezeichnet für so etwas wie Swap. Das ist der Rahmen für foo. Und das einzige, was in ihm ist im Moment bar, was dieser Parameter. Aber was sollte in dem Stapel nach diesem Code hier sein? [Student] char c [12]. >> [Malan] char c [12]. Wir sollten auch sehen, 12 Quadrate zugewiesenen Speicher eine Variable namens c, und in der Tat haben wir nicht, dass auf dem Bildschirm haben. Ganz oben gibt es c [0], und dann der Autor dieses Diagramms störte Zeichnen aller der Quadrate, aber es sind in der Tat gibt 12 denn wenn man in der unteren rechten schauen, c [11], wenn Sie von 0 zu zählen ist der 12. wie Byte. Aber hier ist das Problem. In welche Richtung wird c wächst? Sortieren von oben nach unten, wenn es an der Spitze beginnt und wächst nach unten. Es sieht nicht so, wie wir uns selbst überlassen viel Landebahn hier überhaupt. Wir haben Art von uns in eine Ecke manövriert, und daß c [11] ist direkt gegen Bar, die bis gegen gespeicherten Frame-Zeigers, das ist bis gegen Adressaufkleber. Es ist kein Platz mehr. Also, was ist die Implikation dann, wenn Sie es vermasseln und Sie versuchen, das Lesen 20 Bytes in eine 12-Byte-Puffer? Wo werden diese 8 zusätzliche Bytes gehen? >> [Schüler] Inside - Im Inneren alles andere, ist von denen einige super wichtig. Und das Wichtigste, möglicherweise ist die rote Box gibt, Return-Adresse, da annehmen, dass Sie versehentlich oder adversarially überschreiben diese 4 Bytes, dass Zeiger-Adresse, nicht nur mit Müll, sondern mit einer Reihe dies geschieht, um eine tatsächliche Adresse im Speicher darstellen. Was ist die Implikation, logisch? >> [Student] Funktion wird an einen anderen Ort zurückgeben. Genau. Wenn foo Renditen und Hits, die geschweiften Klammern, wird das Programm gehen, um fortzufahren nicht, um zum Hauptmenü zurückzukehren, es geht um alles, was Adresse ist in diesem roten Kasten zurückzukehren. Im Falle der Umgehung Software-Registrierung, was ist, wenn die Adresse, an ist zurückgegeben wird, ist die Funktion, die normalerweise aufgerufen wird nachdem Sie für die Software bezahlt und eingegeben Ihren Registrierungscode? Sie können von Trick der Computer in den nicht hier zu sortieren, sondern gehen hier oben. Oder wenn Sie wirklich clever sind, können ein Gegner tatsächlich geben in die Tastatur, zum Beispiel, nicht eine tatsächliche Wort, nicht 20 Zeichen, aber angenommen, er oder sie tatsächlich Typen einige Zeichen, Code darstellen. Und es ist nicht zu C-Code sein, es ist eigentlich los, um die Zeichen lang sein das stellen binäre Maschinensprache, 0s und 1s. Aber angenommen, sie sind klug genug, das zu tun, irgendwie in die GetString prompt etwas, das im wesentlichen kompilierten Code ist einzufügen, und die letzten 4 Bytes überschrieben, dass die Rückkehr-Adresse. Und welche Adresse soll das Eingangssignal zu tun? Es speichert tatsächlich in diesem roten Rechteck die Adresse des ersten Bytes des Puffers. So muss man sich wirklich clever, und das ist eine Menge von Versuch und Irrtum für schlechte Menschen da draußen, aber wenn Sie herausfinden können, wie groß dieser Puffer so dass die letzten Bytes im Eingang Sie für das Programm bereitstellen geschehen zu sein entspricht der Adresse des Beginns des Puffers, können Sie dies tun. Wenn wir normalerweise hallo und \ 0 sagen, ist das, was landet im Puffer. Aber wenn wir klüger und wir füllen diesen Puffer mit dem, was wir allgemein nennen Angriff Code - AAA, Angriff, Angriff, Angriff - wo das ist nur etwas, das etwas Schlimmes tut, was passiert, wenn Sie wirklich clever sind, können Sie dies tun. In der roten Box ist hier eine Folge von Zahlen - 80, C0, 35, 08. Beachten Sie, dass die Zahl, die bis hier ist übereinstimmt. Es ist in umgekehrter Reihenfolge, aber dazu ein anderes Mal. Beachten Sie, dass diese Rückkehr-Adresse wurde absichtlich geändert um die Adresse gleich hier oben, nicht die Adresse der main. Also, wenn der Bösewicht super smart ist, wird er oder sie geht auf, in diesem Angriff Code so etwas wie löschen Sie alle Dateien des Benutzers oder kopieren Sie die Passwörter oder erstellen Sie ein Benutzerkonto, das kann ich dann einloggen - überhaupt nichts. Und dies ist sowohl die Gefahr und die Kraft C. Denn Sie haben Zugriff auf den Speicher über Zeiger und man kann daher alles schreiben, was Sie wollen in einem Computer-Speicher, Sie können einen Computer zu tun, was Sie wollen einfach, indem er sie hüpfen in einem eigenen Speicherbereich. Und so bis zum heutigen Tag so viele Programme und so viele Websites, die kompromittiert werden einkochen lassen, um Menschen nutzen diese. Und dies könnte wie ein super anspruchsvolle Angriff scheinen, aber es funktioniert nicht immer starten auf diese Weise. Die Realität ist, dass das, was böse Menschen werden in der Regel tun, ist, ob es sich um ein Programm in einer Befehlszeile oder ein GUI-Programm oder eine Website, starten Sie einfach die Bereitstellung Unsinn. Sie geben in einem wirklich großen Wort in das Suchfeld ein und drücken Sie die Eingabetaste, und Sie warten, um zu sehen, ob die Website stürzt oder Sie warten, um zu sehen, ob das Programm manifestiert einige Fehlermeldung denn wenn man Glück hat als Bösewicht und erhalten Sie einen gewissen verrückten Eingang das stürzt das Programm, das der Programmierer nicht vorhergesehen Dein schlechtes Benehmen bedeutet, was bedeutet, können Sie wahrscheinlich mit genug Mühe, genug Versuch und Irrtum, herausfinden, wie man eine genauere Angriff zu führen. So viel ein Teil der Sicherheit wird nicht nur die Vermeidung dieser Angriffe ganz aber nachgewiesen und sehen im Grunde logs und sehen, was verrückt Eingänge Menschen in Ihre Website eingegeben haben, Welche Suchbegriffe haben die Menschen ihn auf Ihrer Webseite eingegeben in der Hoffnung, überfüllt etwas Puffer. Und das läuft alles auf den einfachen Grundlagen dessen, was ist ein Array und was bedeutet es, zu vergeben und zu verwenden Speicher. Bezug zu, dass dann auch diese. Lassen Sie uns gerade innerhalb Blick einer Festplatte noch einmal. Sie erinnern sich aus einer oder zwei Wochen her, dass beim Ziehen Dateien auf Ihren Papierkorb oder Mülleimer, was passiert? >> [Schüler] Nichts. >> Absolut nichts, richtig? Schließlich, wenn Sie laufen auf Festplattenspeicher niedrig, Windows oder Mac OS starten Löschen von Dateien für Sie. Aber wenn Sie etwas ziehen dort, das ist überhaupt nicht sicher. Alle Ihre Mitbewohner oder ein Freund oder ein Familienmitglied zu tun hat, ist doppelt klicken und, voila, es gibt alle sketchy-Dateien, die Sie löschen versucht. Die meisten von uns zumindest wissen, dass Sie die rechte Maustaste oder Steuerelement klicken müssen und leeren Sie den Papierkorb oder so ähnlich. Aber selbst dann ist das nicht ganz den Trick tun weil das, was passiert, wenn Sie eine Datei auf Ihrer Festplatte haben Das stellt einige Word-Dokument oder eine JPEG, und dies stellt Ihre Festplatte, und lassen Sie uns sagen, dass dieses Bandes stellt hier die Datei, und es ist von einem ganzen Bündel von 0 und 1 zusammen. Was passiert, wenn Sie nicht nur ziehen Sie die Datei in den Papierkorb kann oder Papierkorb sondern auch entleeren? Sortieren von nichts. Es ist nicht unbedingt jetzt nichts. Jetzt ist es nur nichts, weil ein wenig etwas geschieht in Form dieser Tabelle. So gibt es eine Art von Datenbank oder Tabelle innerhalb der Speicher eines Computers dass im Wesentlichen eine Spalte für Dateien Namen und eine Spalte für Dateien "Lage, wo könnte dies Lage 123, nur eine zufällige Zahl sein. So haben wir vielleicht so etwas wie x.jpeg und Standort 123. Was passiert dann, wenn Sie tatsächlich leeren Sie Ihren Papierkorb? Das geht weg. Aber was geht nicht weg ist die 0s und 1s. Also, was ist dann die Verbindung zum pset4? Nun, mit pset4, nur weil wir versehentlich die Compact-Flash-Karte gelöscht das hatte alle diese Fotos oder einfach nur, weil sie vom Pech beschädigt wurde bedeutet nicht, dass die 0 und 1 nicht immer noch da. Vielleicht ein paar von ihnen sind verloren, weil etwas habe beschädigt in dem Sinne, dass einige 0s 1s wurde und 1s wurde 0s. Bad Dinge passieren können, weil fehlerhafte Software oder fehlerhafte Hardware. Aber viele dieser Bits, vielleicht sogar 100% von ihnen sind immer noch da. Es ist nur, dass der Computer oder die Kamera nicht weiß, wo JPEG1 begonnen und wo JPEG2 gestartet. Aber wenn Sie das Programmiergerät, mit ein wenig versierte wo diese JPEGs sind, wissen oder wie sie aussehen, so können Sie analysieren die 0 und 1 und sagen JPEG, JPEG, können Sie ein Programm mit im wesentlichen nur eine zum Schreiben oder while-Schleife dass wieder jeder von diesen Dateien. So die Lehre dann zu starten sicheren Löschen von Dateien wenn Sie möchten, dies ganz zu vermeiden. Ja. [Schüler] Wie kommt es, heißt es auf Ihrem Computer dass Sie mehr Speicher als vorher? Mehr Speicher als vorher - >> [Schüler] Weitere verfügbaren Speicher. Oh. Gute Frage. Also, warum dann nach dem Leeren des Papierkorbs wird Ihr Computer Ihnen sagen, dass Sie mehr freien Speicherplatz als vorher? In einer Nussschale, weil sie lügt. Mehr technisch, haben Sie mehr Platz, weil Sie jetzt gesagt haben Sie setzen andere Sachen, wo die Datei einmal war. Aber das bedeutet nicht, dass die Bits weg, und das bedeutet nicht, dass die Bits werden auf alle 0s verändert, zum Beispiel, für Ihren Schutz. So dagegen, wenn Sie sicher löschen Dateien oder physisch zu zerstören das Gerät, das ist wirklich der einzige Weg, manchmal um, dass. Also, warum nicht wir auf diesem semi-beängstigend beachten verlassen, und wir werden Sie am Montag zu sehen. [Applaus] [CS50.TV]