1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [HÉT 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Harvard University] 3 00:00:04,760 --> 00:00:11,990 [Ez a CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Nő] Hazudik, hogy mit, azt nem tudom. 5 00:00:17,780 --> 00:00:20,300 [Man] Szóval, mit tudunk? 6 00:00:20,300 --> 00:00:24,120 [Nő] Ez 9:15-kor, Ray Santoya volt az ATM. 7 00:00:24,120 --> 00:00:27,420 [Man] Tehát a kérdés az, hogy mit csinál a 9:16? 8 00:00:27,420 --> 00:00:29,980 [Nő] Lövés a 9 mm-es valamit. 9 00:00:29,980 --> 00:00:31,900 Talán látta a mesterlövész. 10 00:00:31,900 --> 00:00:34,000 [Man] Vagy dolgozott vele. 11 00:00:34,000 --> 00:00:36,330 [Nő] Várj. Menj vissza egy. 12 00:00:36,330 --> 00:00:38,330 [Man] Mit látsz? 13 00:00:38,330 --> 00:00:44,520 [♫ ♫ izgalmas music] 14 00:00:44,520 --> 00:00:48,320 [Nő] Hozd arcát felfelé. Teljes képernyő. 15 00:00:48,320 --> 00:00:51,230 [Man] a szemüvegét. >> Van egy reflexió. 16 00:00:51,230 --> 00:01:00,810 [♫ ♫ izgalmas music] 17 00:01:00,810 --> 00:01:03,580 [Man] Ez a Nuevita baseball csapata. Ez a logo. 18 00:01:03,580 --> 00:01:07,790 [Nő] És ő beszél aki visel, hogy a kabát. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Szóval ez CS50 héten 5, és ma már tönkre egy kicsit a televíziós és film az Ön számára. 20 00:01:13,730 --> 00:01:16,170 Szóval amikor nézed a show, mint ez itt, 21 00:01:16,170 --> 00:01:19,910 és a rendőrök azt mondják: "Tud tiszta, hogy akár?" vagy "Enhance" 22 00:01:19,910 --> 00:01:21,900 nincs fokozza a valós világban. 23 00:01:21,900 --> 00:01:25,220 Valójában, amit igazán kap egy kicsit valami ilyesmi. 24 00:01:25,220 --> 00:01:27,570 Már húzta fel az egyik személyzeti képek az oldalt. 25 00:01:27,570 --> 00:01:30,980 Ez a program neve Photoshop. Ez 1 of 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 3 Bowdens valójában, ma, mert már Mrs. Bowden itt is, Rob és Paul. 27 00:01:36,300 --> 00:01:41,950 De itt van Rob a képernyőn, és ha nagyítani kell e villanás ő mindig a szeme, 28 00:01:41,950 --> 00:01:47,600 amit valóban látni, hogy amit látsz, amit kapsz. 29 00:01:47,600 --> 00:01:51,690 Ez a "továbbfejlesztett", így "CSI" van egy kicsit rossz. 30 00:01:51,690 --> 00:01:55,190 Van még egy klip, ha tudjuk felvenni a "CSI" csak egy kicsit hosszabb. 31 00:01:55,190 --> 00:01:58,500 Ez egy szép mondatot kimondani ezentúl, ha azt szeretné, hogy 32 00:01:58,500 --> 00:02:10,280 alapos műszaki barátaival, amikor tényleg mondasz semmit. 33 00:02:10,280 --> 00:02:12,970 >> [Férfi] A héten én már vizsgálja a taxis gyilkos gyilkosságok 34 00:02:12,970 --> 00:02:15,360 egy bizonyos morbid lenyűgöző. 35 00:02:15,360 --> 00:02:17,160 [Woman # 1] Ez a valós időben. 36 00:02:17,160 --> 00:02:22,930 [Woman # 2] fogok létrehozni egy grafikus felület segítségével Visual Basic, hátha tudok követni az IP-címet. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Szóval audio out of sync területpihentetés, ami egy grafikus felület segítségével Visual Basic 38 00:02:29,570 --> 00:02:31,820 követni az IP-cím teljes képtelenség. 39 00:02:31,820 --> 00:02:33,840 Ezek a napok, hogy nem használja a Visual Basic, 40 00:02:33,840 --> 00:02:38,920 nincs szükség a GUI-t, és az IP-cím egy technikailag pontos kifejezés. 41 00:02:38,920 --> 00:02:41,730 Így tartsa a szemét ki ezeket, és az egyik kedvencem: 42 00:02:41,730 --> 00:02:45,070 Ez az ember egy kicsit misztikus, mert tudnia kell, egy másik nyelvet. 43 00:02:45,070 --> 00:02:47,860 Van egy nyelv úgynevezett Objective-C, amely felülbírálja a C. 44 00:02:47,860 --> 00:02:51,960 Ami azt jelenti, hogy a C, valamint néhány további funkciók, köztük az objektum-orientált programozás. 45 00:02:51,960 --> 00:02:55,070 És ez az a nyelv, amely az Apple népszerű for iOS programozással. 46 00:02:55,070 --> 00:02:58,760 És itt egy klip egy másik mindet teljesen, a "számok" 47 00:02:58,760 --> 00:03:02,450 hogy ha valóban jobban megnézed a TiVo és a szünet a megfelelő pillanatban, 48 00:03:02,450 --> 00:03:07,700 látni fogod, hogy mit néz, nem elég, amit éppen le. 49 00:03:07,700 --> 00:03:11,170 És hadd próbálkozzon egy másik audio csatlakozó ide, hátha nem tudunk 50 00:03:11,170 --> 00:03:13,780 hogy a hang szinkronban ebben az időben. 51 00:03:13,780 --> 00:03:20,530 Adok "Számok". 52 00:03:20,530 --> 00:03:23,240 >> [Man # 1] Ez egy 32-bites IPv4 címet. 53 00:03:23,240 --> 00:03:38,930 [Man # 2] IP, ez az interneten. >> Private hálózat. Ez Anita privát hálózat. 54 00:03:38,930 --> 00:03:43,810 [Malan] Oké. Ez az Objective-C, és ez néhány gyerek színezés program, 55 00:03:43,810 --> 00:03:51,140 amennyit csak lehet talán következtetni a nevét a változó van. 56 00:03:51,140 --> 00:03:54,410 Szóval, hogy akkor volt a "számok". Szóval ma, és ezen a héten bemutatjuk 57 00:03:54,410 --> 00:03:57,740 egy kicsit a világ kriminalisztika és a környezet, a problémák tehát. 58 00:03:57,740 --> 00:04:00,590 Ma lesz egy rövidített előadás, mert van egy különleges esemény itt! 59 00:04:00,590 --> 00:04:05,530 utána, így lesz egy pillantást, és kötekedik a diákok és a szülők egyaránt ma 60 00:04:05,530 --> 00:04:07,420 néhány, a dolgok, amelyek a horizonton. 61 00:04:07,420 --> 00:04:12,240 Közülük, mint hétfőn, akkor néhány osztálytársaival. 62 00:04:12,240 --> 00:04:16,050 EDX, a Harvard és a MITS új online kezdeményezés a nyílt oktatóprogram 63 00:04:16,050 --> 00:04:19,120 és több, indít a Harvard egyetemen hétfőn. 64 00:04:19,120 --> 00:04:21,490 Ami azt jelenti, gyere hétfő lesz - ahogy az utolsó szám, 65 00:04:21,490 --> 00:04:26,210 86.000 további osztálytársai fogják követően együtt CS50 előadásaiból 66 00:04:26,210 --> 00:04:29,170 és a szakaszok és walkthroughs és a probléma készletek. 67 00:04:29,170 --> 00:04:32,350 És ennek részeként, akkor tagja lesz az alakuló osztály 68 00:04:32,350 --> 00:04:35,090 CS50 és most CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Ennek részeként, most észre, hogy lesz néhány upsides is. 70 00:04:39,310 --> 00:04:43,790 Ahhoz, hogy készen áll erre, a nagy hallgatói létszám, 71 00:04:43,790 --> 00:04:47,180 elegendő annyit mondani, hogy bár van 108 TF és CA, 72 00:04:47,180 --> 00:04:50,790 nem egészen a legjobb diák / tanár arány, ha elérünk 80.000 más versenyző. 73 00:04:50,790 --> 00:04:52,850 Szóval nem lesz osztályozó annyi probléma készletek kézzel. 74 00:04:52,850 --> 00:04:55,920 Szóval be ezen a héten a probléma halmaz lesz CS50 Check, 75 00:04:55,920 --> 00:04:58,450 ami lesz parancssori segédprogram belül a készüléket 76 00:04:58,450 --> 00:05:01,200 hogy kapsz ha egyszer frissíti később ezen a hétvégén, 77 00:05:01,200 --> 00:05:03,200 és akkor lesz képes futtatni egy parancsot, ellenőrizze 50, 78 00:05:03,200 --> 00:05:06,500 saját Pset, és kapsz némi visszajelzést arról, hogy a program 79 00:05:06,500 --> 00:05:11,160 helyes vagy helytelen szerint a különböző tervezési előírások általunk biztosított. 80 00:05:11,160 --> 00:05:13,580 Szóval inkább ezt, és a probléma meg specifikáció és 81 00:05:13,580 --> 00:05:17,240 A CS50x osztálytársai fogja használni ezt is. 82 00:05:17,240 --> 00:05:19,230 >> Szóval probléma halmaz 4 szól kriminalisztika. 83 00:05:19,230 --> 00:05:21,940 És ez a darab ihlette néhány valós dolog, 84 00:05:21,940 --> 00:05:24,620 amely koromban egyetemre, én internálták egy ideig 85 00:05:24,620 --> 00:05:28,650 A Middlesex megyei kerületi ügyész hivatala csinál törvényszéki munkát 86 00:05:28,650 --> 00:05:31,650 azok vezető törvényszéki nyomozó, és mi ez az összeg 87 00:05:31,650 --> 00:05:35,260 van, azt hiszem, már említettem, néhány hét múlt, a Mass állam rendőri vagy más 88 00:05:35,260 --> 00:05:39,000 jönne, akkor lehull dolgok, mint a merevlemezek, valamint CD-és floppy lemezek 89 00:05:39,000 --> 00:05:42,340 és a hasonlók, és majd a cél a törvényszéki hivatal volt, hogy megállapítsa, hogy a 90 00:05:42,340 --> 00:05:44,600 nem volt, vagy nem volt bizonyíték valami. 91 00:05:44,600 --> 00:05:48,010 Ez volt a különleges vizsgálatok Unit, így volt a fehérgalléros bűnözés, 92 00:05:48,010 --> 00:05:52,350 ez több volt aggasztó fajta bűncselekmények, 93 00:05:52,350 --> 00:05:55,990 bármi érintő valamilyen digitális média, kiderül, hogy nem, hogy sok ember 94 00:05:55,990 --> 00:05:59,370 írjon egy e-mailt mondván: "Én tettem". 95 00:05:59,370 --> 00:06:03,290 Szóval elég gyakran ezek kriminalisztika keresések nem kapcsolja fel az összes, hogy sok gyümölcs, 96 00:06:03,290 --> 00:06:05,850 de néha az emberek levelet az ilyen e-maileket. 97 00:06:05,850 --> 00:06:08,490 Szóval néha erőfeszítéseket jutalmazták. 98 00:06:08,490 --> 00:06:14,420 >> De ahhoz, hogy vezet fel e törvényszéki Pset, mi lesz bevezetésével Pset 4 egy kicsit grafika. 99 00:06:14,420 --> 00:06:18,260 Szóval talán ezeket a dolgokat kiadni, JPEG, GIF és hasonló ezekben a napokban, 100 00:06:18,260 --> 00:06:21,640 de ha igazán belegondolunk, egy képet, ugyanúgy, mint Rob arca, 101 00:06:21,640 --> 00:06:24,430 lehet modellezni sorozatát pontok, vagy a pixel. 102 00:06:24,430 --> 00:06:26,680 Nos, abban az esetben, Rob arca, van mindenféle színben, 103 00:06:26,680 --> 00:06:29,940 és elkezdtük, hogy az egyes pontok, otherwide nevei pixel, 104 00:06:29,940 --> 00:06:31,610 egyszer elkezdtük a nagyításhoz be 105 00:06:31,610 --> 00:06:35,590 De ha egyszerűsítik a világot egy kicsit, és csak azt mondják, hogy ez itt Rob 106 00:06:35,590 --> 00:06:40,560 fekete-fehér, valamint, hogy képviselje fekete és fehér tudjuk csak használni bináris. 107 00:06:40,560 --> 00:06:44,960 És ha fogunk használni bináris, 1 vagy 0, tudjuk, hogy ezt az ugyanazt a képet 108 00:06:44,960 --> 00:06:51,970 Rob mosolygó arcát ez a minta a bitek: 11000011 jelentése 109 00:06:51,970 --> 00:06:55,160 fehér, fehér, fekete, fekete, fekete, fekete, fehér, fehér. 110 00:06:55,160 --> 00:06:59,290 És ez nem egy hatalmas ugrás, akkor kezdeni beszélni színes fényképek. 111 00:06:59,290 --> 00:07:01,920 Azok a dolgok, akkor látni a Facebook-on, vagy tegyen egy digitális fényképezőgép, 112 00:07:01,920 --> 00:07:04,730 de, természetesen, amikor a színeket, meg kell több bitet. 113 00:07:04,730 --> 00:07:08,470 És elég gyakori a világ fényképek használata nem 1-bites szín, 114 00:07:08,470 --> 00:07:12,730 mivel ez azt sugallja, de 24-bit szín, ahol tényleg kap millió szín. 115 00:07:12,730 --> 00:07:15,430 Szóval, abban az esetben, amikor nagyított részt Rob szemében, 116 00:07:15,430 --> 00:07:19,270 volt bármennyi millió különböző színes lehetőségeket. 117 00:07:19,270 --> 00:07:22,260 >> Így fogunk bevezetni ezt a problémát meg 4, valamint a walkthrough, 118 00:07:22,260 --> 00:07:27,050 melyik lesz ma 3:30 helyett a szokásos 2:30 mert a pénteki előadás itt. 119 00:07:27,050 --> 00:07:29,930 De a video lesz online, mint mindig, holnap. 120 00:07:29,930 --> 00:07:31,880 Majd azt is bemutatni, hogy egy másik fájlformátumban. 121 00:07:31,880 --> 00:07:34,150 Szóval ez szándékosan célja, hogy nézd félelmetes az első, 122 00:07:34,150 --> 00:07:38,980 de ez csak néhány dokumentumot a C struct. 123 00:07:38,980 --> 00:07:42,280 Kiderül, hogy a Microsoft, évekkel ezelőtt, segített népszerűsíteni ezt a formátumot, 124 00:07:42,280 --> 00:07:46,630 az úgynevezett bitmap fájlformátumot, BMP, és ez volt a szuper-egyszerű, 125 00:07:46,630 --> 00:07:50,390 színes, grafikai formátumban is használt jó ideje 126 00:07:50,390 --> 00:07:53,640 és néha még a háttérképeket az asztali gépek. 127 00:07:53,640 --> 00:07:57,410 Ha úgy gondolja, vissza a Windows XP és a dombok és a kék ég, 128 00:07:57,410 --> 00:08:00,660 ez jellemzően egy BMP vagy bitmap kép, és bitmap 129 00:08:00,660 --> 00:08:03,340 szórakoztató számunkra, mert egy kicsit bonyolult. 130 00:08:03,340 --> 00:08:05,640 Ez nem annyira egyszerű, mint ez a rács a 0 és 1-es; 131 00:08:05,640 --> 00:08:10,680 helyett, akkor a dolgok, mint a fejléc elején egy fájlt. 132 00:08:10,680 --> 00:08:15,520 Más szóval, belül. Bmp fájl egy csomó a 0 és 1-es, 133 00:08:15,520 --> 00:08:18,070 de van néhány további 0 és 1-es ott. 134 00:08:18,070 --> 00:08:21,450 És kiderül, hogy mi az, amit valószínűleg magától értetődőnek évek, 135 00:08:21,450 --> 00:08:27,040 fájlformátumokat, mint a. doc vagy. xls vagy. mp3 vagy. mp4, 136 00:08:27,040 --> 00:08:29,910 függetlenül a fájlformátumokat Ön ismeri. 137 00:08:29,910 --> 00:08:31,900 Nos, mit is jelent, hogy egy fájl formátum? 138 00:08:31,900 --> 00:08:35,740 Mert a végén a nap, mind a fájlok általunk használt imént 0 és 1-es 139 00:08:35,740 --> 00:08:39,950 és talán a 0 és 1-es jelentenek, b, c, keresztül ASCII vagy a hasonló, 140 00:08:39,950 --> 00:08:42,030 hanem az a nap végén, ez csak 0 és 1-es. 141 00:08:42,030 --> 00:08:45,300 >> Szóval az emberek csak alkalmanként úgy, hogy kitaláljon egy új fájlformátumot 142 00:08:45,300 --> 00:08:49,420 amennyiben azok szabványosítása milyen mintákat bitet jelent valójában. 143 00:08:49,420 --> 00:08:52,790 És ebben az esetben is az emberek, akik célja a bitmap formátum 144 00:08:52,790 --> 00:08:58,260 azt mondta, hogy az első byte egy bitmap fájlt, például jelölése offset 0, ott, 145 00:08:58,260 --> 00:09:02,320 ott lesz valami rejtélyes nevű nevű változó bfType, 146 00:09:02,320 --> 00:09:06,510 ami csak áll a bitmap fájl típusát, milyen típusú bitképfájl ez. 147 00:09:06,510 --> 00:09:10,780 Lehet következtetni, talán a második sort offset 2, byte szám 2, 148 00:09:10,780 --> 00:09:15,980 egy minta a 0 és 1-es azt jelenti, mi? 149 00:09:15,980 --> 00:09:18,320 A méret a valamit, és ez megy onnan. 150 00:09:18,320 --> 00:09:20,660 Tehát a probléma készlet 4, akkor meg kell végigsétált néhány ezeket a dolgokat. 151 00:09:20,660 --> 00:09:24,480 >> Nem fogunk a végén törődve mindet, de észre, hogy kezd érdekes 152 00:09:24,480 --> 00:09:30,780 körül vonal vagy byte 54, rgbtBlue, zöld és piros. 153 00:09:30,780 --> 00:09:35,280 Ha valaha is hallotta a betűszó RGB, piros, zöld, kék, ez a hivatkozás, hogy a. 154 00:09:35,280 --> 00:09:37,840 Mert kiderült, hogy tudja festeni a színek a szivárvány 155 00:09:37,840 --> 00:09:41,580 néhány kombinációja piros, kék és zöld. 156 00:09:41,580 --> 00:09:46,560 És valóban, a szülők a szobában lehet felidézni néhány, a legkorábbi projektorok. 157 00:09:46,560 --> 00:09:49,360 Ezek a napok, csak lásd 1 erős fény jön ki a lencse. 158 00:09:49,360 --> 00:09:52,870 De térjünk vissza a nap, akkor volt a vörös lencse, a kék lencse, és a zöld lencse 159 00:09:52,870 --> 00:09:56,620 és együtt, amelynek célja a képernyőn, és kialakított egy színes képet. 160 00:09:56,620 --> 00:09:59,590 És gyakran közép iskolák és főiskolák volna e lencsék 161 00:09:59,590 --> 00:10:02,680 mindig úgy kissé ferdén, így volt, egyfajta látás dupla vagy tripla képek 162 00:10:02,680 --> 00:10:07,500 de ez volt az ötlet. Nem volt piros, zöld és kék fény festő egy képet. 163 00:10:07,500 --> 00:10:09,570 És ez elvet használt számítógépek. 164 00:10:09,570 --> 00:10:12,000 >> Tehát között a kihívásokat, akkor az Ön számára a probléma szett 4 165 00:10:12,000 --> 00:10:16,080 lesznek egy pár dolgot, az egyik az, hogy valóban átméretezi a képet. 166 00:10:16,080 --> 00:10:18,050 Ahhoz, hogy a minta a 0 és 1-es, 167 00:10:18,050 --> 00:10:22,840 kitaláljuk, melyik darabokat a 0 és 1-es képviseli, amit a szerkezet, mint ez, 168 00:10:22,840 --> 00:10:26,800 majd kitaláljuk, hogyan lehet lemásolni a pixelek: a vörös, a kék, a zöld 169 00:10:26,800 --> 00:10:32,460 benne, hogy amikor a kép úgy néz ki, mint ez kezdetben ilyesmi inkább után. 170 00:10:32,460 --> 00:10:35,590 Az egyéb kihívások is lesz, hogy akkor át kell adni 171 00:10:35,590 --> 00:10:38,900 törvényszéki kép tényleges fájl egy digitális fényképezőgép 172 00:10:38,900 --> 00:10:42,410 és az, hogy a kamera, egyszer régen, volt egy csomó fotók. 173 00:10:42,410 --> 00:10:47,030 A probléma az, hogy véletlenül törölte, vagy volt a kép sérült valahogy. 174 00:10:47,030 --> 00:10:51,040 Rossz dolgok történnek, a digitális fényképezőgépek, és így gyorsan másolt összes 0 és 1-es 175 00:10:51,040 --> 00:10:55,410 le, hogy a kártya az Ön számára, mentette meg őket mind 1 big fájlt, aztán adja át őket, hogy Ön 176 00:10:55,410 --> 00:11:00,000 a probléma szett 4 így írni egy programot C-ben, amellyel vissza 177 00:11:00,000 --> 00:11:02,660 Mindezen JPEG, ideális esetben. 178 00:11:02,660 --> 00:11:06,280 És kiderül, hogy a JPEG, annak ellenére, hogy kissé összetett fájl formátum, 179 00:11:06,280 --> 00:11:09,580 ők sokkal összetettebb, mint a mosolygó arc itt. 180 00:11:09,580 --> 00:11:14,320 Kiderült, hogy minden JPEG kezdődik az azonos minták a 0 és 1-es. 181 00:11:14,320 --> 00:11:18,820 Tehát egy while vagy for ciklus vagy hasonló, 182 00:11:18,820 --> 00:11:22,350 akkor ismételget egész a 0 és 1-es e törvényszéki kép 183 00:11:22,350 --> 00:11:26,670 és minden alkalommal, amikor látni a különleges minta, ami meghatározott probléma set specifikációja, 184 00:11:26,670 --> 00:11:29,770 akkor feltételezhető, hogy "Ó, itt van, nagyon nagy a valószínűsége, 185 00:11:29,770 --> 00:11:33,520 a kezdete a JPEG ", és amint megtalálják ugyanazt a mintát, 186 00:11:33,520 --> 00:11:36,050 egyes bájtok száma vagy kilobyte vagy megabájt később, 187 00:11:36,050 --> 00:11:40,550 akkor feltételezhető, "Ó! Itt van egy második JPEG, a kép vettem az első után. 188 00:11:40,550 --> 00:11:44,720 Engedjék meg, hagyd abba az olvasást, hogy az első fájlra, kezdjük el írni ezt újat. " 189 00:11:44,720 --> 00:11:49,980 És a kimenet a program Pset 4 lesz több mint 50 JPEG. 190 00:11:49,980 --> 00:11:52,400 És ha ez nem 50 JPEG, van egy kis hurok. 191 00:11:52,400 --> 00:11:55,580 Ha van egy végtelen számú JPEG, van egy végtelen ciklusba. 192 00:11:55,580 --> 00:11:58,280 Szóval, hogy is lesz elég gyakori eset. 193 00:11:58,280 --> 00:12:00,280 Ez az, ami a horizonton. 194 00:12:00,280 --> 00:12:03,740 >> Kvíz 0, mögöttünk. Ismerd fel, egy e-mail címemet, hogy mindig ott van srácok 195 00:12:03,740 --> 00:12:06,820 akik mindketten boldogok, egyfajta semleges, és szomorú körülbelül kvíz 0 idő. 196 00:12:06,820 --> 00:12:10,160 És kérem, nem érhetünk el nekem, a fej TFs, Zamyla, saját TF 197 00:12:10,160 --> 00:12:14,120 vagy az egyik CA, hogy tudod, ha szeretné, hogy megvitassák, hogyan mentek a dolgok. 198 00:12:14,120 --> 00:12:16,460 >> Tehát, hogy lenyűgözni a szülők itt a szobában, 199 00:12:16,460 --> 00:12:23,990 mi a CS50 könyvtár? Szép munka. 200 00:12:23,990 --> 00:12:32,280 Mi a CS50 könyvtár? Igen? [Student válaszok, érthetetlen] 201 00:12:32,280 --> 00:12:35,730 >> Oké, jó. Tehát ez egy előre megírt sor kódot, hogy mi, a személyzet, írta, 202 00:12:35,730 --> 00:12:38,460 nyújtunk az Ön számára, hogy néhány közös funkciók. 203 00:12:38,460 --> 00:12:42,290 Ilyesmi nekem egy string; érts int, az összes funkciót, amelyek az itt felsorolt. 204 00:12:42,290 --> 00:12:45,260 Kezdő most kezdjük igazán figyelembe e képzési kerekekkel. 205 00:12:45,260 --> 00:12:48,230 Így fogunk kezdeni, hogy vegye el a "string" tőled, 206 00:12:48,230 --> 00:12:52,790 amely visszahívás, csak egy szinonimája, amit a tényleges adatok típus? char *. 207 00:12:52,790 --> 00:12:57,020 Így a szülők, ez volt talán - ez jó, így char * kezdünk látni 208 00:12:57,020 --> 00:13:00,810 a képernyőn, annál is inkább, ahogy eltávolítani "string" a mi szókincs, 209 00:13:00,810 --> 00:13:02,760 legalábbis amikor ténylegesen kódot írni. 210 00:13:02,760 --> 00:13:06,240 Hasonlóképpen, akkor hagyja abba a néhány ezeket a funkciókat, mint sok, 211 00:13:06,240 --> 00:13:08,390 mert a programokat fog kapni kifinomultabb 212 00:13:08,390 --> 00:13:11,370 ahelyett, hogy csak levelet programok, üljön ott a prompt villog, 213 00:13:11,370 --> 00:13:13,580 várakozás, hogy a felhasználó, hogy írja be valami 214 00:13:13,580 --> 00:13:15,220 Megkapod a bemenetek máshol. 215 00:13:15,220 --> 00:13:18,720 Például, kapsz őket egy sor bit a helyi merevlemezre. 216 00:13:18,720 --> 00:13:23,340 Majd ahelyett, hogy azokat a jövőben a hálózati kapcsolatot, néhány honlap valahol. 217 00:13:23,340 --> 00:13:27,460 Szóval héjúak vissza, ez a réteg az első alkalommal, és húzza ki a készüléket CS50 218 00:13:27,460 --> 00:13:32,300 és ez a nevű fájlt CS50.h, melyeket a már éles, beleértve hetekig. 219 00:13:32,300 --> 00:13:34,380 >> De nézzük valóban látni mi van benne jelen. 220 00:13:34,380 --> 00:13:38,250 Így a tetején a fájl a kék csak egy csomó észrevételek 221 00:13:38,250 --> 00:13:41,340 jótállási információk és engedélyezés. Ez egyfajta közös paradigma 222 00:13:41,340 --> 00:13:44,600 a szoftver, mert sok szoftver ezekben a napokban az úgynevezett "nyílt forráskódú" 223 00:13:44,600 --> 00:13:46,940 ami azt jelenti, hogy valaki írt a kódot 224 00:13:46,940 --> 00:13:50,060 és tette szabadon hozzáférhető, nem csak futni és használni, 225 00:13:50,060 --> 00:13:53,660 de valójában olvasni és módosítja, és integrálható a saját munkáját. 226 00:13:53,660 --> 00:13:55,790 Szóval ez az, amit használ, a nyílt forráskódú szoftverek, 227 00:13:55,790 --> 00:13:58,030 bár nagyon kis formában. 228 00:13:58,030 --> 00:14:01,860 Ha lapozzunk lefelé múltban a megjegyzéseket, bár, akkor elkezd látni néhány ismerős dolgot. 229 00:14:01,860 --> 00:14:08,090 Így észre a tetején van, hogy a CS50.h fájl tartalmazza egy csomó header fájlokat. 230 00:14:08,090 --> 00:14:11,160 Nos, a legtöbb ilyen még nem látott, de az egyik 231 00:14:11,160 --> 00:14:15,640 ismerős, melyik láttunk, de röviden, eddig? 232 00:14:15,640 --> 00:14:18,720 Ja, standard könyvtárak. Stdlib.h van malloc, 233 00:14:18,720 --> 00:14:21,590 így ha elkezdtünk beszélni dinamikus memória kiosztás, 234 00:14:21,590 --> 00:14:24,960 amely akkor jön vissza a jövő héten is, elkezdtük beleértve a fájlt. 235 00:14:24,960 --> 00:14:29,660 Kiderül, hogy bool és igaz és a hamis valójában nem léteznek C, önmagában, 236 00:14:29,660 --> 00:14:32,460 kivéve, ha ezt a fájlt. 237 00:14:32,460 --> 00:14:35,770 Szóval már, hetekig, nem beleértve a standard bool.h 238 00:14:35,770 --> 00:14:39,020 úgy, hogy tudod használni a fogalmát a bool, igaz vagy hamis. 239 00:14:39,020 --> 00:14:41,830 E nélkül meg kellett volna rendezni a hamis, és használni int 240 00:14:41,830 --> 00:14:45,920 és csak önkényesen feltételezik, hogy a 0 és 1 hamis igaz. 241 00:14:45,920 --> 00:14:49,980 >> Most, ha görgessen tovább, itt a mi meghatározása a string. 242 00:14:49,980 --> 00:14:54,820 Kiderült, ahogy azt már korábban mondtam, hogy ha ez a * nem igazán számít. 243 00:14:54,820 --> 00:14:56,750 Akkor is van hely körül. 244 00:14:56,750 --> 00:15:01,550 Mi, ebben a félévben, mindig is támogatták azt, hogy ez egyértelművé teszi, hogy a * köze a típusnak. 245 00:15:01,550 --> 00:15:05,370 De észre, csak a közös, ha nem egy kicsit több közös, az, hogy ott 246 00:15:05,370 --> 00:15:07,480 de funkcionálisan ez ugyanaz a dolog. 247 00:15:07,480 --> 00:15:11,070 De most, ha azt olvassuk le a további, vessünk egy pillantást mondjuk, getInt, 248 00:15:11,070 --> 00:15:15,350 mert használják, hogy talán, mielőtt bármi más ebben a félévben. 249 00:15:15,350 --> 00:15:19,620 És itt van getInt. Ez az, amit? 250 00:15:19,620 --> 00:15:24,650 Ez a prototípus. Oly gyakran, mi tesz prototípusok a tetejét a. C kép, 251 00:15:24,650 --> 00:15:28,190 de akkor is fel prototípusok header fájlokat. h fájlokat, 252 00:15:28,190 --> 00:15:32,110 mint ez itt, hogy amikor írsz, bizonyos funkciók 253 00:15:32,110 --> 00:15:36,790 azt szeretnénk, hogy más emberek hogy képes legyen használni, ami pontosan a helyzet a CS50 könyvtár, 254 00:15:36,790 --> 00:15:40,900 nem csak végre a feladatokat valami hasonló CS50.c, 255 00:15:40,900 --> 00:15:46,720 Ön is tegye a prototípusok nem a tetején, hogy a fájl, de a tetején egy header fájl, 256 00:15:46,720 --> 00:15:50,810 akkor a header fájlt, amit barátok és a kollégák között, 257 00:15:50,810 --> 00:15:52,800 éles közé a saját kódját. 258 00:15:52,800 --> 00:15:55,440 Szóval ez alkalommal már, beleértve az összes ilyen prototípusok 259 00:15:55,440 --> 00:15:59,870 hatékonyan a tetején a fájl, de ahogy ezen éles közé mechanizmus 260 00:15:59,870 --> 00:16:03,320 hogy lényegében másolatok és paszták ezt a fájlt a saját. 261 00:16:03,320 --> 00:16:06,400 Nos, itt van néhány meglehetősen részletes dokumentáció. 262 00:16:06,400 --> 00:16:08,880 >> Már nagyjából magától értetődőnek tekinti, hogy getInt kap egy int, 263 00:16:08,880 --> 00:16:10,740 de kiderült, hogy van néhány sarok esetekben, ugye? 264 00:16:10,740 --> 00:16:14,320 Mi van, ha a felhasználó beír egy számot, hogy ez túl nagy? 265 00:16:14,320 --> 00:16:17,350 Egy trillió, hogy egyszerűen nem fér el egy int? 266 00:16:17,350 --> 00:16:21,180 Mi a várt viselkedést? Nos, ideális esetben, ez kiszámítható. 267 00:16:21,180 --> 00:16:23,460 Tehát ebben az esetben, ha valóban olvassa el az apró betűs részt, 268 00:16:23,460 --> 00:16:27,850 látni fogod, hogy amennyiben az adott vonalon nem lehet olvasni, ez visszatér INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Még soha nem beszéltünk erről, de alapuló tőkésítés, 270 00:16:30,800 --> 00:16:33,030 mi ez, talán? 271 00:16:33,030 --> 00:16:36,610 Ez egy állandó, így néhány speciális konstans, ami valószínűleg a bejelentett 272 00:16:36,610 --> 00:16:39,460 az egyik ilyen fejlécfájlokat ami feljebb a fájlba, 273 00:16:39,460 --> 00:16:43,400 és INT_MAX valószínűleg valami hasonló, kb, 2 milliárdot. 274 00:16:43,400 --> 00:16:48,160 Az ötlet az, hogy azért, mert meg kell valahogy jelzi, hogy valami baj, 275 00:16:48,160 --> 00:16:51,090 mi, igen, van 4000000000 számban állnak rendelkezésünkre, 276 00:16:51,090 --> 00:16:53,980 negatív 2 milliárd legfeljebb 2 milliárd ide vagy oda. 277 00:16:53,980 --> 00:16:58,030 Nos, mi a közös programozás te vagy lopni csak az egyik számot. 278 00:16:58,030 --> 00:17:02,250 Lehet, hogy 0, talán 2 milliárd talán negatív 2 milliárdot. 279 00:17:02,250 --> 00:17:06,720 Szóval eltölteni egy a lehetséges értékek, így kötelezzék el magukat a világnak 280 00:17:06,720 --> 00:17:10,089 hogy ha valami elromlik, vissza fogok térni a szuper-nagy érték. 281 00:17:10,089 --> 00:17:13,329 De nem akarjuk, hogy a felhasználó gépelési valami rejtélyes, mint a "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 Az igazán nagy szám, ahol általánossá, hanem, mint egy állandó. 283 00:17:17,079 --> 00:17:19,380 Szóval tényleg, ha arra, hogy az anális az elmúlt hetekben, 284 00:17:19,380 --> 00:17:23,800 bármikor hívod getInt, akkor kellett volna, ha ellenőrzi egy feltételt. 285 00:17:23,800 --> 00:17:27,109 Vajon a felhasználó típusát INT_MAX, vagy pontosabban, 286 00:17:27,109 --> 00:17:29,900 tette getInt visszatérés INT_MAX? Mert ha igen, 287 00:17:29,900 --> 00:17:35,140 hogy valójában azt jelenti, hogy nem írja, valami baj ebben az esetben. 288 00:17:35,140 --> 00:17:38,970 Szóval ez az, ami általánosan ismert, mint egy "őrszem" érték, ami csak azt jelenti, különleges. 289 00:17:38,970 --> 00:17:41,020 >> Nos, most már fordulni a. C fájlokat. 290 00:17:41,020 --> 00:17:44,500 A C fájl létezett a készülék egy ideig, 291 00:17:44,500 --> 00:17:47,540 , sőt, a készülék megvan előre lefordított Önnek 292 00:17:47,540 --> 00:17:49,720 figyelembe, hogy a dolog, amit az úgynevezett "tárgykód" 293 00:17:49,720 --> 00:17:52,940 de ez csak nem számít, hogy hol van, mert a rendszer tudja, 294 00:17:52,940 --> 00:17:54,780 ebben az esetben, ha igen, akkor a készülék. 295 00:17:54,780 --> 00:18:00,620 De nézzük görgessen le most getInt, és látom, hogy getInt dolgozott egész idő alatt. 296 00:18:00,620 --> 00:18:02,380 Tehát itt is hasonló megjegyzéseket előtt. 297 00:18:02,380 --> 00:18:04,930 Hadd nagyításához csak a kód része, 298 00:18:04,930 --> 00:18:07,410 és mi van a getInt a következő. 299 00:18:07,410 --> 00:18:12,770 Ez nem veszi be, és ez ad vissza int, while (true), így van egy szándékos végtelen ciklus 300 00:18:12,770 --> 00:18:16,560 de feltehetően fogjuk kitörni e valahogy, vagy visszatérnek ebben. 301 00:18:16,560 --> 00:18:19,890 Nézzük, hogyan is működik ez. Nos, úgy tűnik, hogy a getString 302 00:18:19,890 --> 00:18:22,550 ebben az első sorban a cikluson belül, 166. 303 00:18:22,550 --> 00:18:25,320 Ez most jó gyakorlat, mert milyen körülmények között 304 00:18:25,320 --> 00:18:30,820 lehetne getString vissza ezt speciális kulcsszó, NULL? 305 00:18:30,820 --> 00:18:38,460 Ha valami balul sül el. Mi lehet baj, ha hívja ilyesmit getString? 306 00:18:38,460 --> 00:18:42,550 Igen? [Student válasz, érthetetlen] >> Igen. Szóval talán malloc sikertelen. 307 00:18:42,550 --> 00:18:45,310 Valahol a motorháztető alatt getString hívja malloc, 308 00:18:45,310 --> 00:18:48,210 amely rendelkezésre bocsátja memória, amely lehetővé teszi a számítógép tárolja 309 00:18:48,210 --> 00:18:50,950 az összes karakter, hogy a felhasználó beír a billentyűzetet. 310 00:18:50,950 --> 00:18:53,270 És tegyük fel, a felhasználó már egy csomó szabad idő 311 00:18:53,270 --> 00:18:56,470 és gépelt még, például, mint 2 milliárd karakter. 312 00:18:56,470 --> 00:18:59,600 Több karakter, mint a számítógép is van RAM. 313 00:18:59,600 --> 00:19:02,350 Nos, getString képesnek kell lennie, hogy jelzi, hogy az Ön számára, 314 00:19:02,350 --> 00:19:05,650 még akkor is, ha ez egy szuper, szuper gyakori sarok ügyben. 315 00:19:05,650 --> 00:19:08,490 Meg valahogy, hogy képes legyen kezelni ezt, és így getString, 316 00:19:08,490 --> 00:19:11,850 ha megyünk vissza, és olvassuk el a dokumentációját, nem, sőt, vissza NULL. 317 00:19:11,850 --> 00:19:16,150 Most, ha nem sikerül getString visszaküldésével NULL, getInt fog sikertelen 318 00:19:16,150 --> 00:19:19,370 visszaküldésével INT_MAX, csak mint egy őrszem. 319 00:19:19,370 --> 00:19:22,650 Ezek csak emberi egyezményeket. Az egyetlen módja, akkor tudjuk, hogy ez a helyzet 320 00:19:22,650 --> 00:19:24,840 ha elolvassuk a dokumentációt. 321 00:19:24,840 --> 00:19:28,200 Szóval lapozzunk lefelé, ahol az int ténylegesen GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Szóval, ha lapozzunk lefelé egy kicsit tovább, összhangban van 170 hozzászólás fölött ezeket a sorokat. 323 00:19:34,220 --> 00:19:38,470 Tehát állapítsa meg, hogy 172, int n, és egy char c, és akkor ez az új funkció 324 00:19:38,470 --> 00:19:41,870 amelyek közül néhány Önök közül botlott korábban, de sscanf. 325 00:19:41,870 --> 00:19:44,190 Ez áll a string szkennelési f. 326 00:19:44,190 --> 00:19:48,580 Más szóval, adj egy húr, és én is kutatnak az információt érdekes. 327 00:19:48,580 --> 00:19:53,820 Szóval mit jelent ez? Nos, tegyük fel, hogy azt írja be, szó szerint, 1 2 3, a billentyűzet, 328 00:19:53,820 --> 00:19:59,730 , majd nyomja meg az Entert. Mi az adattípusa 1 2 3 mikor által visszaadott getString? 329 00:19:59,730 --> 00:20:05,010 Ez nyilvánvalóan egy string, ugye? Van egy string, ezért 1 2 3 valóban "1 2 3" 330 00:20:05,010 --> 00:20:07,260 -val a \ 0-nél a végét. Ez nem egy int. 331 00:20:07,260 --> 00:20:10,420 Ez nem egy szám. Úgy néz ki, mint egy szám, de ez valójában nem. 332 00:20:10,420 --> 00:20:14,680 Szóval mit getInt kell tennem? Azt olvasni, hogy a karakterlánc balról jobbra, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, és valahogy átalakítani, hogy a tényleges értéke. 334 00:20:19,010 --> 00:20:21,010 Most lehet kitalálni, hogyan kell ezt csinálni. 335 00:20:21,010 --> 00:20:24,240 Ha úgy gondolja, vissza a Pset 2, akkor valószínűleg egy kicsit kényelmes 336 00:20:24,240 --> 00:20:26,810 A Caesar vagy Vigenère így navigálhat egy string, 337 00:20:26,810 --> 00:20:29,800 tudja konvertálni karakterről ints a csákány. Ez egy csomó munka. 338 00:20:29,800 --> 00:20:32,800 Miért nem hív egy függvényt, mint sscanf azt nem, hogy az Ön számára? 339 00:20:32,800 --> 00:20:37,520 Szóval sscanf elvárja érv, ebben az esetben az úgynevezett vonal, ami egy string. 340 00:20:37,520 --> 00:20:41,310 Ezután megadhatja, az idézetek, nagyon hasonló a printf, 341 00:20:41,310 --> 00:20:44,960 mit vársz látni ezt a fonalat? 342 00:20:44,960 --> 00:20:52,980 Azt mondom, itt van, várom, hogy egy decimális szám, és talán egy karaktert. 343 00:20:52,980 --> 00:20:54,990 És majd meglátjuk, hogy miért ez a helyzet, csak egy pillanatra. 344 00:20:54,990 --> 00:20:58,440 Kiderült, hogy ez a jelölés most emlékeztető stuff 345 00:20:58,440 --> 00:21:00,840 elkezdtünk beszélni alig több mint egy héttel ezelőtt. 346 00:21:00,840 --> 00:21:05,430 >> Mi az & n és & c tesz minket? [Student válaszok, érthetetlen] 347 00:21:05,430 --> 00:21:07,610 >> Igen. Ez ad nekem a címét, n és címe c. 348 00:21:07,610 --> 00:21:10,440 De miért olyan fontos ez? Hát, tudod, hogy a funkciók C 349 00:21:10,440 --> 00:21:13,440 akkor mindig vissza értéket, vagy értékkel egyáltalán nem rendelkeznek. 350 00:21:13,440 --> 00:21:16,630 Akkor vissza int, egy string, egy úszó, egy char, mindegy. 351 00:21:16,630 --> 00:21:21,150 Vagy akkor vissza semmis, de csak vissza 1 dolog maximálisan. 352 00:21:21,150 --> 00:21:26,100 De itt akarunk sscanf vissza hozzám talán egy int, egy decimális szám, 353 00:21:26,100 --> 00:21:29,240 és egy char, és leírom, miért char egy pillanat. 354 00:21:29,240 --> 00:21:34,250 Szóval hatékonyan szeretné f visszatérni 2 dolog, hogy ez egyszerűen nem lehetséges, C. 355 00:21:34,250 --> 00:21:38,460 Így megkerüli ezt átadásával a 2 címet, 356 00:21:38,460 --> 00:21:43,710 mert amint átadja a funkció 2 címeket, mit tud ez a funkció csinálni velük? 357 00:21:43,710 --> 00:21:49,880 Meg lehet írni ezeket a címeket. Használhatja a * művelet és "ott", hogy minden egyes ilyen címeket. 358 00:21:49,880 --> 00:21:54,320 Ez a fajta a backdoor mechanizmus, de nagyon gyakori a változó a változók értékei 359 00:21:54,320 --> 00:21:58,020 több, mint csak 1 hely, a jelen esetben 2. 360 00:21:58,020 --> 00:22:04,590 Most észre én ellenőrzésekor == to1, majd vissza n ha ez valójában, értékeli az igaz. 361 00:22:04,590 --> 00:22:09,340 Szóval, mi folyik itt? Nos, gyakorlatilag minden, amit igazán akar történni getInt ez. 362 00:22:09,340 --> 00:22:12,340 Azt akarjuk, hogy elemezze, hogy úgy mondjam, azt akarjuk, hogy olvassa el a húr 363 00:22:12,340 --> 00:22:16,210 "1 2 3", és ha úgy néz ki, van egy szám van, 364 00:22:16,210 --> 00:22:21,360 mi mondod sscanf tennie fel azt a számot, 1 2 3, hogy ezt a változót n nekem. 365 00:22:21,360 --> 00:22:26,060 Akkor miért tettem ezt is? 366 00:22:26,060 --> 00:22:33,750 Mi a szerepe az is, mondván, sscanf, akkor is kap egy karaktert ide. 367 00:22:33,750 --> 00:22:36,890 [Diák beszélő, érthetetlen] >> Nem - a tizedespont működhet. 368 00:22:36,890 --> 00:22:40,650 Nézzük meg, hogy egy pillanatra elgondolkozott. Mi van még? 369 00:22:40,650 --> 00:22:42,570 [Diák, érthetetlen] >> Szóval, jó gondolat, lehet, hogy a NULL karaktert. 370 00:22:42,570 --> 00:22:44,970 Ez valójában nem, a jelen esetben. Igen? [Diák, érthetetlen] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Vagy hadd általánosítani még tovább. 372 00:22:47,100 --> 00:22:49,670 A% c van csak a hiba-ellenőrzés. 373 00:22:49,670 --> 00:22:52,510 Nem akarom, hogy karakter szám után, 374 00:22:52,510 --> 00:22:54,980 de mi ez lehetővé teszi számomra, hogy a következő: 375 00:22:54,980 --> 00:23:01,270 Kiderült, hogy sscanf mellett értéket tárolhatunk n-ben és c, ebben a példában itt, 376 00:23:01,270 --> 00:23:08,170 mit is jelent ez visszaadja a változók száma terjesztett értékek be 377 00:23:08,170 --> 00:23:13,330 Tehát, ha csak írja be 1 2 3, akkor csak a% d lesz, hogy megfeleljen 378 00:23:13,330 --> 00:23:18,830 és csak n lesz tárolt értékű, mint 1 2 3, és semmi sem lesz hozott c; 379 00:23:18,830 --> 00:23:20,870 c marad szemét érték, hogy úgy mondjam. 380 00:23:20,870 --> 00:23:23,550 Garbage mert ez soha nem inicializált mint néhány értéket. 381 00:23:23,550 --> 00:23:29,390 Tehát ebben az esetben sscanf értéke 1, mert lakott egy olyan mutató, 382 00:23:29,390 --> 00:23:33,650 ebben az esetben, nagy. Van egy int, úgyhogy szabad a vonal szabadítson fel a memória 383 00:23:33,650 --> 00:23:37,150 hogy getString ténylegesen kiosztott, és aztán vissza n. 384 00:23:37,150 --> 00:23:42,210 Különben, ha már azon, ha ez újra kijelentés származik, jön itt. 385 00:23:42,210 --> 00:23:45,770 Ha ezzel szemben azt írja 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 csak néhány véletlenszerű sorrendben szövegének, sscanf fog látni, 387 00:23:48,640 --> 00:23:51,500 ó, szám, ó, szám, ó, szám, ó - f. 388 00:23:51,500 --> 00:23:54,190 És ez megy, hogy az 1 2 3 n. 389 00:23:54,190 --> 00:23:59,970 Ez megy, hogy az f-ben c, majd vissza 2. 390 00:23:59,970 --> 00:24:02,980 Tehát, csak a meghatározást scanf viselkedését, 391 00:24:02,980 --> 00:24:06,170 egy nagyon egyszerű módon - nos, az összetett első pillantásra, de a végén a nap, 392 00:24:06,170 --> 00:24:11,460 meglehetősen egyszerű mechanizmusa mondván, van egy int, és ha igen, az, hogy az egyetlen dolog, amit találtam? 393 00:24:11,460 --> 00:24:14,950 És a white space itt szándékos. Ha elolvasod a dokumentációt sscanf, 394 00:24:14,950 --> 00:24:18,690 azt mondja, hogy ha tartalmaz egy darab fehér tér elején vagy a végén, 395 00:24:18,690 --> 00:24:24,990 sscanf is lehetővé teszi, hogy a felhasználó bármilyen okból, a hit szóközt 1 2 3, és hogy lesz legitim. 396 00:24:24,990 --> 00:24:28,310 Nem fog kiabálni a felhasználó csak azért, mert megüt a szóközt elején vagy a végén, 397 00:24:28,310 --> 00:24:32,160 ami csak egy kicsit felhasználóbarát. 398 00:24:32,160 --> 00:24:34,160 >> Bármilyen kérdése van, akkor a GetInts? Igen? 399 00:24:34,160 --> 00:24:36,820 [Student kérdés, érthetetlen] 400 00:24:36,820 --> 00:24:40,740 >> Jó kérdés. Mi van, ha csak beírt egy karakter, mint a f, és nyomd meg az Entert 401 00:24:40,740 --> 00:24:47,830 anélkül, hogy valaha gépelés 1 2 3, mit gondolsz viselkedését ezt a kódsort akkor lenne? 402 00:24:47,830 --> 00:24:50,500 Így sscanf fedezhetik azt is, mert ebben az esetben, 403 00:24:50,500 --> 00:24:56,280 ez nem fog kitölteni n vagy c; ez fog helyette vissza 0-ra. 404 00:24:56,280 --> 00:25:01,540 Ebben az esetben én is kifogása, hogy a forgatókönyv, mert a várható érték akarom 1 lehet. 405 00:25:01,540 --> 00:25:07,310 Én csak azt akarom 1, csak 1 dolog, amit ki kell tölteni. Jó kérdés. Mások? 406 00:25:07,310 --> 00:25:09,610 >> Rendben, ne menjünk végig a funkciók itt, 407 00:25:09,610 --> 00:25:11,820 de az egyik, hogy úgy tűnik, hogy talán a fennmaradó kamat 408 00:25:11,820 --> 00:25:14,530 A getString mert kiderül, hogy getFloat, getInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong minden ladik is sok a funkcionalitást getString. 410 00:25:19,490 --> 00:25:22,860 Szóval vessünk egy pillantást, hogyan valósul meg itt. 411 00:25:22,860 --> 00:25:27,040 Ez úgy néz ki, egy kicsit bonyolult, de ugyanazt a fundamentumok 412 00:25:27,040 --> 00:25:29,680 hogy elkezdtünk beszélni a múlt héten. Tehát getString, 413 00:25:29,680 --> 00:25:32,670 amely nem veszi érvet, mint egy a semmis itt, 414 00:25:32,670 --> 00:25:37,110 és visszatér a húr, így vagyok nyilvánításáról egy string nevű puffer. 415 00:25:37,110 --> 00:25:39,670 Én nem igazán tudom, hogy mi fog használni még, de majd meglátjuk. 416 00:25:39,670 --> 00:25:42,950 Úgy néz ki, mint a kapacitás, alapértelmezés szerint 0, nem egészen biztos benne, ha ez megy. 417 00:25:42,950 --> 00:25:44,920 Nem tudja, mit n fog használni még. 418 00:25:44,920 --> 00:25:47,860 De most ez egy kicsit érdekesebb, így sorban 243, 419 00:25:47,860 --> 00:25:51,760 kijelentjük int c, ez egyfajta hülye részletességgel. 420 00:25:51,760 --> 00:25:58,080 A char 8 bites, és 8 bit tud tárolni, hogy hány különböző értéke? 421 00:25:58,080 --> 00:26:03,310 256. A probléma az, ha azt szeretnénk, hogy 256 különböző ASCII karakterek 422 00:26:03,310 --> 00:26:06,210 amelyek vannak, ha úgy gondolja, vissza, és ez nem valami memorizálni. 423 00:26:06,210 --> 00:26:09,100 De ha úgy gondolja, vissza a nagy ASCII chart volt héttel ezelőtt, 424 00:26:09,100 --> 00:26:13,780 voltak, ebben az esetben, 128 vagy 256 ASCII karakter. 425 00:26:13,780 --> 00:26:16,220 Használtuk a mintákat 0 és 1 múlik. 426 00:26:16,220 --> 00:26:19,410 Ez egy probléma, ha azt szeretné, hogy képes legyen felismerni a hiba. 427 00:26:19,410 --> 00:26:23,290 Mert ha már használja a 256 értéket a karakterek, 428 00:26:23,290 --> 00:26:26,390 Ön nem igazán tervez előre, mert most nincs módja mondván, 429 00:26:26,390 --> 00:26:29,750 "Ez nem egy legit karakter, ez valami hibás üzenet." 430 00:26:29,750 --> 00:26:32,430 Szóval, mi a világ nem az, hogy használja a következő legnagyobb érték, 431 00:26:32,430 --> 00:26:35,790 valami, mint egy int úgy, hogy egy őrült bitek száma, 432 00:26:35,790 --> 00:26:39,610 32, 4 milliárd lehetséges értékeit, így egyszerűen csak a végén használ, 433 00:26:39,610 --> 00:26:44,800 lényegében, 257 közülük, ebből 1 olyan különleges jelentése a hiba. 434 00:26:44,800 --> 00:26:49,190 >> Nézzük, hogyan is működik ez. A sorban 246, van ez a nagy while 435 00:26:49,190 --> 00:26:54,530 hogy hívja fgetc; f értelmében fájl, getc, majd stdin. 436 00:26:54,530 --> 00:26:59,030 Kiderült, hogy ez csak a pontosabb módja mondván, hogy "olvasott bemenet a billentyűzet". 437 00:26:59,030 --> 00:27:02,730 Szabványos bemeneti eszközök billentyűzet, standard output olyan képernyőn, 438 00:27:02,730 --> 00:27:06,920 és standard hiba, amit majd látni Pset 4, azt jelenti, a képernyőn, 439 00:27:06,920 --> 00:27:09,670 hanem egy speciális része a képernyőn úgy, hogy ez nem összetévesztette 440 00:27:09,670 --> 00:27:13,760 a tényleges teljesítmény, hogy célja a nyomtatás, de erről bővebben a jövőben. 441 00:27:13,760 --> 00:27:19,430 Szóval fgetc csak azt jelenti, olvasni egy karaktert a billentyűzeten, és tárolja, ahol? 442 00:27:19,430 --> 00:27:24,000 Tárolja c, majd ellenőrizze, úgyhogy én csak használ néhány boolean kötőszók itt, 443 00:27:24,000 --> 00:27:28,430 ellenőrizze, hogy nem egyenlő \ n, így a felhasználó nyomd meg az Entert. 444 00:27:28,430 --> 00:27:31,510 Azt akarjuk, hogy ne ezen a ponton, vége a hurok, és mi is szeretnénk ellenőrizni 445 00:27:31,510 --> 00:27:36,170 a különleges állandó EOF, amely, ha tudja, vagy kitalálni - mit jelent ez állni? 446 00:27:36,170 --> 00:27:39,860 Vége a fájl. Tehát ez a fajta értelmetlen, mert ha én vagyok gépelni a billentyűzeten, 447 00:27:39,860 --> 00:27:41,900 már tényleg nincs fájlt részt ebben, 448 00:27:41,900 --> 00:27:44,330 de ez csak egyfajta általános kifejezés azt jelenti, 449 00:27:44,330 --> 00:27:50,320 hogy semmi más nem jön az ember ujjai. EOF. Vége a fájl. 450 00:27:50,320 --> 00:27:52,600 Mint félre, ha valaha is sújtotta ellenőrzés d at a billentyűzet, 451 00:27:52,600 --> 00:27:54,680 nem az, hogy akkor még nem, amit Ctrl c. 452 00:27:54,680 --> 00:27:57,920 De ellenőrzési d küldi ezt a különleges állandó nevű EOF. 453 00:27:57,920 --> 00:28:03,100 >> Szóval most már csak néhány dinamikus memória kiosztás. 454 00:28:03,100 --> 00:28:06,460 Tehát, ha n + 1> kapacitás, most leírom n. 455 00:28:06,460 --> 00:28:09,380 n éppen hány bájt van jelenleg a puffer, 456 00:28:09,380 --> 00:28:11,970 a szöveg, hogy te éppen kiépítése a felhasználó elől. 457 00:28:11,970 --> 00:28:16,240 Ha több karaktert a puffer kapacitása, mint a pufferben, 458 00:28:16,240 --> 00:28:20,760 ösztönösen, mit kell tennünk ezután fordítsanak több kapacitást. 459 00:28:20,760 --> 00:28:24,490 Megyek sovány át néhány számtani itt 460 00:28:24,490 --> 00:28:26,900 és elsősorban csak ezt a funkciót itt. 461 00:28:26,900 --> 00:28:29,170 Tudod mit malloc van, vagy legalábbis általában ismerik. 462 00:28:29,170 --> 00:28:32,380 Vegyünk egy tipp, amit realloc csinál. [Student válasz, érthetetlen] 463 00:28:32,380 --> 00:28:35,690 >> Igen. És ez nem elég hozzá memóriát, ez reallocates memóriát az alábbiak szerint: 464 00:28:35,690 --> 00:28:40,530 Ha van még hely a végén a húr, hogy Ön több e memória 465 00:28:40,530 --> 00:28:43,370 mint azt eredetileg ad, akkor kapsz, hogy további memóriát. 466 00:28:43,370 --> 00:28:46,640 Szóval egyszerűen üzembe a húrok karaktereket háttal hátra hátra. 467 00:28:46,640 --> 00:28:49,290 De ha nem ez a helyzet, mert túl sokáig vártam 468 00:28:49,290 --> 00:28:51,700 és valami véletlen került lehuppant a memóriában van, de van extra 469 00:28:51,700 --> 00:28:56,480 memória ide, ez rendben van. Realloc fog tenni a nehéz emelés az Ön számára, 470 00:28:56,480 --> 00:28:58,810 mozog a húr, amit olvasott eddig innen, 471 00:28:58,810 --> 00:29:02,550 tedd le oda, aztán kapsz néhány futópálya ezen a ponton. 472 00:29:02,550 --> 00:29:05,610 Tehát egy kézlegyintéssel, hadd mondjam el, hogy amit csinál getString 473 00:29:05,610 --> 00:29:09,540 van ez kezd egy kis puffer, talán 1 single karakter, 474 00:29:09,540 --> 00:29:12,300 és ha a felhasználó típusok 2 karaktert, getString végül 475 00:29:12,300 --> 00:29:15,210 hívó realloc és azt mondja: "Ó, 1 karakter nem volt elegendő. 476 00:29:15,210 --> 00:29:18,480 Adj nekem 2 karakter. " Akkor, ha olvassa el a logikája a hurok 477 00:29:18,480 --> 00:29:21,070 azt fogja mondani: "Ó, a felhasználó beírt 3 karaktert. 478 00:29:21,070 --> 00:29:25,690 Adj már nem 2, hanem 4 karakter, akkor adj nekem 8, akkor adjon nekem 16 és 32 ". 479 00:29:25,690 --> 00:29:28,180 Az a tény, hogy én vagyok a kapacitás megduplázása minden alkalommal 480 00:29:28,180 --> 00:29:30,320 azt jelenti, hogy a puffer nem fog lassan növekszik. 481 00:29:30,320 --> 00:29:35,870 Ez fog növekedni szuper gyors, és mi lehet az előnye, hogy a? 482 00:29:35,870 --> 00:29:38,540 Miért megduplázva a méretét a puffer, még akkor is, ha a felhasználói 483 00:29:38,540 --> 00:29:41,450 Lehet, csak kell 1 extra karaktert a billentyűzet? 484 00:29:41,450 --> 00:29:44,830 [Student válasz, érthetetlen]. >> Mi ez? 485 00:29:44,830 --> 00:29:46,750 Pontosan. Nem nő azt gyakran. 486 00:29:46,750 --> 00:29:48,870 És ez csak egyfajta - készen fedezeti meg tétjeiket itt. 487 00:29:48,870 --> 00:29:54,150 Az ötlet az, hogy nem akarja, hogy hívja realloc sokat, mert hajlamos arra, hogy lassú. 488 00:29:54,150 --> 00:29:56,840 Minden alkalommal, amikor kérdez az operációs rendszer a memória, ahogy hamarosan látni 489 00:29:56,840 --> 00:30:00,620 a jövőbeni probléma halmaz, akkor hajlamos arra, hogy időbe telik. 490 00:30:00,620 --> 00:30:04,980 Így minimálisra, hogy mennyi időt, akkor is, ha pazarolja egy kis helyet, inkább egy jó dolog. 491 00:30:04,980 --> 00:30:07,250 >> De ha olvassa végig az utolsó része getString itt, 492 00:30:07,250 --> 00:30:10,880 újra és újra, a megértés minden egyes sor itt nem olyan fontos ma. 493 00:30:10,880 --> 00:30:14,830 De észre, hogy ez végül felhívja malloc újra, és osztja 494 00:30:14,830 --> 00:30:16,980 pontosan annyi bájt, mint szüksége a húr 495 00:30:16,980 --> 00:30:21,620 majd eldobja hívja ingyenes, túlzottan nagy puffer, 496 00:30:21,620 --> 00:30:23,510 ha ez valóban kapott kétszeresére túl sokszor. 497 00:30:23,510 --> 00:30:25,970 Röviden, ez hogyan getString dolgozott egész idő alatt. 498 00:30:25,970 --> 00:30:30,100 Minden ez olvasható egy karaktert egy időben újra és újra és újra 499 00:30:30,100 --> 00:30:37,930 és minden alkalommal, amikor szüksége van némi további memória azt kéri az operációs rendszer által hívó realloc. 500 00:30:37,930 --> 00:30:41,660 Van még kérdése? Rendben van. 501 00:30:41,660 --> 00:30:45,220 >> A támadás. Most, hogy megértettük mutató, vagy legalább 502 00:30:45,220 --> 00:30:47,560 egyre inkább ismerik mutatók, 503 00:30:47,560 --> 00:30:50,020 nézzük meg, hogy az egész világ kezd összeomlani 504 00:30:50,020 --> 00:30:53,160 ha nem elég védekezni ellenséges felhasználók, 505 00:30:53,160 --> 00:30:55,180 az emberek, akik megpróbálják feltörni a rendszert. 506 00:30:55,180 --> 00:31:00,260 Emberek, akik megpróbálják ellopni a szoftver megkerülésével bizonyos regisztrációs kód 507 00:31:00,260 --> 00:31:02,150 hogy máskülönben írja be 508 00:31:02,150 --> 00:31:04,860 Nézd meg ezt a példát itt, ami csak a C kód 509 00:31:04,860 --> 00:31:07,920 , hogy van egy fő funkciója az alján, hogy felhívja a function ize, 510 00:31:07,920 --> 00:31:12,100 és milyen halad a foo? [Student] Egyetlen érv. 511 00:31:12,100 --> 00:31:15,660 >> Single érv. Szóval, argv [1], ami azt jelenti, az első szó a felhasználó beírt 512 00:31:15,660 --> 00:31:19,150 a parancssorban után a.out vagy bármi a program neve. 513 00:31:19,150 --> 00:31:24,920 Szóval foo, felül, úgy a char *, de char * csak mi? 514 00:31:24,920 --> 00:31:28,860 String. Nincs semmi új itt, és ez karaktersorozat önkényesen hívott bar. 515 00:31:28,860 --> 00:31:36,090 Ebben a sorban van, char c [12], a sort félig műszaki English, mi ezt a vonalat csinál? 516 00:31:36,090 --> 00:31:40,640 Tömbje -? Színészek. Adj egy sor 12 karakter. 517 00:31:40,640 --> 00:31:44,970 Tehát nevezhetnénk ezt a puffert. Ez technikailag úgynevezett c, de a puffer programozási 518 00:31:44,970 --> 00:31:47,890 csak azt jelenti, egy csomó hely, amit fel néhány dolgot be 519 00:31:47,890 --> 00:31:49,940 >> Aztán végül memcpy, már nem használt előtt. 520 00:31:49,940 --> 00:31:52,380 De akkor talán kitalálni, mit csinál. Másolja memória. 521 00:31:52,380 --> 00:31:58,790 Mit tegyek? Nos, ez nyilvánvalóan másolja bar, a bemeneti, a c, 522 00:31:58,790 --> 00:32:03,420 de csak a hossza bar. 523 00:32:03,420 --> 00:32:07,440 De van egy hiba van. 524 00:32:07,440 --> 00:32:14,500 Oké, technikailag meg kell tényleg strlen (bar) x sizeof (char), ez helyes. 525 00:32:14,500 --> 00:32:17,920 De a legrosszabb esetben is, tegyük fel, hogy ez - így, oké. 526 00:32:17,920 --> 00:32:23,760 Aztán ott van 2 hiba. Szóval sizeof (char), rendben, tegyük ezt egy kicsit szélesebb. 527 00:32:23,760 --> 00:32:28,860 Tehát most van még egy hiba, amely a mi? 528 00:32:28,860 --> 00:32:31,630 [Student válasz, érthetetlen] >> Ellenőrizze mire? Oké, mi kell ellenőrző 529 00:32:31,630 --> 00:32:35,010 A NULL, mert a rossz dolgok történnek, ha a mutató NULL, 530 00:32:35,010 --> 00:32:38,490 Mert lehet, hogy végül oda, és akkor soha nem kell majd NULL 531 00:32:38,490 --> 00:32:40,890 által dereferencing azt a * operátor. 532 00:32:40,890 --> 00:32:45,250 Szóval ez jó, és mit csinálunk? Logikailag van egy hiba itt is. 533 00:32:45,250 --> 00:32:47,650 [Student válasz, érthetetlen] 534 00:32:47,650 --> 00:32:51,340 Tehát >> ellenőrizze argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Oké, van 3 bogarak ebben a programban van. 536 00:32:54,130 --> 00:33:00,080 Mi nem ellenőrzi, ha a felhasználó ténylegesen beírt semmit argv [1], jó. 537 00:33:00,080 --> 00:33:02,240 Szóval, mi a harmadik bug? Igen? 538 00:33:02,240 --> 00:33:04,420 [Student válasz, érthetetlen] >> Jó. 539 00:33:04,420 --> 00:33:09,590 Így ellenőrizni egyik forgatókönyv. Mi hallgatólagosan ellenőrizni nem másolható több memóriát 540 00:33:09,590 --> 00:33:12,800 mint azt meghaladó bar. 541 00:33:12,800 --> 00:33:15,720 Tehát, ha a húr a felhasználó beírt a 10 karakter hosszú, 542 00:33:15,720 --> 00:33:18,260 ezt mondván: "Csak bemásolod 10 karakter." 543 00:33:18,260 --> 00:33:21,140 És ez rendben van, de mi van, ha a felhasználó beírt a szót a prompt 544 00:33:21,140 --> 00:33:29,360 mint egy 20 karakteres szó, ez, mondván másolat 20 karaktert bar abba, hogy mi? 545 00:33:29,360 --> 00:33:32,840 c, más néven a puffer, ami azt jelenti, hogy csak írtam adatok 546 00:33:32,840 --> 00:33:35,950 8-byte helyeken, hogy ne a saját, 547 00:33:35,950 --> 00:33:38,320 és nem a tulajdonosa abban az értelemben, hogy soha nem juttatott nekik. 548 00:33:38,320 --> 00:33:41,190 Szóval ez az, ami általánosan ismert, mint a buffer overflow támadást, 549 00:33:41,190 --> 00:33:46,650 vagy puffertúlcsordulás támadás, és ez a támadás az értelemben, hogy ha a felhasználó 550 00:33:46,650 --> 00:33:50,650 vagy a program keresi a függvény ezt rosszindulatúan, 551 00:33:50,650 --> 00:33:53,780 hogy valójában mi történik a következő lehet elég rossz. 552 00:33:53,780 --> 00:33:55,690 >> Vessünk egy pillantást a kép itt. 553 00:33:55,690 --> 00:33:59,070 Ez a kép jelent meg stack memória. 554 00:33:59,070 --> 00:34:01,050 És emlékszem, hogy minden alkalommal, amikor hív egy függvényt, 555 00:34:01,050 --> 00:34:04,520 kap ez a kis keret a verem, majd egy másik, majd egy másik, majd egy másik. 556 00:34:04,520 --> 00:34:07,250 És így messzire csak egyfajta elvonatkoztatott e el, mint téglalap 557 00:34:07,250 --> 00:34:09,380 vagy ott a fedélzeten, illetve a képernyőn van. 558 00:34:09,380 --> 00:34:12,219 De ha nagyítani egy olyan téglalap, 559 00:34:12,219 --> 00:34:16,460 ha hívja a function ize, kiderül, hogy van még a verem 560 00:34:16,460 --> 00:34:18,739 belül, hogy a váz és a téglalap 561 00:34:18,739 --> 00:34:23,370 , mint x, y és a és b, mint mi beszélünk csere. 562 00:34:23,370 --> 00:34:25,949 Kiderül, hogy vannak alacsonyabb szintű részletek, 563 00:34:25,949 --> 00:34:27,780 köztük visszatérés címét. 564 00:34:27,780 --> 00:34:33,020 Így kiderült, hogy amikor a fő felhívja foo, fő tájékoztatnia foo 565 00:34:33,020 --> 00:34:36,760 milyen fő címe rajta van a számítógép memóriájában. 566 00:34:36,760 --> 00:34:40,659 Mert ellenkező esetben, amint foo történik végrehajtó, mint ebben az esetben itt, 567 00:34:40,659 --> 00:34:43,790 ha eléri ezt a szoros kapcsos zárójel végén foo, 568 00:34:43,790 --> 00:34:48,860 hogy a fene sem tudja, hol foo ellenőrzése a program kellene menni? 569 00:34:48,860 --> 00:34:52,460 Kiderül, hogy a válasz erre a kérdésre az, hogy a piros téglalap van. 570 00:34:52,460 --> 00:34:56,130 Ez a mutató, és ez akár a számítógép tárolására, átmenetileg 571 00:34:56,130 --> 00:35:00,250 A úgynevezett stack címét legfontosabb úgy, hogy amint foo történik végrehajtó, 572 00:35:00,250 --> 00:35:04,110 a számítógép tudja, hol és milyen vonal fő, hogy menjen vissza. 573 00:35:04,110 --> 00:35:06,900 Mentett frame pointer vonatkozik hasonlóan ezt. 574 00:35:06,900 --> 00:35:09,620 Char * bár itt képviseli azt, amit? 575 00:35:09,620 --> 00:35:14,740 Nos, ez a kék szegmens itt foo a keret, mi a bar? 576 00:35:14,740 --> 00:35:18,300 Oké, bár csak az az érv, hogy a foo függvény. 577 00:35:18,300 --> 00:35:20,720 >> Szóval most újra itt vagyunk az ismerős képet. 578 00:35:20,720 --> 00:35:22,960 Van több dolgot inkább zavaró a képernyőn 579 00:35:22,960 --> 00:35:27,490 de ez a világoskék szegmensben, amit mi már merítve a táblára valami, mint a csere. 580 00:35:27,490 --> 00:35:31,890 Ez a keret a foo és az egyetlen dolog, hogy most bár, 581 00:35:31,890 --> 00:35:34,630 ami ezt a paramétert. 582 00:35:34,630 --> 00:35:39,840 De mi mást kell lennie a verem szerint ezt a kódot itt? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Tehát kell látni 12 négyzet memória, 584 00:35:44,280 --> 00:35:46,260 kiosztott változó nevű c. 585 00:35:46,260 --> 00:35:48,340 És valóban, mi van, hogy a képernyőn. 586 00:35:48,340 --> 00:35:51,650 A legtetején van c [0] gombot, majd a szerző ezt a diagram 587 00:35:51,650 --> 00:35:55,130 nem zavarta rajz minden négyzet, de valóban vannak 12 van 588 00:35:55,130 --> 00:36:00,120 mert ha megnézzük a jobb alsó sarokban, c [11], ha számolni 0-tól, a 12 ilyen bájt. 589 00:36:00,120 --> 00:36:06,190 De itt van a probléma: Milyen irányba c növekszik? 590 00:36:06,190 --> 00:36:10,390 Valahogy felülről lefelé, igaz? Ha az elindul a tetején és növekszik az alsó, 591 00:36:10,390 --> 00:36:13,480 nem úgy néz ki, mint hagytuk magunkat sok kifutópálya itt. 592 00:36:13,480 --> 00:36:15,320 Már a fajta festett magunkat egy sarokba, 593 00:36:15,320 --> 00:36:20,210 és c [11] is jobb ellen bárban, amely egészen ellen stack frame pointer, 594 00:36:20,210 --> 00:36:23,800 amely a jobb szemben a visszatérési címet, nincs több hely. 595 00:36:23,800 --> 00:36:26,100 Szóval, mi a hatása, akkor, ha elcseszed, 596 00:36:26,100 --> 00:36:30,460 és megpróbál olvasni 20 byte egy 12-bájtos puffer? 597 00:36:30,460 --> 00:36:33,460 Hol vannak azok a további 8 bájt menni? 598 00:36:33,460 --> 00:36:36,370 Belül minden más, amelyek közül néhány a szuper fontos. 599 00:36:36,370 --> 00:36:40,480 És a legfontosabb dolog, potenciálisan a piros doboz van, feladó címét. 600 00:36:40,480 --> 00:36:44,720 Mert tegyük fel, hogy Ön véletlenül vagy adversarially 601 00:36:44,720 --> 00:36:48,040 felülírja a 4 byte, azaz pointer címét, 602 00:36:48,040 --> 00:36:53,190 nem csak a szemetet, de ez a szám történik, hogy képviselje a tényleges címet memória? 603 00:36:53,190 --> 00:36:55,930 Mi a implicaiton, logikusan? 604 00:36:55,930 --> 00:36:59,080 [Student választ, érthetetlen] >> Pontosan. Amikor foo visszatér 605 00:36:59,080 --> 00:37:03,560 és a látogatottság, hogy kapcsos zárójel, a program fog eljárni, hogy ne térjen vissza a fő, 606 00:37:03,560 --> 00:37:08,320 ez fog visszatérni, amit címe rajta van a piros mezőbe. 607 00:37:08,320 --> 00:37:11,560 >> Nos, abban az esetben, megkerülésének szoftver regisztrációs, 608 00:37:11,560 --> 00:37:14,400 mi az a cím, ami visszaadta a funkció 609 00:37:14,400 --> 00:37:18,820 hogy általában kap hívott, miután kifizette a szoftver és bevisszük a regisztrációs kódot? 610 00:37:18,820 --> 00:37:23,160 Lehet egyfajta trükk a számítógépet nem megy itt, hanem, megy itt. 611 00:37:23,160 --> 00:37:27,950 Vagy, ha nagyon okos, egy támadó ténylegesen írja be a billentyűzet, 612 00:37:27,950 --> 00:37:32,500 például nem tényleges szó, nem 20 karakter, de tegyük fel, ő 613 00:37:32,500 --> 00:37:36,200 típusok néhány karakter jelentő kódot? 614 00:37:36,200 --> 00:37:38,860 És ez nem lesz C kód, ez lesz a karakter 615 00:37:38,860 --> 00:37:42,920 képviselő bináris gép-kódok, 0 és 1-es. 616 00:37:42,920 --> 00:37:46,740 De tegyük fel, ők elég okos ahhoz, hogy ezt megtehessük, valahogy illessze be a getString prompt 617 00:37:46,740 --> 00:37:49,460 valamit, ami lényegében lefordított kód, 618 00:37:49,460 --> 00:37:56,900 és az utolsó 4 bájt felülírja hogy visszatérési címet, és mit jelent, hogy a bemeneti cím csinálni? 619 00:37:56,900 --> 00:38:01,860 Ez tárolja az e piros téglalapban a cím első byte a puffer. 620 00:38:01,860 --> 00:38:04,270 Szóval, van, hogy nagyon okos, és ez a sok tárgyalás és a hiba 621 00:38:04,270 --> 00:38:08,500 a rossz ember van, de ha tudod kitalálni, milyen nagy ez a puffer, 622 00:38:08,500 --> 00:38:12,170 oly módon, hogy az elmúlt néhány bájt a bemeneti, amit nyújtanak a program 623 00:38:12,170 --> 00:38:15,970 történetesen azonos a cím a kezdetét a puffer, 624 00:38:15,970 --> 00:38:22,270 meg tudod csinálni. Ha azt mondjuk, általában, hello, és \ 0, ez az, amit végül a puffert. 625 00:38:22,270 --> 00:38:27,860 De ha mi több okos, és töltse ki, hogy a puffer, amit fogunk hívni általánosan támadó kódot, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: Támadás, támadás, támadás, támadás, ha ez csak valami, amit csinál valamit rosszul. 627 00:38:31,920 --> 00:38:35,190 Nos, mi történik, ha nagyon okos, akkor tedd ezt: 628 00:38:35,190 --> 00:38:41,740 A piros mezőben itt van egy számsor: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Figyeljük meg, hogy megfelel a száma, hogy ez itt. 630 00:38:44,890 --> 00:38:47,280 Ez a fordított sorrendben, de erről bővebben majd máskor. 631 00:38:47,280 --> 00:38:51,430 Vegyük észre, hogy ez a feladó címét szándékosan megváltoztatták 632 00:38:51,430 --> 00:38:54,970 hogy megegyezzen a címet ide, nem a címét fő. 633 00:38:54,970 --> 00:39:00,170 Tehát, ha a rossz fiú szuper okos, ő fog felvenni, hogy a támadó kódot 634 00:39:00,170 --> 00:39:02,890 valami ilyesmit: "Mindent töröl a felhasználó fájlokat." 635 00:39:02,890 --> 00:39:06,320 Vagy "másolása a jelszavakat," vagy "Hozzon létre egy felhasználói fiókot, hogy tudok bejelentkezni. 636 00:39:06,320 --> 00:39:10,130 Bármi, minden, és ez mind a veszélyt és a hatalom a C. 637 00:39:10,130 --> 00:39:12,900 Mert van hozzáférése memória keresztül mutatók 638 00:39:12,900 --> 00:39:15,950 és ezért levelet, amit akarsz egy számítógép memóriájában. 639 00:39:15,950 --> 00:39:19,290 Tudod, hogy a számítógép bármit akarsz csupán a 640 00:39:19,290 --> 00:39:22,780 miután az ugrálást a saját memóriát. 641 00:39:22,780 --> 00:39:27,230 És így, a mai napig, így a sok program, és így sok weboldalak, amelyek veszélybe 642 00:39:27,230 --> 00:39:29,730 szűkülnek le, hogy az emberek kihasználják ezt. 643 00:39:29,730 --> 00:39:32,510 És ez tűnhet, mint egy szuper-kifinomult támadás, 644 00:39:32,510 --> 00:39:34,220 de ez nem mindig indul el így. 645 00:39:34,220 --> 00:39:36,770 >> A valóság az, hogy mi rossz emberek általában tennie, 646 00:39:36,770 --> 00:39:41,470 hogy ez a program egy parancssoros vagy GUI program, vagy egy honlap, 647 00:39:41,470 --> 00:39:43,290 az Ön csak elkezd nyújtó ostobaság. 648 00:39:43,290 --> 00:39:46,940 Azt írja egy igazán nagy szót a keresési mezőbe, és nyomd meg az Entert, 649 00:39:46,940 --> 00:39:49,030 , és várni, hogy ha a honlap összeomlik. 650 00:39:49,030 --> 00:39:53,270 Vagy várni, hogy ha a program nyilvánul néhány hibaüzenetet. 651 00:39:53,270 --> 00:39:55,480 Mert ha szerencséd lesz, mint a rossz fiú, 652 00:39:55,480 --> 00:39:59,610 és hogy néhány őrült input, hogy lefagy a program, 653 00:39:59,610 --> 00:40:02,280 azt jelenti, hogy a programozó nem számítottak a rossz viselkedés 654 00:40:02,280 --> 00:40:05,420 ami azt jelenti, akkor valószínűleg elég erőfeszítés, 655 00:40:05,420 --> 00:40:09,870 Elég próba-és hiba, kitaláljuk, hogyan lehet a bérek a pontosabb támadás. 656 00:40:09,870 --> 00:40:15,900 Tehát annyira része a biztonság nem csak elkerüli ezeket a támadásokat teljesen, de felderítésük 657 00:40:15,900 --> 00:40:20,250 és valójában nézi most rönköt, és látta, milyen őrült bemenetek az emberek gépelt be a honlapján. 658 00:40:20,250 --> 00:40:26,040 Milyen keresési kifejezések embereket beírt webhelyére annak reményében, túláradó egyes puffer? 659 00:40:26,040 --> 00:40:28,900 És ez a lényeg, hogy az egyszerű alapokat, hogy mi egy tömb, 660 00:40:28,900 --> 00:40:32,510 és mit jelent az, hogy kiosztani és használni memória? 661 00:40:32,510 --> 00:40:34,920 És kapcsolatos, hogy is van ez. 662 00:40:34,920 --> 00:40:37,520 >> Szóval csak pillantást belsejében egy merevlemez ismét. 663 00:40:37,520 --> 00:40:40,190 Szóval felidézni egy vagy két hete, hogy mikor húzza fájlokat 664 00:40:40,190 --> 00:40:45,470 a Lomtár vagy szemetes, mi történik? 665 00:40:45,470 --> 00:40:47,850 [Student] Semmi. >> Igen, abszolút semmi. Végül, ha lecsökken 666 00:40:47,850 --> 00:40:51,370 a lemezterület, Windows vagy Mac OS indul A fájlok törlése az Ön számára. 667 00:40:51,370 --> 00:40:53,670 De ha húzza valami ott, akkor ez egyáltalán nem biztonságos. 668 00:40:53,670 --> 00:40:56,550 Minden roomate, barát vagy családtag köze van dupla kattintás, és íme. 669 00:40:56,550 --> 00:40:59,720 Ott van az összes vázlatos fájlokat próbált meg törölni. 670 00:40:59,720 --> 00:41:02,840 Így a legtöbben, legalább tudjuk, hogy van, hogy jobb gombbal vagy ellenőrzése kattintással 671 00:41:02,840 --> 00:41:05,320 és ürítse ki a szemetet, vagy valami ilyesmi. 672 00:41:05,320 --> 00:41:07,900 De még akkor is, hogy nem egészen erre a célra. 673 00:41:07,900 --> 00:41:11,340 Mert mi történik, ha egy fájlt a merevlemezre 674 00:41:11,340 --> 00:41:14,590 amely képviseli néhány Word dokumentumot vagy egy JPEG? 675 00:41:14,590 --> 00:41:18,820 És ez azt jelenti, a merevlemez-meghajtót, és mondjuk ezt a forgács itt kijelenti, hogy fájl, 676 00:41:18,820 --> 00:41:21,640 és ez áll egy csomó 0 és 1-es. 677 00:41:21,640 --> 00:41:25,470 Mi történik, ha nem csak húzza a fájlt a kukába vagy a kukába, 678 00:41:25,470 --> 00:41:30,390 hanem üres ez? 679 00:41:30,390 --> 00:41:32,820 Valahogy semmi. Ez nem semmi most. 680 00:41:32,820 --> 00:41:37,630 Most már csak semmit, mert egy kis valami történik a formában ez a táblázat. 681 00:41:37,630 --> 00:41:41,170 Szóval van valami adatbázis vagy a tábla belsejében egy számítógép memóriáját 682 00:41:41,170 --> 00:41:44,470 hogy lényegében 1 oszlop a fájlok nevét, 683 00:41:44,470 --> 00:41:50,550 és 1 oszlop fájl helyét, ahol ez lehet location 123, csak egy véletlen számot. 684 00:41:50,550 --> 00:41:58,270 Tehát lehet, hogy valami ilyesmi x.jpg, és helyét 123. 685 00:41:58,270 --> 00:42:02,870 És mi történik akkor, amikor üres a szemetet? 686 00:42:02,870 --> 00:42:06,720 Ez elmúlik. De mi nem megy el a 0 és 1-es. 687 00:42:06,720 --> 00:42:09,690 >> Akkor mi van, akkor a kapcsolat Pset 4? 688 00:42:09,690 --> 00:42:13,460 Nos, Pset 4, csak azért, mert mi már véletlenül törölt 689 00:42:13,460 --> 00:42:15,890 A Compact Flash kártya, hogy már az összes ilyen fotókat, 690 00:42:15,890 --> 00:42:18,710 vagy csak azért, mert a rossz szerencse sérült lett, 691 00:42:18,710 --> 00:42:21,170 , nem jelenti azt, hogy a 0 és 1-es nem mindig ott van. 692 00:42:21,170 --> 00:42:23,920 Lehet, hogy néhány közülük elveszett, mert valami van elrontott 693 00:42:23,920 --> 00:42:26,530 abban az értelemben, hogy az egyes a 0-lett 1-es és 1-es 0-lett. 694 00:42:26,530 --> 00:42:30,460 Rossz dolgok történnek, mert a hibás szoftver vagy hibás hardver. 695 00:42:30,460 --> 00:42:33,510 De sok ilyen bit, talán még 100%-uk még mindig ott van, 696 00:42:33,510 --> 00:42:38,330 ez csak, hogy a számítógép vagy a kamera nem tudja, hol JPEG 1 kezdődött 697 00:42:38,330 --> 00:42:41,660 és ha JPEG 2 megkezdődött, de ha a programozó, 698 00:42:41,660 --> 00:42:45,800 Tudja, egy kis hozzáértés, amennyiben e JPEG vagy és mit néznek ki, 699 00:42:45,800 --> 00:42:49,570 tudja elemezni a 0 és 1-es és azt mondja: "Ó. JPEG. Ó, JPEG. 700 00:42:49,570 --> 00:42:52,830 Írhatsz egy programot lényegében csak egy for vagy a while ciklus 701 00:42:52,830 --> 00:42:56,100 amely helyreállítja minden egyes egy ilyen fájlokat. 702 00:42:56,100 --> 00:42:59,360 Tehát a tanulság tehát az, hogy indítsa el a "biztonságos" fájlok törlése 703 00:42:59,360 --> 00:43:01,720 ha szeretné, hogy elkerülje ezt teljesen. Igen? 704 00:43:01,720 --> 00:43:06,940 [Student kérdés, érthetetlen] 705 00:43:06,940 --> 00:43:11,150 >> Már több memóriát, mint azelőtt - 706 00:43:11,150 --> 00:43:14,790 Oh! Jó kérdés. Akkor miért, akkor kiürítése után a szemetet, 707 00:43:14,790 --> 00:43:18,300 sem a számítógép megmondja, hogy van több szabad hely, mint azelőtt? 708 00:43:18,300 --> 00:43:22,450 Dióhéjban, mert hazudik. További technikailag, akkor több hely. 709 00:43:22,450 --> 00:43:26,720 Mert most már azt mondta, akkor, hogy más dolog, ha ezt a fájlt egyszer volt, 710 00:43:26,720 --> 00:43:28,930 de ez nem jelenti a biteket elmegy, 711 00:43:28,930 --> 00:43:33,070 , és ez nem jelenti a biteket megváltoztatták összes 0-k, például az Ön védelme érdekében. 712 00:43:33,070 --> 00:43:37,520 Ezzel szemben, ha a "biztonságos" törlés fájlokat, vagy fizikailag semmisítse meg a készüléket, 713 00:43:37,520 --> 00:43:40,810 hogy valóban ez az egyetlen módja, néha körül ezt. 714 00:43:40,810 --> 00:43:45,300 Akkor miért nem indulunk ezen a félig ijesztő jegyzetet, és mi találkozunk hétfőn. 715 00:43:45,300 --> 00:43:52,810 CS50.TV