1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [WOCHE 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Harvard University] 3 00:00:04,760 --> 00:00:11,990 [Dies ist CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Frau] Er lügt, über was, ich weiß es nicht. 5 00:00:17,780 --> 00:00:20,300 [Man] Also, was wissen wir? 6 00:00:20,300 --> 00:00:24,120 [Frau], dass bei 9:15, Ray Santoya am Geldautomaten war. 7 00:00:24,120 --> 00:00:27,420 [Man] Die Frage ist also, was war er denn bei 9:16? 8 00:00:27,420 --> 00:00:29,980 [Frau] Schießen Sie die 9 mm auf etwas. 9 00:00:29,980 --> 00:00:31,900 Vielleicht sah er die Scharfschützen. 10 00:00:31,900 --> 00:00:34,000 [Man] Oder er wurde mit ihm zu arbeiten. 11 00:00:34,000 --> 00:00:36,330 [Frau] warten. Zurück ein. 12 00:00:36,330 --> 00:00:38,330 [Man] Was siehst du? 13 00:00:38,330 --> 00:00:44,520 [♫ Spannungsgeladene Musik ♫] 14 00:00:44,520 --> 00:00:48,320 [Frau] Bringt sein Gesicht. Vollbild. 15 00:00:48,320 --> 00:00:51,230 [Man] Seine Brille. >> Es ist eine Reflexion. 16 00:00:51,230 --> 00:01:00,810 [♫ Spannungsgeladene Musik ♫] 17 00:01:00,810 --> 00:01:03,580 [Man] Das ist der Nuevita Baseball-Team. Das ist ihr Logo. 18 00:01:03,580 --> 00:01:07,790 [Frau] Und er hat zu wer trägt die Jacke sprechen. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Also, das ist CS50 Woche 5, und heute haben wir ruinieren ein bisschen Fernsehen und Film für Sie. 20 00:01:13,730 --> 00:01:16,170 Also, wenn Sie eine Sendung wie diese hier, 21 00:01:16,170 --> 00:01:19,910 und die Polizisten sagen: "Können Sie das bereinigen?" oder "Enhance" 22 00:01:19,910 --> 00:01:21,900 es gibt keine in der realen Welt zu verbessern. 23 00:01:21,900 --> 00:01:25,220 In der Tat, was Sie wirklich bekommen ist ein wenig so etwas wie dieses. 24 00:01:25,220 --> 00:01:27,570 Ich habe einen der Mitarbeiter von Fotos von der Seite gezogen. 25 00:01:27,570 --> 00:01:30,980 Dies ist ein Programm namens Photoshop. Dies ist 1 von 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 von 3 Bowdens eigentlich heute, denn wir haben Mrs. Bowden auch hier mit Rob und Paul. 27 00:01:36,300 --> 00:01:41,950 Aber hier ist Rob auf dem Bildschirm, und wenn wir vergrößern auf diesem Glitzern er immer im Auge hatte, 28 00:01:41,950 --> 00:01:47,600 was Sie tatsächlich sehen, ist das, was du siehst, ist was du bekommst. 29 00:01:47,600 --> 00:01:51,690 Dies ist "enhanced", so "CSI" haben es ein bisschen falsch. 30 00:01:51,690 --> 00:01:55,190 Es gibt einen anderen Clip, wenn wir uns auf "CSI" nur ein bisschen mehr auswählen können. 31 00:01:55,190 --> 00:01:58,500 Dieses ist ein schönes Wort, künftig zu äußern, wenn du willst 32 00:01:58,500 --> 00:02:10,280 klingt mit Ihren Freunden technischen wenn wirklich sagen, dass du absolut nichts sehen. 33 00:02:10,280 --> 00:02:12,970 >> [Man] Seit Wochen Ich habe die Untersuchung der Cabby Killer-Morde 34 00:02:12,970 --> 00:02:15,360 mit einer gewissen morbiden Faszination. 35 00:02:15,360 --> 00:02:17,160 [Woman # 1] Dies ist in Echtzeit. 36 00:02:17,160 --> 00:02:22,930 [Woman # 2] Ich werde eine GUI-Schnittstelle mit Visual Basic erstellen, sehen, ob ich eine IP-Adresse verfolgen können. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] So Audio out of sync beiseite, die Schaffung eines GUI-Schnittstelle mit Visual Basic 38 00:02:29,570 --> 00:02:31,820 eine IP-Adresse zu verfolgen ist völliger Unsinn. 39 00:02:31,820 --> 00:02:33,840 In diesen Tagen würden Sie nicht verwenden Visual Basic, 40 00:02:33,840 --> 00:02:38,920 es gibt keine Notwendigkeit für eine GUI und IP-Adresse war eine technisch genaue Begriff. 41 00:02:38,920 --> 00:02:41,730 So halten Sie ein Auge für diese, und einer meiner Favoriten: 42 00:02:41,730 --> 00:02:45,070 Dieser ist ein wenig mehr geheimnisvoll, weil Sie eine andere Sprache wissen müssen. 43 00:02:45,070 --> 00:02:47,860 Es gibt eine Sprache namens Objective-C, die eine Obermenge von C ist 44 00:02:47,860 --> 00:02:51,960 Das bedeutet, es ist C plus einige zusätzliche Funktionen, darunter die objektorientierte Programmierung. 45 00:02:51,960 --> 00:02:55,070 Und das ist die Sprache, dass Apple für iOS-Programmierung popularisiert. 46 00:02:55,070 --> 00:02:58,760 Und hier ist ein Clip aus einer anderen Show überhaupt, von "Numbers" 47 00:02:58,760 --> 00:03:02,450 , dass, wenn Sie tatsächlich genau hinsehen auf Ihrem TiVo und Pause zum richtigen Zeitpunkt, 48 00:03:02,450 --> 00:03:07,700 Sie sehen, dass das, was sie sehen, ist nicht ganz das, was beschrieben. 49 00:03:07,700 --> 00:03:11,170 Und lassen Sie mich versuchen, eine andere Audio-Anschluss hier und sehen, ob wir nicht 50 00:03:11,170 --> 00:03:13,780 halten Sie die Audio synchron dieser Zeit. 51 00:03:13,780 --> 00:03:20,530 Gebe ich euch "Numbers". 52 00:03:20,530 --> 00:03:23,240 >> [Man # 1] Es ist ein 32-Bit-IPv4-Adresse. 53 00:03:23,240 --> 00:03:38,930 [Man # 2] IP, das ist das Internet. >> Private Netzwerk. Es ist Anita privaten Netzwerk. 54 00:03:38,930 --> 00:03:43,810 [Malan] Okay. Dies ist Objective-C, und es ist für einige Kinder-Färbung Programm 55 00:03:43,810 --> 00:03:51,140 wie man vielleicht aus dem Namen der Variablen gibt abzuleiten. 56 00:03:51,140 --> 00:03:54,410 Damit war dann "Numbers". Also heute und in dieser Woche stellen wir 57 00:03:54,410 --> 00:03:57,740 ein wenig in die Welt der Forensik und dem Kontext, in den Problemen daher. 58 00:03:57,740 --> 00:04:00,590 Heute wird eine gekürzte Vortrages sein, weil es ein besonderes Ereignis hier 59 00:04:00,590 --> 00:04:05,530 danach, so nehmen wir einen Blick, und necken sowohl Studenten und Eltern gleichermaßen heute 60 00:04:05,530 --> 00:04:07,420 mit einigen der Dinge, die am Horizont. 61 00:04:07,420 --> 00:04:12,240 Unter ihnen ab Montag, haben Sie noch ein paar Klassenkameraden. 62 00:04:12,240 --> 00:04:16,050 EdX, Harvard und MITs neue Online-Initiative für Open Courseware 63 00:04:16,050 --> 00:04:19,120 und mehr, auf Harvard-Campus startet am Montag. 64 00:04:19,120 --> 00:04:21,490 Was bedeutet, kommen Montag haben Sie - wie der letzten Zählung 65 00:04:21,490 --> 00:04:26,210 86.000 zusätzliche Klassenkameraden folgen werden zusammen mit CS50 Vorlesungen 66 00:04:26,210 --> 00:04:29,170 und Abschnitte und Komplettlösungen und Problem-Sets. 67 00:04:29,170 --> 00:04:32,350 Und als Teil dieser, werden Sie Mitglied der konstituierenden Klasse geworden 68 00:04:32,350 --> 00:04:35,090 CS50 und jetzt CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Als Teil dieser, jetzt erkennen, dass es einige upsides als gut. 70 00:04:39,310 --> 00:04:43,790 Um bereit für diese, für die große Anzahl von Studenten, 71 00:04:43,790 --> 00:04:47,180 es genügt zu sagen, dass, obwohl wir 108 TFs und CAs 72 00:04:47,180 --> 00:04:50,790 nicht ganz der beste Schüler / Lehrer-Verhältnis, wenn wir 80.000 anderen Studenten getroffen. 73 00:04:50,790 --> 00:04:52,850 So werden wir nicht zu einem Gehalt so viele Probleme setzt manuell. 74 00:04:52,850 --> 00:04:55,920 So führte in dieser Woche das Problem Set wird CS50 prüfen sein, 75 00:04:55,920 --> 00:04:58,450 was wird ein Kommandozeilenprogramm innerhalb des Gerätes 76 00:04:58,450 --> 00:05:01,200 dass Sie bekommen, wenn Sie es später aktualisieren an diesem Wochenende, 77 00:05:01,200 --> 00:05:03,200 und du wirst in der Lage sein, einen Befehl auszuführen, überprüfen 50, 78 00:05:03,200 --> 00:05:06,500 auf Ihrem eigenen pset, und du wirst ein Feedback, ob Ihr Programm zu bekommen 79 00:05:06,500 --> 00:05:11,160 richtig oder falsch nach verschiedenen Design-Spezifikationen, die wir zur Verfügung gestellt haben. 80 00:05:11,160 --> 00:05:13,580 So mehr dazu und das Problem Satz Spezifikation und 81 00:05:13,580 --> 00:05:17,240 die CS50x Klassenkameraden verwenden werden diese als gut. 82 00:05:17,240 --> 00:05:19,230 >> So Problem Satz 4 dreht sich alles um Forensik. 83 00:05:19,230 --> 00:05:21,940 Und dieses Stück wurde von einigen realen Sachen inspiriert, 84 00:05:21,940 --> 00:05:24,620 wodurch dann, wenn ich in Graduiertenschule war, interniert ich für eine Weile mit 85 00:05:24,620 --> 00:05:28,650 des Middlesex County District Attorney Büro zu tun forensische Arbeit 86 00:05:28,650 --> 00:05:31,650 mit ihren Blei Forensiker, und was diese beliefen sich auf 87 00:05:31,650 --> 00:05:35,260 ist, ich glaube, ich erwähnte ein paar Wochen in der Vergangenheit wird die Masse Staatspolizei oder andere 88 00:05:35,260 --> 00:05:39,000 würde kommen, würden sie Drop-off Dinge wie Festplatten und CDs und Disketten 89 00:05:39,000 --> 00:05:42,340 und dergleichen, und dann wird das Ziel der Forensik Büro war zu prüfen, ob 90 00:05:42,340 --> 00:05:44,600 es war oder nicht Beweise einiger sortieren. 91 00:05:44,600 --> 00:05:48,010 Dies war der Special Investigations Unit, so war es von Wirtschaftskriminalität, 92 00:05:48,010 --> 00:05:52,350 es war mehr beunruhigende Art von Verbrechen, 93 00:05:52,350 --> 00:05:55,990 alles was mit irgendeine Art von digitalen Medien; sich heraus, dass nicht so viele Leute 94 00:05:55,990 --> 00:05:59,370 schreiben Sie uns eine E-Mail sagen "Ich habe es getan." 95 00:05:59,370 --> 00:06:03,290 So oft diese Forensik Suchbegriffe nicht auftauchen, dass alle viel Obst, 96 00:06:03,290 --> 00:06:05,850 aber manchmal Leute schreiben würden solche E-Mails. 97 00:06:05,850 --> 00:06:08,490 Also manchmal die Bemühungen wurden belohnt. 98 00:06:08,490 --> 00:06:14,420 >> Aber zu führen bis zu diesem forensischen pset, werden wir in pset 4 ein wenig von Grafiken vorstellen. 99 00:06:14,420 --> 00:06:18,260 So dass Sie wahrscheinlich nehmen diese Dinge für selbstverständlich, JPEGs, GIFs und wie in diesen Tagen, 100 00:06:18,260 --> 00:06:21,640 aber wenn du wirklich darüber nachdenken, ein Bild, ähnlich wie Rob Gesicht, 101 00:06:21,640 --> 00:06:24,430 konnte als eine Sequenz von Punkten oder Pixeln modelliert werden. 102 00:06:24,430 --> 00:06:26,680 Nun bei Rob Gesicht, gibt es alle Arten von Farben, 103 00:06:26,680 --> 00:06:29,940 und wir begannen, die einzelnen Punkte, otherwide als Pixel bekannt zu sehen, 104 00:06:29,940 --> 00:06:31,610 sobald wir angefangen zu vergrößern in. 105 00:06:31,610 --> 00:06:35,590 Aber wenn wir zu vereinfachen, die Welt ein wenig, und nur sagen, dass dies hier Rob ist 106 00:06:35,590 --> 00:06:40,560 in schwarz und weiß, gut, zur Darstellung von Schwarz und Weiß können wir einfach binär. 107 00:06:40,560 --> 00:06:44,960 Und wenn wir gehen, um binäre verwenden, 1 oder 0, können wir ausdrücken dieses gleiche Bild 108 00:06:44,960 --> 00:06:51,970 der lächelnde Gesicht Robs mit diesem Muster der Bits: 11000011 stellt 109 00:06:51,970 --> 00:06:55,160 weiß, weiß, schwarz, schwarz, schwarz, schwarz, weiß weiß. 110 00:06:55,160 --> 00:06:59,290 Und so ist es nicht ein großer Sprung, dann darüber zu sprechen bunte Fotografien. 111 00:06:59,290 --> 00:07:01,920 Dinge, die man auf Facebook sehen oder mit einer Digitalkamera würde, 112 00:07:01,920 --> 00:07:04,730 aber, natürlich, wenn es um Farben geht, brauchen Sie mehr Bits. 113 00:07:04,730 --> 00:07:08,470 Und recht häufig in der Welt der Fotos ist nicht 1-Bit-Farbe zu verwenden, 114 00:07:08,470 --> 00:07:12,730 da dies nahe legt, aber. 24-Bit-Farbe, wo Sie tatsächlich Millionen von Farben 115 00:07:12,730 --> 00:07:15,430 So wie in dem Fall, wenn wir uns auf Rob Auge gezoomt, 116 00:07:15,430 --> 00:07:19,270 das war eine beliebige Anzahl von Millionen von verschiedenen bunten Möglichkeiten. 117 00:07:19,270 --> 00:07:22,260 >> Also werden wir dies Problem Satz 4 sowie in der exemplarischen Vorgehensweise einzuführen, 118 00:07:22,260 --> 00:07:27,050 die wird heute um 3:30 Uhr statt der üblichen 02.30 aufgrund Freitag Vortrag hier. 119 00:07:27,050 --> 00:07:29,930 Aber das Video online sein wird, wie üblich, morgen. 120 00:07:29,930 --> 00:07:31,880 Wir werden auch eine Einführung in ein anderes Dateiformat. 121 00:07:31,880 --> 00:07:34,150 Also das ist absichtlich soll auf den ersten Blick einschüchternd, 122 00:07:34,150 --> 00:07:38,980 aber das ist nur Teil der Dokumentation für eine C-Struktur. 123 00:07:38,980 --> 00:07:42,280 Es stellt sich heraus, dass Microsoft vor Jahren geholfen zu popularisieren dieses Format, 124 00:07:42,280 --> 00:07:46,630 als die Bitmap-Datei-Format, BMP, und dies war ein super-einfach, 125 00:07:46,630 --> 00:07:50,390 bunten grafischen Dateiformat, das seit geraumer Zeit verwendet wurde 126 00:07:50,390 --> 00:07:53,640 und manchmal noch für Tapeten auf Desktops. 127 00:07:53,640 --> 00:07:57,410 Wenn Sie glauben, zurück zu Windows XP und die sanften Hügel und blauer Himmel, 128 00:07:57,410 --> 00:08:00,660 das war in der Regel ein BMP-oder Bitmap-Bild, und Bitmaps 129 00:08:00,660 --> 00:08:03,340 sind ein Spaß für uns, weil sie ein bisschen mehr Komplexität zu haben. 130 00:08:03,340 --> 00:08:05,640 Es ist nicht ganz so einfach, wie dieses Raster von 0 und 1 ist; 131 00:08:05,640 --> 00:08:10,680 Stattdessen müssen Sie Dinge wie ein Header am Anfang einer Datei. 132 00:08:10,680 --> 00:08:15,520 Also mit anderen Worten, in einem. Bmp-Datei ist eine ganze Reihe von 0 und 1 ist, 133 00:08:15,520 --> 00:08:18,070 aber es gibt einige zusätzliche 0 und 1 ist drin. 134 00:08:18,070 --> 00:08:21,450 Und es stellt sich heraus, dass das, was wir haben wahrscheinlich gemacht für für Jahr gewährt, 135 00:08:21,450 --> 00:08:27,040 Dateiformate wie. doc oder. xls oder. mp3 oder. mp4, 136 00:08:27,040 --> 00:08:29,910 unabhängig von den Dateiformaten, die Sie vertraut sind. 137 00:08:29,910 --> 00:08:31,900 Nun, was macht es sogar bedeuten, ein Dateiformat? 138 00:08:31,900 --> 00:08:35,740 Denn am Ende des Tages haben alle diese Dateien verwenden wir nur 0 und 1 ist 139 00:08:35,740 --> 00:08:39,950 und vielleicht die 0en und 1en repräsentieren a, b, c, bis ASCII oder dergleichen, 140 00:08:39,950 --> 00:08:42,030 aber bis zum Ende des Tages ist es nur 0 und 1 ist. 141 00:08:42,030 --> 00:08:45,300 >> So Mensch nur gelegentlich entscheiden, ein neues Dateiformat erfinden 142 00:08:45,300 --> 00:08:49,420 wo sie zu standardisieren, was Abfolgen von Bits wird eigentlich bedeuten. 143 00:08:49,420 --> 00:08:52,790 Und in diesem Fall hier, die Leute, die konzipiert die Bitmap-Datei-Format 144 00:08:52,790 --> 00:08:58,260 sagte, dass bei der ersten Byte in einer Bitmap-Datei, wie Offset 0 bezeichnet, da 145 00:08:58,260 --> 00:09:02,320 es geht um einige kryptisch benannten Variable namens bfType sein, 146 00:09:02,320 --> 00:09:06,510 das steht nur für Bitmap-Datei-Typ; welche Art von Bitmap-Datei ist. 147 00:09:06,510 --> 00:09:10,780 Sie entnehmen kann, vielleicht aus der zweiten Reihe, dass 2 versetzt, Byte Zahl 2, 148 00:09:10,780 --> 00:09:15,980 ein Muster von 0 und 1 ist, was darstellt? 149 00:09:15,980 --> 00:09:18,320 Die Größe von etwas, und es geht von dort. 150 00:09:18,320 --> 00:09:20,660 Also Problem Satz 4, werden Sie durch einige dieser Dinge begangen werden. 151 00:09:20,660 --> 00:09:24,480 >> Wir werden am Ende nicht die Sorge um alle von ihnen, aber merkt es beginnt, interessant zu 152 00:09:24,480 --> 00:09:30,780 um Zeile oder Byte 54, rgbtBlue, grün und rot. 153 00:09:30,780 --> 00:09:35,280 Wenn Sie jemals die Abkürzung RGB, rot, grün, blau gehört habe, ist dies ein Verweis darauf. 154 00:09:35,280 --> 00:09:37,840 Da es sich herausstellt, können Sie malen alle Farben des Regenbogens 155 00:09:37,840 --> 00:09:41,580 mit einer Kombination aus rot und blau und grün. 156 00:09:41,580 --> 00:09:46,560 Und in der Tat, könnten die Eltern im Zimmer erinnern an einige der frühesten Projektoren. 157 00:09:46,560 --> 00:09:49,360 In diesen Tagen, die Sie gerade sehen 1 helles Licht aus einer Linse. 158 00:09:49,360 --> 00:09:52,870 Aber zurück in den Tag, musste man die rote Linse, die blaue Linse, und die grüne Linse 159 00:09:52,870 --> 00:09:56,620 und gemeinsam ausgerichtet auf den Bildschirm und bildeten ein buntes Bild. 160 00:09:56,620 --> 00:09:59,590 Und ziemlich oft Mittelschulen und Gymnasien müssten diese Objektive 161 00:09:59,590 --> 00:10:02,680 immer so leicht schräg, so dass Sie waren irgendwie sehen doppelt oder dreifach Bilder, 162 00:10:02,680 --> 00:10:07,500 aber das war die Idee. Sie hatten rote, grüne und blaue Licht ein Bild zu malen. 163 00:10:07,500 --> 00:10:09,570 Und das gleiche Prinzip wird bei Computern verwendet. 164 00:10:09,570 --> 00:10:12,000 >> So gehören zu den Herausforderungen, dann für Sie in Problem-Set 4 165 00:10:12,000 --> 00:10:16,080 gehen, um ein paar Dinge zu sein, man ist tatsächlich die Größe eines Bildes. 166 00:10:16,080 --> 00:10:18,050 Um in einem Muster von 0en und 1en nehmen, 167 00:10:18,050 --> 00:10:22,840 herauszufinden, welche Brocken von 0 und 1 ist, was in einer Struktur wie folgt darstellen, 168 00:10:22,840 --> 00:10:26,800 und dann herausfinden, wie man die Pixel replizieren: die Rotweine, die Blues, die Grüns 169 00:10:26,800 --> 00:10:32,460 innen, so dass, wenn ein Bild so aussieht anfangs könnte wie folgt statt zu suchen danach. 170 00:10:32,460 --> 00:10:35,590 Zu den weiteren Herausforderungen auch sein wird, dass Sie übergeben werde 171 00:10:35,590 --> 00:10:38,900 eine forensische der eigentlichen Datei von einer Digitalkamera 172 00:10:38,900 --> 00:10:42,410 und auf dieser Kamera, einmal eine Zeit, da waren eine ganze Reihe von Fotos. 173 00:10:42,410 --> 00:10:47,030 Das Problem ist, wir versehentlich gelöscht oder hatten das Bild verfälscht irgendwie. 174 00:10:47,030 --> 00:10:51,040 Bad Dinge mit digitalen Kameras geschehen, und so haben wir schnell alle 0 und 1 ist kopiert 175 00:10:51,040 --> 00:10:55,410 Aus dieser Karte für Sie, rettete sie alle in 1 große Datei, und dann werden wir sie Ihnen übergeben 176 00:10:55,410 --> 00:11:00,000 in Problem-Set 4, so dass Sie ein Programm in C, mit denen sich zu erholen schreiben können 177 00:11:00,000 --> 00:11:02,660 all diese JPEGs, ideal. 178 00:11:02,660 --> 00:11:06,280 Und es stellt sich heraus, dass die JPEGs, obwohl sie etwas von einem komplexen Dateiformat sind, 179 00:11:06,280 --> 00:11:09,580 sie sind viel komplexer als dieses lächelnde Gesicht hier. 180 00:11:09,580 --> 00:11:14,320 Es stellt sich heraus, dass jeder JPEG mit den gleichen Mustern von 0 und 1 ist gestartet. 181 00:11:14,320 --> 00:11:18,820 Also mit einer while-Schleife oder eine for-Schleife oder ähnliches, 182 00:11:18,820 --> 00:11:22,350 Sie können über alle 0 und 1 ist in diesem forensische iterieren 183 00:11:22,350 --> 00:11:26,670 und jedes Mal, wenn Sie das spezielle Muster, die in der Problem-Satzes Spezifikation definiert ist, 184 00:11:26,670 --> 00:11:29,770 Sie können davon ausgehen, 'Oh, hier ist mit sehr hoher Wahrscheinlichkeit 185 00:11:29,770 --> 00:11:33,520 der Beginn einer JPEG "und sobald Sie das gleiche Muster, 186 00:11:33,520 --> 00:11:36,050 eine gewisse Anzahl von Bytes oder Kilobyte oder Megabyte später 187 00:11:36,050 --> 00:11:40,550 Sie können davon ausgehen, "Ooh! Hier ist eine zweite JPEG, das Foto habe ich nach dem ersten stattfand. 188 00:11:40,550 --> 00:11:44,720 Lassen Sie mich aufhören zu lesen, dass die erste Datei, mit dem Schreiben beginnen dieses neue ein. " 189 00:11:44,720 --> 00:11:49,980 Und der Ausgang eines Programms zur pset 4 wird so viele wie 50 JPEG. 190 00:11:49,980 --> 00:11:52,400 Und wenn es nicht 50 JPEGs, müssen Sie ein bisschen einer Schleife. 191 00:11:52,400 --> 00:11:55,580 Wenn Sie eine unendliche Anzahl von JPEGs haben, haben Sie eine Endlosschleife. 192 00:11:55,580 --> 00:11:58,280 So, dass wird auch ein ganz gewöhnlicher Fall sein. 193 00:11:58,280 --> 00:12:00,280 Das ist, was am Horizont. 194 00:12:00,280 --> 00:12:03,740 >> Quiz 0, hinter uns. Erkenne, pro meine E-Mail, das immer da ist folks 195 00:12:03,740 --> 00:12:06,820 wer sind beide glücklich, irgendwie neutral, traurig und rund Quiz 0 mal. 196 00:12:06,820 --> 00:12:10,160 Und bitte erreichen, um mich, der Kopf TFs, Zamyla, Ihr eigenes TF 197 00:12:10,160 --> 00:12:14,120 oder eine der CAs, die Sie, wenn Sie möchten, zu diskutieren, wie es ging kennen. 198 00:12:14,120 --> 00:12:16,460 >> So um die Eltern hier beeindrucken im Zimmer, 199 00:12:16,460 --> 00:12:23,990 was ist der CS50-Bibliothek? Good job. 200 00:12:23,990 --> 00:12:32,280 Was ist der CS50-Bibliothek? Yeah? [Schüler Antworten unverständlich] 201 00:12:32,280 --> 00:12:35,730 >> Okay, gut. Also ist es eine vordefinierte Reihe von Code, den wir, das Personal, schrieb 202 00:12:35,730 --> 00:12:38,460 bieten wir zu Ihnen, um einige gemeinsame Funktionalitäten bieten. 203 00:12:38,460 --> 00:12:42,290 Sachen wie mir ein String, machen Sie mir ein int, alle Funktionen, die hier aufgelistet sind. 204 00:12:42,290 --> 00:12:45,260 Ab sofort beginnen wir wirklich diese Stützräder aus. 205 00:12:45,260 --> 00:12:48,230 Also werden wir anfangen zu nehmen, einen "string" von Ihnen, 206 00:12:48,230 --> 00:12:52,790 die, Rückruf, war nur ein Synonym für das, was tatsächliche Datentyp? char *. 207 00:12:52,790 --> 00:12:57,020 So für die Eltern, das war wohl - das ist gut, so char * wir anfangen zu sehen, 208 00:12:57,020 --> 00:13:00,810 auf dem Bildschirm umso mehr, als wir "string" zu entfernen aus unserem Wortschatz, 209 00:13:00,810 --> 00:13:02,760 zumindest wenn es darum geht, tatsächlich das Schreiben von Code. 210 00:13:02,760 --> 00:13:06,240 Ebenso werden wir aufhören, einige dieser Funktionen so viel, 211 00:13:06,240 --> 00:13:08,390 weil unsere Programme werden, um komplexere 212 00:13:08,390 --> 00:13:11,370 anstatt nur Programme schreiben, die dort sitzen mit einem Prompt blinkt, 213 00:13:11,370 --> 00:13:13,580 Warten auf den Benutzer, was rein geben 214 00:13:13,580 --> 00:13:15,220 Sie Ihre Eingaben von anderswo zu bekommen. 215 00:13:15,220 --> 00:13:18,720 Zum Beispiel werden Sie sie aus einer Reihe von Bits auf der lokalen Festplatte zu bekommen. 216 00:13:18,720 --> 00:13:23,340 Sie stattdessen bekommen sie in Zukunft von einer Netzwerkverbindung, einige Website irgendwo. 217 00:13:23,340 --> 00:13:27,460 Also lasst uns abziehen dieser Schicht zum ersten Mal, und ziehen Sie den CS50 Appliance 218 00:13:27,460 --> 00:13:32,300 und diese Datei mit dem Namen CS50.h, die Sie schon scharfe habe auch für Wochen. 219 00:13:32,300 --> 00:13:34,380 >> Aber lassen Sie tatsächlich sehen, was drin ist dafür. 220 00:13:34,380 --> 00:13:38,250 Also das Anfang der Datei in blau ist nur eine ganze Reihe von Kommentaren, 221 00:13:38,250 --> 00:13:41,340 Informationen zur Garantie und Lizenzierung. Dies ist eine Art gemeinsames Paradigma 222 00:13:41,340 --> 00:13:44,600 in der Software, weil eine Menge von Software in diesen Tagen ist, was heißt "Open Source" 223 00:13:44,600 --> 00:13:46,940 was bedeutet, dass jemand den Code geschrieben 224 00:13:46,940 --> 00:13:50,060 und machte es frei verfügbar ist, nicht nur zu laufen und zu verwenden, 225 00:13:50,060 --> 00:13:53,660 aber eigentlich lesen und zu verändern und zu integrieren in Ihre eigene Arbeit. 226 00:13:53,660 --> 00:13:55,790 Also das ist, was Sie bisher über Open-Source-Software, 227 00:13:55,790 --> 00:13:58,030 wenn auch in sehr kleine Form. 228 00:13:58,030 --> 00:14:01,860 Wenn ich mich an den Kommentaren zu blättern, aber wir beginnen, einige weitere vertraute Dinge zu sehen. 229 00:14:01,860 --> 00:14:08,090 So an der Spitze hier zu bemerken, dass die CS50.h-Datei eine ganze Reihe von Header-Dateien enthält. 230 00:14:08,090 --> 00:14:11,160 Nun, die meisten von ihnen haben wir nicht gesehen, aber man ist 231 00:14:11,160 --> 00:14:15,640 vertraut; die von ihnen haben wir gesehen, wenn auch nur kurz, so weit? 232 00:14:15,640 --> 00:14:18,720 Yeah, Standard-Bibliotheken. Stdlib.h hat malloc, 233 00:14:18,720 --> 00:14:21,590 so, wenn wir kamen ins Gespräch über die dynamische Speicherzuweisung, 234 00:14:21,590 --> 00:14:24,960 welche wir kommen zurück, um nächste Woche sowie begannen wir mit dieser Datei. 235 00:14:24,960 --> 00:14:29,660 Es stellt sich heraus, dass bool und wahr und falsch nicht wirklich in C existieren, per se, 236 00:14:29,660 --> 00:14:32,460 es sei denn, Sie gehören diese Datei hier. 237 00:14:32,460 --> 00:14:35,770 So haben wir, seit Wochen, wurde einschließlich Standard bool.h 238 00:14:35,770 --> 00:14:39,020 so dass man mit dem Begriff des a bool, true oder false. 239 00:14:39,020 --> 00:14:41,830 Ohne diese müsste man von gefälschten zu sortieren und verwenden Sie ein int 240 00:14:41,830 --> 00:14:45,920 und nur willkürlich annehmen, dass 0 falsch ist und 1 wahr ist. 241 00:14:45,920 --> 00:14:49,980 >> Nun, wenn wir nach unten scrollen weiter, hier ist unsere Definition einer Zeichenkette. 242 00:14:49,980 --> 00:14:54,820 Es stellt sich heraus, wie wir schon gesagt, dass dort, wo das * ist nicht wirklich wichtig. 243 00:14:54,820 --> 00:14:56,750 Sie können sogar Platz rundherum. 244 00:14:56,750 --> 00:15:01,550 Wir, in diesem Semester, wurden fördern, da dies deutlich zu machen, dass die * mit der Art zu tun hat. 245 00:15:01,550 --> 00:15:05,370 Aber klar, wie üblich, wenn nicht ein wenig mehr üblich, ist sie dort einführen 246 00:15:05,370 --> 00:15:07,480 aber funktional ist es das Gleiche. 247 00:15:07,480 --> 00:15:11,070 Aber jetzt, wenn wir weiter nach unten zu lesen, lassen Sie uns einen Blick auf Mitsprache, GetInt, 248 00:15:11,070 --> 00:15:15,350 weil wir verwendet, dass vielleicht vor allem anderen in diesem Semester. 249 00:15:15,350 --> 00:15:19,620 Und hier ist GetInt. Dies ist, was? 250 00:15:19,620 --> 00:15:24,650 Dies ist der Prototyp. So oft haben wir Prototypen an den Spitzen unserer setzen. C Dateien, 251 00:15:24,650 --> 00:15:28,190 aber du kannst auch Prototypen in Header-Dateien,. h-Dateien, 252 00:15:28,190 --> 00:15:32,110 wie dieser hier, so dass, wenn Sie schreiben, sind einige Funktionen 253 00:15:32,110 --> 00:15:36,790 dass Sie andere Menschen in der Lage sein zu verwenden wollen, ist das genau der Fall mit der CS50-Bibliothek, 254 00:15:36,790 --> 00:15:40,900 Sie nicht nur die Umsetzung Ihrer Funktionen in so etwas wie CS50.c, 255 00:15:40,900 --> 00:15:46,720 Sie auch setzen die Prototypen nicht an der Spitze dieser Datei, aber an der Spitze einer Header-Datei, 256 00:15:46,720 --> 00:15:50,810 dann, dass Header-Datei ist, was Freunde und Kollegen gehören, 257 00:15:50,810 --> 00:15:52,800 mit scharfen im eigenen Code enthalten. 258 00:15:52,800 --> 00:15:55,440 Also alles dieser Zeit habe auch alle diese Prototypen 259 00:15:55,440 --> 00:15:59,870 effektiv bei der Anfang der Datei, sondern durch diese scharfe Include-Mechanismus 260 00:15:59,870 --> 00:16:03,320 dass im Wesentlichen Kopien und Pasten diese Datei in Ihre eigenen. 261 00:16:03,320 --> 00:16:06,400 Nun, hier ist einige ziemlich detaillierte Dokumentation. 262 00:16:06,400 --> 00:16:08,880 >> Wir haben ziemlich viel für selbstverständlich, dass GetInt einen int bekommt, 263 00:16:08,880 --> 00:16:10,740 aber es stellt sich heraus, es gibt einige Grenzfälle, nicht wahr? 264 00:16:10,740 --> 00:16:14,320 Was, wenn der Benutzer in einer Zahl, die viel zu groß ist? 265 00:16:14,320 --> 00:16:17,350 Eine Trillionen, die einfach nicht innerhalb eines int passen? 266 00:16:17,350 --> 00:16:21,180 Was ist das erwartete Verhalten? Nun, im Idealfall ist es vorhersehbar. 267 00:16:21,180 --> 00:16:23,460 Also in diesem Fall, wenn Sie tatsächlich das Kleingedruckte lesen, 268 00:16:23,460 --> 00:16:27,850 Sie sehen, dass, wenn die Leitung nicht gelesen werden kann, diese Renditen INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Wir haben nie darüber gesprochen, aber auf der Grundlage ihrer Kapitalisierung, 270 00:16:30,800 --> 00:16:33,030 was ist es, wahrscheinlich? 271 00:16:33,030 --> 00:16:36,610 Es ist eine Konstante, so dass es einige spezielle Konstante, die wahrscheinlich deklariert ist 272 00:16:36,610 --> 00:16:39,460 in einem dieser Header-Dateien, die sich höher ist in der Datei 273 00:16:39,460 --> 00:16:43,400 und INT_MAX ist wahrscheinlich so etwas wie, grob, 2 Milliarden Euro. 274 00:16:43,400 --> 00:16:48,160 Die Idee ist, dass, weil wir irgendwie bedeuten, dass etwas brauchen schief ging, 275 00:16:48,160 --> 00:16:51,090 wir, ja, 4 Mrd. Zahlen zur Verfügung, 276 00:16:51,090 --> 00:16:53,980 negativen 2 Mrd. auf bis zu 2 Mrd., geben oder nehmen. 277 00:16:53,980 --> 00:16:58,030 Nun, was ist üblich in der Programmierung Sie stehlen nur eine von diesen Zahlen. 278 00:16:58,030 --> 00:17:02,250 Maybe 0, vielleicht 2 Milliarden, vielleicht negativ 2 Milliarden Euro. 279 00:17:02,250 --> 00:17:06,720 So verbringen Sie einen Ihrer möglichen Werte, so dass Sie in die Welt begehen kann 280 00:17:06,720 --> 00:17:10,089 dass, wenn etwas schief geht, werde ich zurückkehren diesen super-großen Wert. 281 00:17:10,089 --> 00:17:13,329 Aber Sie wollen nicht der Benutzer Eingabe etwas kryptisch wie "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 der wirklich große Zahl, wo man statt zu verallgemeinern als Konstante. 283 00:17:17,079 --> 00:17:19,380 Also wirklich, wenn Sie wurden anal in den letzten Wochen, 284 00:17:19,380 --> 00:17:23,800 wann immer Sie GetInt anrufen, sollten Sie mit einer if-Bedingung wurden überprüft. 285 00:17:23,800 --> 00:17:27,109 Haben die Benutzer in INT_MAX, oder genauer gesagt, 286 00:17:27,109 --> 00:17:29,900 hat GetInt Rückkehr INT_MAX? Denn wenn es tat, 287 00:17:29,900 --> 00:17:35,140 das tatsächlich bedeutet, dass sie nicht geben Sie es, etwas ging in diesem Fall falsch. 288 00:17:35,140 --> 00:17:38,970 Also das ist, was im Allgemeinen als "Sentinel"-Wert, bedeutet nur spezielle bekannt. 289 00:17:38,970 --> 00:17:41,020 >> Nun, lassen Sie uns nun in den. C Dateien umzuwandeln. 290 00:17:41,020 --> 00:17:44,500 Die C-Datei ist in das Gerät für einige Zeit bestanden, 291 00:17:44,500 --> 00:17:47,540 und in der Tat ist das Gerät es vorkompilierte für Sie 292 00:17:47,540 --> 00:17:49,720 in diese Sache, die wir als "Objekt-Code" 293 00:17:49,720 --> 00:17:52,940 aber es ist einfach nicht zu Ihnen egal, wo es, weil das System weiß, ist, 294 00:17:52,940 --> 00:17:54,780 in diesem Fall, wo es ist, das Gerät. 295 00:17:54,780 --> 00:18:00,620 Aber lasst uns nach unten scrollen nun GetInt und sehen, wie GetInt gearbeitet hat die ganze Zeit. 296 00:18:00,620 --> 00:18:02,380 Also hier haben wir ähnliche Kommentare von früher. 297 00:18:02,380 --> 00:18:04,930 Lassen Sie mich vergrößern nur auf die Codeteil, 298 00:18:04,930 --> 00:18:07,410 und was haben wir für GetInt ist die folgende. 299 00:18:07,410 --> 00:18:12,770 Es dauert keine Eingabe, und es gibt einen int, while (true), so dass wir eine bewusste Endlosschleife haben 300 00:18:12,770 --> 00:18:16,560 aber vermutlich werden wir brechen aus dieser irgendwie, oder wieder aus diesem. 301 00:18:16,560 --> 00:18:19,890 Also mal sehen, wie das funktioniert. Nun scheinen wir zu sein mit GetString 302 00:18:19,890 --> 00:18:22,550 in dieser ersten Zeile in der Schleife, 166. 303 00:18:22,550 --> 00:18:25,320 Das ist jetzt eine gute Praxis, weil unter welchen Umständen 304 00:18:25,320 --> 00:18:30,820 könnte GetString zurücksenden spezielles Schlüsselwort, NULL? 305 00:18:30,820 --> 00:18:38,460 Wenn etwas schief geht. Was könnte schief gehen, wenn Sie so etwas wie GetString nennen? 306 00:18:38,460 --> 00:18:42,550 Yeah? [Schüler Antwort unverständlich] >> Ja. Also vielleicht malloc fehlschlägt. 307 00:18:42,550 --> 00:18:45,310 Irgendwo unter der Haube GetString ruft malloc, 308 00:18:45,310 --> 00:18:48,210 die Speicher zuweist, was können Sie den Computer Shop 309 00:18:48,210 --> 00:18:50,950 alle Zeichen, die der Benutzer in die Tastatur-Typen. 310 00:18:50,950 --> 00:18:53,270 Und angenommen, der Benutzer hatte eine ganze Menge freie Zeit 311 00:18:53,270 --> 00:18:56,470 und mehr, zum Beispiel als 2 Milliarden Zeichen eingegeben. 312 00:18:56,470 --> 00:18:59,600 Mehr Zeichen als der Computer hat sogar RAM. 313 00:18:59,600 --> 00:19:02,350 Nun, GetString zu können, dass Sie bedeuten, 314 00:19:02,350 --> 00:19:05,650 auch wenn dies ist ein super, super selten Ecke Fall. 315 00:19:05,650 --> 00:19:08,490 Es muss irgendwie in der Lage sein, dies zu umgehen, und so GetString, 316 00:19:08,490 --> 00:19:11,850 wenn wir gehen zurück und lesen Sie die Dokumentation, ist in der Tat, NULL zurück. 317 00:19:11,850 --> 00:19:16,150 Nun, wenn GetString durch Rücksendung NULL fehlschlägt, wird GetInt zum Scheitern verurteilt 318 00:19:16,150 --> 00:19:19,370 durch Rücksendung INT_MAX, wie ein Wächter. 319 00:19:19,370 --> 00:19:22,650 Dies sind nur menschliche Konventionen. Der einzige Weg, dies zu wissen, würde der Fall ist 320 00:19:22,650 --> 00:19:24,840 wird durch das Lesen der Dokumentation. 321 00:19:24,840 --> 00:19:28,200 Also lasst uns nach unten scrollen, wo die int ist eigentlich GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Also, wenn ich mich ein bisschen weiter zu blättern, in Zeile 170 haben wir einen Kommentar über diesen Linien. 323 00:19:34,220 --> 00:19:38,470 So erklären wir, in 172, ein int n und ein char c, und dann diese neue Funktion 324 00:19:38,470 --> 00:19:41,870 die einige von Ihnen haben über, bevor gestolpert, aber sscanf. 325 00:19:41,870 --> 00:19:44,190 Dies steht für String-Scan f. 326 00:19:44,190 --> 00:19:48,580 In anderen Worten, gib mir einen String und ich werde es für Stücke von Informationen von Interesse zu scannen. 327 00:19:48,580 --> 00:19:53,820 Also, was bedeutet das? Nun wird angenommen, dass ich in buchstäblich 1 2 3 Geben Sie über die Tastatur, 328 00:19:53,820 --> 00:19:59,730 und dann drücken Sie Enter. Was ist der Datentyp 1 2 3, wenn sie von GetString zurückgekehrt? 329 00:19:59,730 --> 00:20:05,010 Es ist offensichtlich ein String, nicht wahr? Ich habe einen String, so 1 2 3 ist wirklich "1 2 3" 330 00:20:05,010 --> 00:20:07,260 mit dem \ 0 am Ende. Das ist nicht ein int. 331 00:20:07,260 --> 00:20:10,420 Das ist nicht eine Nummer. Es sieht aus wie eine Zahl, aber es ist nicht wirklich. 332 00:20:10,420 --> 00:20:14,680 Also, was bedeutet GetInt zu tun haben? Es muss die Zeichenfolge links nach rechts zu scannen, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, und irgendwie konvertieren Sie sie in einer tatsächlichen integer. 334 00:20:19,010 --> 00:20:21,010 Jetzt könntest du herausfinden, wie dies zu tun. 335 00:20:21,010 --> 00:20:24,240 Wenn Sie zurück zu pset 2 denken, Sie vermutlich habe ein wenig komfortabler 336 00:20:24,240 --> 00:20:26,810 mit Caesar oder Vigenere so können Sie durchlaufen einen String, 337 00:20:26,810 --> 00:20:29,800 Sie können Zeichen auf ints mit Pick zu konvertieren. Das ist eine ganze Menge Arbeit. 338 00:20:29,800 --> 00:20:32,800 Warum nicht eine Funktion aufrufen, wie sscanf, die das tut für dich? 339 00:20:32,800 --> 00:20:37,520 So sscanf erwartet ein Argument, in diesem Fall als Linie, die ein String ist. 340 00:20:37,520 --> 00:20:41,310 Dann geben Sie, in Anführungszeichen, sehr ähnlich printf, 341 00:20:41,310 --> 00:20:44,960 Was erwarten Sie in dieser Zeichenfolge sehen? 342 00:20:44,960 --> 00:20:52,980 Was ich hier sage, ist, erwarte ich eine Dezimalzahl und vielleicht ein Zeichen sehen. 343 00:20:52,980 --> 00:20:54,990 Und wir werden sehen, warum dies der Fall ist in nur einem Augenblick. 344 00:20:54,990 --> 00:20:58,440 Es stellt sich heraus, dass diese Notation ist jetzt erinnert Sachen 345 00:20:58,440 --> 00:21:00,840 Wir kamen ins Gespräch über etwas mehr als vor einer Woche. 346 00:21:00,840 --> 00:21:05,430 >> Was ist & n und & c zu tun für uns hier? [Schüler Antworten unverständlich] 347 00:21:05,430 --> 00:21:07,610 >> Ja. Es gibt mir die Adresse n und Anschrift des c. 348 00:21:07,610 --> 00:21:10,440 Nun, warum ist das wichtig? Nun, wissen Sie, dass mit Funktionen in C 349 00:21:10,440 --> 00:21:13,440 Sie können immer einen Wert zurückgeben oder überhaupt keinen Wert. 350 00:21:13,440 --> 00:21:16,630 Sie können zurückgeben int, einen String, einen Schwimmer, einen char, was auch immer. 351 00:21:16,630 --> 00:21:21,150 Oder Sie können void, aber Sie können nur 1 zurückgeben, was maximal. 352 00:21:21,150 --> 00:21:26,100 Aber hier wollen wir sscanf mir vielleicht wieder ein int, eine Dezimalzahl, 353 00:21:26,100 --> 00:21:29,240 und auch ein char, und ich werde, warum die Zeichen in einem Moment erklären. 354 00:21:29,240 --> 00:21:34,250 So Sie effektiv wollen f 2 Dinge zurück; das ist einfach nicht in C möglich 355 00:21:34,250 --> 00:21:38,460 So können Sie rund um das funktionieren, indem in 2 Adressen, 356 00:21:38,460 --> 00:21:43,710 denn sobald Sie eine Funktion übergeben 2 Adressen, was kann diese Funktion mit ihnen tun? 357 00:21:43,710 --> 00:21:49,880 Es kann an diese Adressen schreiben. Sie können die * Betriebs-und "go there" auf jede dieser Adressen. 358 00:21:49,880 --> 00:21:54,320 Es ist eine Art des Backdoor-Mechanismus, sondern sehr häufig zum Ändern der Werte der Variablen 359 00:21:54,320 --> 00:21:58,020 in mehr als nur ein Ort, in diesem Fall 2. 360 00:21:58,020 --> 00:22:04,590 Jetzt merke ich bin für == to1 Kontrolle, und dann wieder n, wenn das bedeutet in der Tat, zu true ausgewertet. 361 00:22:04,590 --> 00:22:09,340 Also, was ist los? Nun, technisch gesehen, ist alles, was wir wirklich wollen, in GetInt passiert dies. 362 00:22:09,340 --> 00:22:12,340 Wir wollen analysieren, so zu sprechen, sondern wir wollen die Zeichenfolge gelesen 363 00:22:12,340 --> 00:22:16,210 "1 2 3" und wenn es so aussieht, als gäbe es eine Reihe gibt, 364 00:22:16,210 --> 00:22:21,360 was wir sagen sscanf zu tun ist, setzen Sie diese Zahl, 1 2 3, in dieser Variable n für mich. 365 00:22:21,360 --> 00:22:26,060 Warum also hatte ich dies als gut? 366 00:22:26,060 --> 00:22:33,750 Was ist die Rolle der sagt auch, sscanf, könnte man auch einen Charakter hier. 367 00:22:33,750 --> 00:22:36,890 [Studenten gesprochen, unverständlich] >> Not - ein Dezimalpunkt funktionieren könnte. 368 00:22:36,890 --> 00:22:40,650 Halten wir, dass dachte einen Moment nach. Was sonst noch? 369 00:22:40,650 --> 00:22:42,570 [Student, unverständlich] >> Also, guten Gedanken, es könnte der NULL-Zeichen sein. 370 00:22:42,570 --> 00:22:44,970 Es ist eigentlich nicht in diesem Fall. Yeah? [Student, unverständlich] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Oder lassen Sie mich noch weiter zu verallgemeinern. 372 00:22:47,100 --> 00:22:49,670 Die% c gibt es nur für Fehlerprüfung. 373 00:22:49,670 --> 00:22:52,510 Wir haben dort nicht wollen Charakter nach der Zahl, 374 00:22:52,510 --> 00:22:54,980 aber was dies ermöglicht mir zu tun ist folgendes: 375 00:22:54,980 --> 00:23:01,270 Es stellt sich heraus, dass sscanf neben Speichern von Werten in n und c, in diesem Beispiel hier 376 00:23:01,270 --> 00:23:08,170 was es auch tut, ist es gibt die Anzahl der Variablen, die es genommen Werte in. 377 00:23:08,170 --> 00:23:13,330 Also, wenn Sie in 1 2 3 nur eingeben, dann wird nur die% d wird überein 378 00:23:13,330 --> 00:23:18,830 und nur n wird mit einem Wert wie 1 2 3 gespeichert und nichts geht in c setzen; 379 00:23:18,830 --> 00:23:20,870 c bleibt ein Müll-Wert, so zu sprechen. 380 00:23:20,870 --> 00:23:23,550 Garbage, weil es noch nie so einen gewissen Wert initialisiert wurde. 381 00:23:23,550 --> 00:23:29,390 So dass in diesem Fall kehrt sscanf 1, weil ich besiedelten einer dieser Zeiger, 382 00:23:29,390 --> 00:23:33,650 in diesem Fall groß. Ich habe einen int, so befreie ich die Linie, um den Arbeitsspeicher freizugeben 383 00:23:33,650 --> 00:23:37,150 das GetString tatsächlich zugeteilt, und dann bin ich wieder n. 384 00:23:37,150 --> 00:23:42,210 Andernfalls, wenn Sie sich jemals gefragt, wo diese Anweisung retry stammt, kommt von hier. 385 00:23:42,210 --> 00:23:45,770 Wenn hingegen, Typ I in 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 nur einige zufällige Sequenz von Texten, sscanf gehen, um zu sehen, 387 00:23:48,640 --> 00:23:51,500 ooh, Anzahl, ooh, Anzahl, ooh, Anzahl, ooh - f. 388 00:23:51,500 --> 00:23:54,190 Und es geht um die 1 2 3 in n setzen. 389 00:23:54,190 --> 00:23:59,970 Es wird das f in c setzen, und dann wieder 2. 390 00:23:59,970 --> 00:24:02,980 So haben wir, nur mit der grundlegenden Definition von scanf Verhalten, 391 00:24:02,980 --> 00:24:06,170 eine sehr einfache Art und Weise - auch, komplexe auf den ersten Blick, aber am Ende des Tages, 392 00:24:06,170 --> 00:24:11,460 relativ einfachen Mechanismus zu sagen, ist es ein int, und wenn ja, ist, dass die einzige Sache, die ich gefunden habe? 393 00:24:11,460 --> 00:24:14,950 Und der weiße Raum ist hier gewollt. Wenn Sie die Dokumentation lesen für sscanf, 394 00:24:14,950 --> 00:24:18,690 es sagt Ihnen, dass, wenn Sie eine Stück Leerzeichen am Anfang oder am Ende 395 00:24:18,690 --> 00:24:24,990 sscanf auch Sie ermöglichen dem Benutzer, aus welchem ​​Grund, um die Leertaste 1 2 3 getroffen, und das wird für legitim. 396 00:24:24,990 --> 00:24:28,310 Es wird nicht auf der Benutzerebene anschreien nur weil sie die Leertaste getroffen am Anfang oder am Ende, 397 00:24:28,310 --> 00:24:32,160 das ist nur ein wenig mehr benutzerfreundlich. 398 00:24:32,160 --> 00:24:34,160 >> Haben Sie Fragen, dann auf GetInts? Yeah? 399 00:24:34,160 --> 00:24:36,820 [Studenten Frage unverständlich] 400 00:24:36,820 --> 00:24:40,740 >> Gute Frage. Was passiert, wenn Sie in einem char gerade eingegeben, wie f und drücken Sie die Eingabetaste 401 00:24:40,740 --> 00:24:47,830 ohne jemals eingeben 1 2 3; was denkst du das Verhalten dieser Zeile Code wäre dann? 402 00:24:47,830 --> 00:24:50,500 So sscanf können, dass zu decken, da in diesem Fall, 403 00:24:50,500 --> 00:24:56,280 es ist nicht zu n oder c zu füllen; es wird statt 0 zurück. 404 00:24:56,280 --> 00:25:01,540 In diesem Fall bin ich auch fangen dieses Szenario, weil der erwartete Wert ich will, ist ein. 405 00:25:01,540 --> 00:25:07,310 Ich will nur eins, und nur 1, was zu besetzen. Gute Frage. Andere? 406 00:25:07,310 --> 00:25:09,610 >> Alles klar, also lassen Sie uns nicht über alle Funktionen, die hier gehen, 407 00:25:09,610 --> 00:25:11,820 sondern jene, die zu sein, vielleicht der verbleibenden Interesse scheint 408 00:25:11,820 --> 00:25:14,530 wird GetString, weil sich herausstellt, dass GetFloat, GetInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong Alle punt einen Großteil ihrer Funktionalität GetString. 410 00:25:19,490 --> 00:25:22,860 So lassen Sie uns einen Blick darauf, wie er hier umgesetzt. 411 00:25:22,860 --> 00:25:27,040 Dieser sieht ein wenig komplex, aber es verwendet die gleichen Grundlagen 412 00:25:27,040 --> 00:25:29,680 dass wir reden letzte Woche gestartet. So in GetString, 413 00:25:29,680 --> 00:25:32,670 das dauert kein Argument nach der Leere hier, 414 00:25:32,670 --> 00:25:37,110 und es gibt einen String zurück, so erkläre ich einen String namens Puffer. 415 00:25:37,110 --> 00:25:39,670 Ich weiß nicht wirklich, was das los, um für noch verwendet werden, aber wir werden sehen. 416 00:25:39,670 --> 00:25:42,950 Sieht aus wie Kapazität, die standardmäßig 0; nicht ganz sicher, wohin dieses geht. 417 00:25:42,950 --> 00:25:44,920 Nicht sicher, was n los, um noch verwendet werden. 418 00:25:44,920 --> 00:25:47,860 Aber jetzt wird es ein wenig interessanter, so im Einklang 243, 419 00:25:47,860 --> 00:25:51,760 erklären wir eine int c, das ist eine Art von dummen Details. 420 00:25:51,760 --> 00:25:58,080 Ein char ist 8 Bit und 8 Bit können, wie viele verschiedene Werte speichern? 421 00:25:58,080 --> 00:26:03,310 256. Das Problem ist, wenn Sie 256 verschiedene ASCII-Zeichen haben wollen, 422 00:26:03,310 --> 00:26:06,210 die es gibt, wenn Sie wieder zu denken, und das ist nicht etwas auswendig zu lernen. 423 00:26:06,210 --> 00:26:09,100 Aber wenn Sie zurück zu diesem großen ASCII-Tabelle denke, wir hatten Wochen 424 00:26:09,100 --> 00:26:13,780 gab es in diesem Fall, 128 oder 256 Zeichen. 425 00:26:13,780 --> 00:26:16,220 Wir haben alle die Muster von 0 und 1 ist um. 426 00:26:16,220 --> 00:26:19,410 Das ist ein Problem, wenn Sie in der Lage sein, um einen Fehler erkennen soll. 427 00:26:19,410 --> 00:26:23,290 Denn wenn Sie bereits mit 256 Werten für eure Charaktere, 428 00:26:23,290 --> 00:26:26,390 Sie nicht wirklich im Voraus zu planen, denn jetzt gibt es keine Möglichkeit zu sagen haben, 429 00:26:26,390 --> 00:26:29,750 "Dies ist nicht ein legitimes Charakter; dies einige falsche Botschaft." 430 00:26:29,750 --> 00:26:32,430 Also, was die Welt tut, ist, verwenden sie die nächste größte Wert, 431 00:26:32,430 --> 00:26:35,790 so etwas wie ein int, so dass Sie eine verrückte Anzahl von Bits, 432 00:26:35,790 --> 00:26:39,610 32 für 4 Milliarden möglichen Werte, so dass man einfach am Ende mit, 433 00:26:39,610 --> 00:26:44,800 Wesentlichen, 257 von ihnen, ein von denen eine besondere Bedeutung als Fehler. 434 00:26:44,800 --> 00:26:49,190 >> Also mal sehen, wie das funktioniert. In line 246 Ich habe diesen großen while-Schleife 435 00:26:49,190 --> 00:26:54,530 das ruft fgetc; f Bedeutung Datei getc, und dann stdin. 436 00:26:54,530 --> 00:26:59,030 Stellt sich heraus, das ist nur die genauere Art zu sagen, "lesen Eingabe über die Tastatur." 437 00:26:59,030 --> 00:27:02,730 Standard-Eingabe mittels Tastatur, bedeutet Standard-Ausgabe-Bildschirm, 438 00:27:02,730 --> 00:27:06,920 und Standardfehler, die wir in pset 4 sehen werden, bedeutet, den Bildschirm, 439 00:27:06,920 --> 00:27:09,670 sondern eine besondere Teil des Bildschirms, so dass es nicht verschmolzen 440 00:27:09,670 --> 00:27:13,760 mit den tatsächlichen Ausgang, die Sie drucken sollen, aber mehr auf, dass in der Zukunft. 441 00:27:13,760 --> 00:27:19,430 So fgetc bedeutet nur lesen ein Zeichen von der Tastatur, und speichern Sie es wo? 442 00:27:19,430 --> 00:27:24,000 Bewahren Sie es in c, und dann zu überprüfen, so dass ich nur mit ein paar boolean Konjunktionen hier 443 00:27:24,000 --> 00:27:28,430 prüfen, ob es nicht gleich \ n, so hat der Benutzer drücken Sie Enter. 444 00:27:28,430 --> 00:27:31,510 Wir wollen an diesem Punkt, Ende der Schleife zu stoppen, und wir wollen auch zu prüfen, 445 00:27:31,510 --> 00:27:36,170 für die spezielle Konstante, EOF, die, wenn Sie oder erraten wissen - was es für nicht stehen? 446 00:27:36,170 --> 00:27:39,860 Ende der Datei. Also das ist eine Art von Unsinn, denn wenn ich auf der Tastatur tippen bin, 447 00:27:39,860 --> 00:27:41,900 gibt es wirklich keine Datei daran beteiligt, 448 00:27:41,900 --> 00:27:44,330 Doch dies ist nur der Oberbegriff für meine sortieren 449 00:27:44,330 --> 00:27:50,320 nichts anderes wird aus dem menschlichen Finger kommt. EOF. Ende der Datei. 450 00:27:50,320 --> 00:27:52,600 Nebenbei, wenn Sie jemals Kontrolle d bei Ihrer Tastatur drücken, 451 00:27:52,600 --> 00:27:54,680 nicht, dass Sie noch, Sie haben die Kontrolle c getroffen. 452 00:27:54,680 --> 00:27:57,920 Aber die Kontrolle d sendet diese spezielle Konstante genannt EOF. 453 00:27:57,920 --> 00:28:03,100 >> So, jetzt müssen wir nur noch einige dynamische Speicherzuweisung. 454 00:28:03,100 --> 00:28:06,460 Also, wenn n + 1> Kapazität, jetzt werde ich erklären, n. 455 00:28:06,460 --> 00:28:09,380 n ist nur, wie viele Bytes sind derzeit im Puffer 456 00:28:09,380 --> 00:28:11,970 die Zeichenfolge, die Sie derzeit den Aufbau des Benutzers. 457 00:28:11,970 --> 00:28:16,240 Wenn Sie mehr Zeichen in Ihrem Puffer als Sie im Puffer haben, 458 00:28:16,240 --> 00:28:20,760 intuitiv, ist das, was wir brauchen, um dann dafür mehr Kapazität. 459 00:28:20,760 --> 00:28:24,490 Ich werde überfliegen einige der arithmetischen hier 460 00:28:24,490 --> 00:28:26,900 und nur auf diese Funktion hier zu konzentrieren. 461 00:28:26,900 --> 00:28:29,170 Sie wissen, was malloc ist, oder zumindest allgemein bekannt. 462 00:28:29,170 --> 00:28:32,380 Take a guess, was realloc tut. [Schüler Antwort unverständlich] 463 00:28:32,380 --> 00:28:35,690 >> Ja. Und es ist nicht ganz das Hinzufügen von Arbeitsspeicher, es Verteilt Speicher wie folgt: 464 00:28:35,690 --> 00:28:40,530 Wenn es immer noch Raum am Ende des Strings, um Ihnen mehr von dieser Erinnerung 465 00:28:40,530 --> 00:28:43,370 als es gibt ursprünglich Sie, dann bekommen Sie diesen zusätzlichen Speicher. 466 00:28:43,370 --> 00:28:46,640 So können Sie nur darum, die Saiten Zeichen Rücken an Rücken an Rücken an Rücken. 467 00:28:46,640 --> 00:28:49,290 Aber wenn das nicht der Fall, weil Sie zu lange gewartet 468 00:28:49,290 --> 00:28:51,700 und etwas zufällig bekam plumpste in den Speicher gibt, aber es gibt zusätzliche 469 00:28:51,700 --> 00:28:56,480 Speicher hier unten, das ist okay. Realloc wird alle die Schwerstarbeit für Sie tun, 470 00:28:56,480 --> 00:28:58,810 bewegen Sie die Zeichenfolge, die Sie in gelesen habe damit weit von hier, 471 00:28:58,810 --> 00:29:02,550 legte es dort unten, und dann geben Sie etwas mehr Start-und Landebahn an diesem Punkt. 472 00:29:02,550 --> 00:29:05,610 Also mit einer Handbewegung, lassen Sie mich sagen, dass das, was GetString tut 473 00:29:05,610 --> 00:29:09,540 wird es mit einem kleinen Puffer, vielleicht ein einzelnes Zeichen ab, 474 00:29:09,540 --> 00:29:12,300 und wenn die Benutzer in 2 Zeichen, endet GetString up 475 00:29:12,300 --> 00:29:15,210 Aufruf realloc und sagt: "Ooh, war ein Zeichen, das nicht genug. 476 00:29:15,210 --> 00:29:18,480 Gib mir 2 Zeichen. ' Dann, wenn Sie lesen, durch die Logik der Schleife 477 00:29:18,480 --> 00:29:21,070 es wird sagen: "Oh, den Anwender bei 3 Zeichen eingegeben werden. 478 00:29:21,070 --> 00:29:25,690 Gib mir jetzt nicht 2, sondern 4 Zeichen, dann geben Sie mir 8, dann geben Sie mir 16 und 32 ". 479 00:29:25,690 --> 00:29:28,180 Die Tatsache, dass ich eine Verdoppelung der Kapazität jedes Mal 480 00:29:28,180 --> 00:29:30,320 bedeutet, dass der Puffer nicht zu langsam wachsen. 481 00:29:30,320 --> 00:29:35,870 Es wird super schnell wachsen, und was könnte der Vorteil das sein? 482 00:29:35,870 --> 00:29:38,540 Warum bin ich die Verdoppelung der Größe des Puffers, obwohl der Benutzer 483 00:29:38,540 --> 00:29:41,450 vielleicht brauchen nur 1 extra Zeichen von der Tastatur? 484 00:29:41,450 --> 00:29:44,830 [Schüler Antwort unverständlich]. >> Was ist das? 485 00:29:44,830 --> 00:29:46,750 Genau. Sie müssen nicht so oft zu wachsen. 486 00:29:46,750 --> 00:29:48,870 Und dies ist nur eine Art a - du bist Absicherung Ihrer Wetten hier. 487 00:29:48,870 --> 00:29:54,150 Die Idee ist, dass Sie nicht anrufen möchten realloc viel, weil es zu langsam neigt. 488 00:29:54,150 --> 00:29:56,840 Jedes Mal, wenn Sie sich an das Betriebssystem für Speicher, wie Sie bald sehen 489 00:29:56,840 --> 00:30:00,620 in einem zukünftigen Problem Set, neigt sie dazu, einige Zeit dauern. 490 00:30:00,620 --> 00:30:04,980 So minimiert so viel Zeit, auch wenn Sie verschwenden etwas Platz sind, neigt dazu, eine gute Sache sein. 491 00:30:04,980 --> 00:30:07,250 >> Aber wenn wir durch den letzten Teil der GetString hier lesen, 492 00:30:07,250 --> 00:30:10,880 und wieder, das Verständnis jede einzelne Zeile ist hier nicht so wichtig heute. 493 00:30:10,880 --> 00:30:14,830 Aber beachten Sie, dass es schließlich ruft malloc wieder, und es teilt 494 00:30:14,830 --> 00:30:16,980 genau so viele Bytes wie sie benötigt für die Zeichenfolge 495 00:30:16,980 --> 00:30:21,620 und dann wegwirft, indem Sie frei, die übermäßig große Puffer, 496 00:30:21,620 --> 00:30:23,510 wenn es tatsächlich wurde zu oft verdoppelt. 497 00:30:23,510 --> 00:30:25,970 Kurz gesagt, das ist, wie GetString gearbeitet hat die ganze Zeit. 498 00:30:25,970 --> 00:30:30,100 Alles, was sie tut, ist ein Zeichen in einer Zeit wieder gelesen und immer wieder 499 00:30:30,100 --> 00:30:37,930 und jedes Mal, es braucht einige zusätzliche Speicher, fragt er das Betriebssystem für ihn durch Aufrufen realloc. 500 00:30:37,930 --> 00:30:41,660 Haben Sie Fragen? Gut. 501 00:30:41,660 --> 00:30:45,220 >> Ein Angriff. Nun, da wir Zeiger zu verstehen, oder mindestens 502 00:30:45,220 --> 00:30:47,560 zunehmend vertraut mit Zeiger, 503 00:30:47,560 --> 00:30:50,020 Lassen Sie uns überlegen, wie die ganze Welt zum Einsturz beginnt 504 00:30:50,020 --> 00:30:53,160 wenn Sie nicht ganz gegen kontradiktorischen Nutzer zu verteidigen, 505 00:30:53,160 --> 00:30:55,180 Menschen, die versuchen, in Ihr System zu hacken sind. 506 00:30:55,180 --> 00:31:00,260 Menschen, die versuchen, Ihre Software unter Umgehung einige Registrierungscode stehlen 507 00:31:00,260 --> 00:31:02,150 dass sie vielleicht sonst zu tippen in. 508 00:31:02,150 --> 00:31:04,860 Werfen Sie einen Blick auf dieses Beispiel hier, das ist nur C-Code 509 00:31:04,860 --> 00:31:07,920 das hat eine Funktion main an der Unterseite, nennt das eine Funktion foo, 510 00:31:07,920 --> 00:31:12,100 und wofür wird es vorbei an foo? [Student] Ein einziges Argument. 511 00:31:12,100 --> 00:31:15,660 >> Single Argument. So argv [1], was bedeutet, dass das erste Wort der Benutzer eingegeben 512 00:31:15,660 --> 00:31:19,150 in der Befehlszeile nach dem a.out oder was auch immer das Programm aufgerufen wird. 513 00:31:19,150 --> 00:31:24,920 So foo, an der Spitze, nimmt in einem char *, aber char * ist nur was? 514 00:31:24,920 --> 00:31:28,860 String. Es gibt hier nichts Neues, und diese Zeichenfolge beliebig aufgerufen bar. 515 00:31:28,860 --> 00:31:36,090 In dieser Linie hier, char c [12], in einer Art semi-technisches Englisch, ist das, was diese Linie zu tun? 516 00:31:36,090 --> 00:31:40,640 Array of -? Zeichen. Gib mir eine Reihe von 12 Zeichen. 517 00:31:40,640 --> 00:31:44,970 So könnten wir nennen dies einen Puffer. Es ist technisch genannt c, aber ein Puffer in der Programmierung 518 00:31:44,970 --> 00:31:47,890 bedeutet nur einen Haufen von Raum, dass man einige Sachen in. setzen 519 00:31:47,890 --> 00:31:49,940 >> Dann endlich, memcpy, haben wir nicht vor verwendet. 520 00:31:49,940 --> 00:31:52,380 Aber Sie können sich wahrscheinlich vorstellen, was es tut. Er kopiert Speicher. 521 00:31:52,380 --> 00:31:58,790 Was bedeutet es? Nun, es ist offensichtlich kopiert bar, dessen Eingang in c, 522 00:31:58,790 --> 00:32:03,420 aber nur bis zu der Länge der Stange. 523 00:32:03,420 --> 00:32:07,440 Aber da ist ein Fehler hier. 524 00:32:07,440 --> 00:32:14,500 Okay, technisch so sollten wir wirklich tun strlen (bar) x sizeof (char), das ist richtig. 525 00:32:14,500 --> 00:32:17,920 Aber im schlimmsten Fall hier, gehen wir davon aus, dass that's - so, okay. 526 00:32:17,920 --> 00:32:23,760 Dann gibt es noch 2 bugs. So sizeof (char), alles in Ordnung, wir machen dies ein wenig breiter. 527 00:32:23,760 --> 00:32:28,860 So, jetzt gibt es noch einen Bug, das, was ist? 528 00:32:28,860 --> 00:32:31,630 [Schüler Antwort unverständlich] >> Check for what? Okay, wir sollten prüfen 529 00:32:31,630 --> 00:32:35,010 NULL, denn schlechte Dinge passieren, wenn Sie Ihre Zeiger NULL ist, 530 00:32:35,010 --> 00:32:38,490 Da könnten Sie am Ende dorthin zu gehen, und Sie sollten nicht immer gehen auf NULL 531 00:32:38,490 --> 00:32:40,890 durch Dereferenzierung mit dem Operator *. 532 00:32:40,890 --> 00:32:45,250 Also das ist gut, und was sollen wir sonst tun? Logischerweise gibt es eine Schwachstelle auch hier. 533 00:32:45,250 --> 00:32:47,650 [Schüler Antwort unverständlich] 534 00:32:47,650 --> 00:32:51,340 >> So prüfen Sie, ob argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Okay, so gibt es 3 Fehler in diesem Programm hier. 536 00:32:54,130 --> 00:33:00,080 Wir sind nicht überprüfen, ob der Benutzer tatsächlich in nichts in argv [1], gut getippt. 537 00:33:00,080 --> 00:33:02,240 Also, was ist der dritte bug? Yeah? 538 00:33:02,240 --> 00:33:04,420 [Schüler Antwort unverständlich] >> Gut. 539 00:33:04,420 --> 00:33:09,590 So haben wir überprüft, ein Szenario. Wir implizit überprüft nicht kopieren mehr Speicher 540 00:33:09,590 --> 00:33:12,800 als dies übersteigt die Länge des Balkens. 541 00:33:12,800 --> 00:33:15,720 Also, wenn die Zeichenfolge der Benutzer eingetippt 10 Zeichen lang ist, 542 00:33:15,720 --> 00:33:18,260 dies sagen: "Nur kopieren 10 Zeichen. ' 543 00:33:18,260 --> 00:33:21,140 Und das ist okay, aber was, wenn der Benutzer in einem Wort an der Eingabeaufforderung eingegeben 544 00:33:21,140 --> 00:33:29,360 wie ein 20-Zeichen-Wort, das ist, sagen copy 20 Zeichen aus bar in was? 545 00:33:29,360 --> 00:33:32,840 c, sonst als unser Puffer bezeichnet, was bedeutet, Sie gerade geschrieben haben Daten 546 00:33:32,840 --> 00:33:35,950 zu 8 Byte Orte, die Sie nicht besitzen, 547 00:33:35,950 --> 00:33:38,320 und Sie nicht besitzen sie in dem Sinne, dass man nie vergeben sie. 548 00:33:38,320 --> 00:33:41,190 Also das ist, was allgemein als Pufferüberlauf Angriff bekannt, 549 00:33:41,190 --> 00:33:46,650 oder Pufferüberlauf Angriff, und es ist Angriff in dem Sinne, dass, wenn der Benutzer 550 00:33:46,650 --> 00:33:50,650 oder das Programm, die einen Aufruf Ihrer Funktion ist tut dies böswillig, 551 00:33:50,650 --> 00:33:53,780 was tatsächlich passiert als nächstes könnte ziemlich schlecht. 552 00:33:53,780 --> 00:33:55,690 >> Werfen wir einen Blick auf dieses Bild hier. 553 00:33:55,690 --> 00:33:59,070 Dieses Bild stellt Ihr Stack Speicher. 554 00:33:59,070 --> 00:34:01,050 Und daran erinnern, dass jedes Mal, wenn Sie eine Funktion aufrufen, 555 00:34:01,050 --> 00:34:04,520 Sie erhalten diese kleinen Rahmen auf den Stapel und dann noch eine und dann noch eine und dann noch eine. 556 00:34:04,520 --> 00:34:07,250 Und so weit wir nur irgendwie abstrahiert diese weg als Rechtecke 557 00:34:07,250 --> 00:34:09,380 entweder es auf dem Board oder auf dem Bildschirm hier. 558 00:34:09,380 --> 00:34:12,219 Aber wenn wir zu vergrößern auf einem dieser Rechtecke, 559 00:34:12,219 --> 00:34:16,460 wenn Sie eine Funktion foo nennen, stellt sich heraus, dass es mehr auf dem Stapel 560 00:34:16,460 --> 00:34:18,739 im Inneren des Rahmens und diesem Rechteck 561 00:34:18,739 --> 00:34:23,370 als nur x-und y-und a und b, wie wir haben über Swap reden. 562 00:34:23,370 --> 00:34:25,949 Es stellt sich heraus, dass es einige unteren Level-Details, 563 00:34:25,949 --> 00:34:27,780 unter ihnen zurückzukehren Adresse. 564 00:34:27,780 --> 00:34:33,020 So stellt sich heraus, wenn der Haupt ruft foo hat Wesentlichen auf foo informieren 565 00:34:33,020 --> 00:34:36,760 Welches Hauptziel ist die Adresse in den Arbeitsspeicher des Computers. 566 00:34:36,760 --> 00:34:40,659 Denn sonst wird sobald foo getan ausführt, wie im vorliegenden Fall ist, 567 00:34:40,659 --> 00:34:43,790 sobald Sie erreichen diese enge geschweiften Klammer am Ende des foo, 568 00:34:43,790 --> 00:34:48,860 Wie zum Teufel soll foo wissen, wo Kontrolle des Programms soll gehen? 569 00:34:48,860 --> 00:34:52,460 Es stellt sich heraus, dass die Antwort auf diese Frage in dem roten Rechteck ist hier. 570 00:34:52,460 --> 00:34:56,130 Dies repräsentiert einen Zeiger, und es ist bis zu dem Computer zu speichern, vorübergehend, 571 00:34:56,130 --> 00:35:00,250 auf der so genannten Stapel die Adresse des Haupt so daß, sobald foo erfolgt ausführt, 572 00:35:00,250 --> 00:35:04,110 der Computer weiß, wo und in welcher Zeile im Hauptspeicher, um wieder auf. 573 00:35:04,110 --> 00:35:06,900 Gespeichert Framezeiger bezieht ebenfalls dazu bei. 574 00:35:06,900 --> 00:35:09,620 Char * bar stellt hier was? 575 00:35:09,620 --> 00:35:14,740 Nun, jetzt diese blaue Segment ist hier foo der Rahmen, was ist bar? 576 00:35:14,740 --> 00:35:18,300 Okay, das ist so bar nur das Argument der foo-Funktion. 577 00:35:18,300 --> 00:35:20,720 >> So, jetzt sind wir wieder auf das bekannte Bild. 578 00:35:20,720 --> 00:35:22,960 Es gibt mehr Sachen und mehr Ablenkungen auf dem Bildschirm 579 00:35:22,960 --> 00:35:27,490 aber das hellblaue Segment ist das, was wir an die Tafel gezeichnet für so etwas wie Swap. 580 00:35:27,490 --> 00:35:31,890 Das ist der Rahmen für foo und das einzige, was in ihm ist im Moment bar, 581 00:35:31,890 --> 00:35:34,630 was ist dieser Parameter. 582 00:35:34,630 --> 00:35:39,840 Aber was sollte in dem Stapel zu sein, nach diesem Code hier? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Also sollten wir auch 12 Quadrate des Gedächtnisses, 584 00:35:44,280 --> 00:35:46,260 zugeordnet einer Variable namens c. 585 00:35:46,260 --> 00:35:48,340 Und in der Tat haben wir nicht, dass auf dem Bildschirm haben. 586 00:35:48,340 --> 00:35:51,650 Ganz oben gibt es c [0], und dann der Autor dieses Diagramms 587 00:35:51,650 --> 00:35:55,130 nicht die Mühe der Erstellung all der Quadrate, aber es gibt in der Tat 12 gibt 588 00:35:55,130 --> 00:36:00,120 denn wenn man in der unteren rechten schauen, c [11], wenn Sie zählen von 0 ist die 12 solcher Bytes. 589 00:36:00,120 --> 00:36:06,190 Aber hier ist das Problem: In welche Richtung wird c wächst? 590 00:36:06,190 --> 00:36:10,390 Sortieren von oben nach unten, nicht wahr? Wenn es beginnt an der Oberseite und an der Unterseite wächst, 591 00:36:10,390 --> 00:36:13,480 nicht aussehen wie wir selbst ließ viel Landebahn hier überhaupt. 592 00:36:13,480 --> 00:36:15,320 Wir haben Art von uns in eine Ecke manövriert, 593 00:36:15,320 --> 00:36:20,210 und daß c [11] ist direkt gegen Bar, die bis gegen Stapelrahmen Zeiger, 594 00:36:20,210 --> 00:36:23,800 das ist richtig gegen die Absender-Adresse, es gibt keinen Platz mehr. 595 00:36:23,800 --> 00:36:26,100 Also, was ist die Implikation, dann, wenn Sie es vermasseln, 596 00:36:26,100 --> 00:36:30,460 und Sie versuchen, das Lesen 20 Bytes in eine 12-Byte-Puffer? 597 00:36:30,460 --> 00:36:33,460 Wo werden diese 8 zusätzliche Bytes gehen? 598 00:36:33,460 --> 00:36:36,370 Im Inneren alles andere, ist von denen einige super wichtig. 599 00:36:36,370 --> 00:36:40,480 Und das Wichtigste, möglicherweise ist das rote Feld dort Absenderadresse. 600 00:36:40,480 --> 00:36:44,720 Da nehme an, dass Sie entweder versehentlich oder adversarially sind 601 00:36:44,720 --> 00:36:48,040 überschreibt diese 4 Bytes, die Pointer-Adresse, 602 00:36:48,040 --> 00:36:53,190 Nicht nur mit Müll, sondern mit einer Nummer, die einer tatsächlichen Adresse im Speicher darstellen geschieht? 603 00:36:53,190 --> 00:36:55,930 Was ist der implicaiton, logisch? 604 00:36:55,930 --> 00:36:59,080 [Schüler Antworten unverständlich] >> Genau. Wenn foo zurück 605 00:36:59,080 --> 00:37:03,560 und Hits, die geschweiften Klammern, wird das Programm gehen, um fortzufahren, nicht zu Haupt zurückkehren, 606 00:37:03,560 --> 00:37:08,320 es geht um alles, was Adresse ist in diesem roten Kasten zurückzukehren. 607 00:37:08,320 --> 00:37:11,560 >> Nun, im Falle der Umgehung Software-Registrierung, 608 00:37:11,560 --> 00:37:14,400 Was ist die Adresse, an ist wieder wird die Funktion 609 00:37:14,400 --> 00:37:18,820 die normalerweise aufgerufen wird, nachdem Sie für die Software bezahlt haben und eingegeben Ihren Registrierungscode? 610 00:37:18,820 --> 00:37:23,160 Man könnte der Trick der Computer in den nicht hier zu sortieren, aber stattdessen werde hier oben. 611 00:37:23,160 --> 00:37:27,950 Oder, wenn Sie wirklich clever sind, können ein Gegner tatsächlich geben in die Tastatur, 612 00:37:27,950 --> 00:37:32,500 zum Beispiel: Angenommen, nicht eine tatsächliche Wort, nicht 20 Zeichen, aber er oder sie 613 00:37:32,500 --> 00:37:36,200 Typen in einigen Zeichen, Code darstellen? 614 00:37:36,200 --> 00:37:38,860 Und es ist nicht zu C-Code sein, es geht um die Zeichen lang sein 615 00:37:38,860 --> 00:37:42,920 das stellen binäre Maschine Codes, 0 und 1 ist. 616 00:37:42,920 --> 00:37:46,740 Aber angenommen, sie sind klug genug zu tun, um irgendwie in die GetString prompt fügen 617 00:37:46,740 --> 00:37:49,460 etwas, das im wesentlichen Code kompiliert, 618 00:37:49,460 --> 00:37:56,900 und die letzten 4 Bytes überschrieben, dass die Rückkehr-Adresse und welche Adresse soll das Eingangssignal zu tun? 619 00:37:56,900 --> 00:38:01,860 Er speichert in dieser roten Rechteck die Adresse des ersten Bytes des Puffers. 620 00:38:01,860 --> 00:38:04,270 So muss man sich wirklich clever, und das ist eine Menge von Versuch und Irrtum 621 00:38:04,270 --> 00:38:08,500 für schlechte Menschen da draußen, aber wenn Sie herausfinden können, wie groß dieser Puffer ist, 622 00:38:08,500 --> 00:38:12,170 so dass die letzten Bytes im Eingang, den Sie für das Programm bereitstellen 623 00:38:12,170 --> 00:38:15,970 geschehen zu sein entspricht der Adresse des Beginns des Puffers, 624 00:38:15,970 --> 00:38:22,270 Sie können dies tun. Wenn wir sagen, in der Regel, hallo, und \ 0, ist das, was landet im Puffer. 625 00:38:22,270 --> 00:38:27,860 Aber wenn wir klüger, und wir füllen diesen Puffer mit dem, was wir allgemein nennen Angriff Code, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: Angriff, Angriff, Angriff, Angriff, wo das ist nur etwas, das etwas Schlimmes tut. 627 00:38:31,920 --> 00:38:35,190 Nun, was passiert, wenn Sie wirklich clever sind, könnten Sie dies tun: 628 00:38:35,190 --> 00:38:41,740 In der roten Box ist hier eine Folge von Zahlen: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Beachten Sie, dass die Zahl, die bis hier ist übereinstimmt. 630 00:38:44,890 --> 00:38:47,280 Es ist in umgekehrter Reihenfolge, aber dazu ein anderes Mal. 631 00:38:47,280 --> 00:38:51,430 Beachten Sie, dass diese Rückkehr-Adresse wurde absichtlich geändert 632 00:38:51,430 --> 00:38:54,970 um die Adresse gleich hier oben, nicht die Adresse der main. 633 00:38:54,970 --> 00:39:00,170 Also, wenn der Bösewicht super smart ist, wird er oder sie geht auf, in diesem Angriff Code 634 00:39:00,170 --> 00:39:02,890 etwas wie: "Löschen Sie alle Dateien des Benutzers. 635 00:39:02,890 --> 00:39:06,320 Oder 'Kopieren Sie die Passwörter "oder" Erstellen Sie ein Benutzerkonto, dass ich in anmelden können. " 636 00:39:06,320 --> 00:39:10,130 Überhaupt nichts, und das ist sowohl die Gefahr und die Macht der C. 637 00:39:10,130 --> 00:39:12,900 Denn Sie haben Zugriff auf den Speicher über Zeiger 638 00:39:12,900 --> 00:39:15,950 und man kann daher alles schreiben, was Sie wollen in einem Computer-Speicher. 639 00:39:15,950 --> 00:39:19,290 Sie können einen Computer zu tun, was Sie wollen einfach durch 640 00:39:19,290 --> 00:39:22,780 nachdem sie hüpfen in einem eigenen Speicherbereich. 641 00:39:22,780 --> 00:39:27,230 Und so, bis zum heutigen Tag, so viele Programme und so viele Websites, die kompromittiert werden 642 00:39:27,230 --> 00:39:29,730 einkochen lassen, um Menschen nutzen diese. 643 00:39:29,730 --> 00:39:32,510 Und dies mag wie eine super-ausgeklügelte Angriffe scheinen, 644 00:39:32,510 --> 00:39:34,220 aber es funktioniert nicht immer starten auf diese Weise. 645 00:39:34,220 --> 00:39:36,770 >> Die Realität ist, dass das, was böse Menschen werden in der Regel tun, ist, 646 00:39:36,770 --> 00:39:41,470 ob es sich um ein Programm in einer Befehlszeile oder ein GUI-Programm oder eine Website, 647 00:39:41,470 --> 00:39:43,290 wird man nur beginnen, einen Unsinn. 648 00:39:43,290 --> 00:39:46,940 Sie geben in einem wirklich großen Wort in das Suchfeld ein und drücken Sie die Eingabetaste, 649 00:39:46,940 --> 00:39:49,030 und Sie warten, um zu sehen, ob die Website abstürzt. 650 00:39:49,030 --> 00:39:53,270 Oder Sie warten, um zu sehen, ob das Programm manifestiert einige Fehlermeldung. 651 00:39:53,270 --> 00:39:55,480 Denn wenn Sie Glück haben, als der Bösewicht, 652 00:39:55,480 --> 00:39:59,610 und Ihnen ein paar verrückte Eingang, der das Programm stürzt, 653 00:39:59,610 --> 00:40:02,280 dh der Programmierer nicht vorhergesehen Dein schlechtes Benehmen 654 00:40:02,280 --> 00:40:05,420 was bedeutet, Sie können sich wahrscheinlich mit genügend Anstrengung, 655 00:40:05,420 --> 00:40:09,870 genug, trial and error, herauszufinden, wie man eine genauere Angriff zu führen. 656 00:40:09,870 --> 00:40:15,900 So viel ein Teil der Sicherheit wird nicht nur die Vermeidung dieser Attacken insgesamt, aber deren Entdeckung 657 00:40:15,900 --> 00:40:20,250 und tatsächlich Blick auf Protokolle und sehen, was verrückt Eingänge Menschen in Ihre Website eingegeben haben. 658 00:40:20,250 --> 00:40:26,040 Welche Suchbegriffe haben die Menschen ihn auf Ihrer Webseite, in der Hoffnung Überlaufen einige Puffer eingegeben? 659 00:40:26,040 --> 00:40:28,900 Und das läuft alles auf den einfachen Grundlagen dessen, was ist ein Array, 660 00:40:28,900 --> 00:40:32,510 und was bedeutet es, zu vergeben und zu verwenden Speicher? 661 00:40:32,510 --> 00:40:34,920 Und in Bezug auf das auch, das ist. 662 00:40:34,920 --> 00:40:37,520 >> Lassen Sie uns also nur innerhalb Blick einer Festplatte noch einmal. 663 00:40:37,520 --> 00:40:40,190 So erinnern Sie sich von ein oder zwei Wochen her, dass, wenn Sie ziehen Sie die Dateien 664 00:40:40,190 --> 00:40:45,470 Ihre Papierkorb oder Mülleimer, was geschieht dann? 665 00:40:45,470 --> 00:40:47,850 [Student] Nichts. >> Ja, absolut nichts. Schließlich, wenn Sie gehen zur Neige 666 00:40:47,850 --> 00:40:51,370 Speicherplatz auf der Festplatte, Windows oder Mac OS zu starten Löschen von Dateien für Sie. 667 00:40:51,370 --> 00:40:53,670 Aber wenn Sie etwas dort zu ziehen, dann ist es überhaupt nicht sicher. 668 00:40:53,670 --> 00:40:56,550 Alle Ihre Mitbewohner, Freund oder ein Familienmitglied zu tun hat, ist doppelt zu klicken, und voila. 669 00:40:56,550 --> 00:40:59,720 Es gibt alle sketchy-Dateien, die Sie löschen versucht. 670 00:40:59,720 --> 00:41:02,840 So sind die meisten von uns zumindest wissen, dass Sie die rechte Maustaste oder Steuerelement klicken müssen 671 00:41:02,840 --> 00:41:05,320 und leeren Sie den Papierkorb, oder so ähnlich. 672 00:41:05,320 --> 00:41:07,900 Aber selbst dann ist das nicht ganz den Trick tun. 673 00:41:07,900 --> 00:41:11,340 Denn was passiert, wenn Sie eine Datei auf Ihrer Festplatte haben 674 00:41:11,340 --> 00:41:14,590 Das stellt einige Word-Dokument oder eine JPEG? 675 00:41:14,590 --> 00:41:18,820 Und dies stellt Ihre Festplatte, und lasst uns sagen, dass dieses Bandes stellt hier die Datei, 676 00:41:18,820 --> 00:41:21,640 und es ist von einem ganzen Bündel von 0 und 1 ist zusammengesetzt. 677 00:41:21,640 --> 00:41:25,470 Was passiert, wenn Sie nicht nur ziehen Sie die Datei in den Papierkorb oder Papierkorb, 678 00:41:25,470 --> 00:41:30,390 sondern auch entleeren? 679 00:41:30,390 --> 00:41:32,820 Sortieren von nichts. Es ist nicht unbedingt jetzt nichts. 680 00:41:32,820 --> 00:41:37,630 Jetzt ist es nur nichts, weil ein wenig etwas geschieht in Form dieser Tabelle. 681 00:41:37,630 --> 00:41:41,170 So gibt es eine Art von Datenbank oder Tabelle innerhalb der Speicher eines Computers 682 00:41:41,170 --> 00:41:44,470 das im wesentlichen 1 Spalte für Dateinamen, 683 00:41:44,470 --> 00:41:50,550 und 1 Spalte Speicherort der Datei, wo dieser Ort 123, nur eine zufällige Zahl sein könnte. 684 00:41:50,550 --> 00:41:58,270 So haben wir vielleicht so etwas wie x.jpg und Standort 123. 685 00:41:58,270 --> 00:42:02,870 Und was passiert dann, wenn Sie Ihren Papierkorb leeren? 686 00:42:02,870 --> 00:42:06,720 Das geht weg. Aber was geht nicht weg ist die 0 und 1 ist. 687 00:42:06,720 --> 00:42:09,690 >> Also, was ist, dann, um die Verbindung PSET 4? 688 00:42:09,690 --> 00:42:13,460 Nun, mit pset 4, nur weil wir versehentlich gelöscht 689 00:42:13,460 --> 00:42:15,890 die Compact-Flash-Karte, die alle diese Fotos hatte, 690 00:42:15,890 --> 00:42:18,710 oder einfach nur, weil sie vom Pech beschädigt wurde, 691 00:42:18,710 --> 00:42:21,170 bedeutet nicht, dass die 0 und 1 ist nicht immer noch da. 692 00:42:21,170 --> 00:42:23,920 Vielleicht ein paar von ihnen sind verloren, weil etwas habe beschädigt 693 00:42:23,920 --> 00:42:26,530 in dem Sinne, dass einige 0en 1 und 1 ist geworden wurde 0en. 694 00:42:26,530 --> 00:42:30,460 Bad Dinge passieren können, weil fehlerhafte Software oder fehlerhafte Hardware. 695 00:42:30,460 --> 00:42:33,510 Aber viele dieser Bits, vielleicht sogar 100% von ihnen sind immer noch da, 696 00:42:33,510 --> 00:42:38,330 es ist nur, dass der Computer oder die Kamera nicht weiß, wo JPEG 1 gestartet 697 00:42:38,330 --> 00:42:41,660 und wo JPEG 2 gestartet, aber wenn Sie, der Programmierer, 698 00:42:41,660 --> 00:42:45,800 wissen, mit ein wenig versierte, wo diese JPEGs sind oder wie sie aussehen, 699 00:42:45,800 --> 00:42:49,570 Sie analysieren die 0 und 1 ist und sagen: 'Ooh. JPEG. Ooh, JPEG. 700 00:42:49,570 --> 00:42:52,830 Sie können ein Programm mit im wesentlichen nur eine für Schreib-oder while-Schleife 701 00:42:52,830 --> 00:42:56,100 dass wieder jede und jeder dieser Dateien. 702 00:42:56,100 --> 00:42:59,360 So die Lehre ist also zu beginnen "sicher" Löschen von Dateien 703 00:42:59,360 --> 00:43:01,720 wenn Sie möchten, dies ganz zu vermeiden. Ja? 704 00:43:01,720 --> 00:43:06,940 [Studenten Frage unverständlich] 705 00:43:06,940 --> 00:43:11,150 >> Mehr Speicher als vorher - 706 00:43:11,150 --> 00:43:14,790 Oh! Gute Frage. Warum also, nach dem Entleeren des Papierkorbs, 707 00:43:14,790 --> 00:43:18,300 wird Ihr Computer Ihnen sagen, dass Sie mehr freien Speicherplatz als vorher haben? 708 00:43:18,300 --> 00:43:22,450 In einer Nussschale, weil sie lügt. Mehr technisch, haben Sie mehr Platz. 709 00:43:22,450 --> 00:43:26,720 Weil Sie jetzt gesagt haben, kannst du andere Sachen, wo die Datei einmal war, 710 00:43:26,720 --> 00:43:28,930 aber das bedeutet nicht, dass die Bits weg, 711 00:43:28,930 --> 00:43:33,070 und das bedeutet nicht, dass die Bits sind alle 0 s geändert, zum Beispiel für Ihren Schutz. 712 00:43:33,070 --> 00:43:37,520 Im Gegensatz dazu, wenn man "sicher" Löschen von Dateien oder physisch das Gerät zerstören, 713 00:43:37,520 --> 00:43:40,810 das ist wirklich der einzige Weg, manchmal, um die. 714 00:43:40,810 --> 00:43:45,300 Also, warum nicht wir auf diesem semi-beängstigend beachten verlassen, und wir werden Sie am Montag zu sehen. 715 00:43:45,300 --> 00:43:52,810 CS50.TV