1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [Setmana 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Harvard University] 3 00:00:04,760 --> 00:00:11,990 [Aquesta és CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Dona] Està mentint, sobre què, no ho sé. 5 00:00:17,780 --> 00:00:20,300 [L'home] Llavors, què sabem? 6 00:00:20,300 --> 00:00:24,120 [La dona] Això a les 9:15, Ray Santoya era al caixer automàtic. 7 00:00:24,120 --> 00:00:27,420 [L'home] Per tant el dubte és, què estava fent a les 9:16? 8 00:00:27,420 --> 00:00:29,980 [Dona] El rodatge de la 9 mm en alguna cosa. 9 00:00:29,980 --> 00:00:31,900 Potser va veure el franctirador. 10 00:00:31,900 --> 00:00:34,000 [L'home] O que estava treballant amb ell. 11 00:00:34,000 --> 00:00:36,330 [Home] Espera. Torna un. 12 00:00:36,330 --> 00:00:38,330 [Home] Què és el que veus? 13 00:00:38,330 --> 00:00:44,520 [♫ ♫ música Suspens] 14 00:00:44,520 --> 00:00:48,320 [Dona] Porti el seu cap per amunt. Pantalla completa. 15 00:00:48,320 --> 00:00:51,230 [Home] seu ulleres. >> Hi ha una reflexió. 16 00:00:51,230 --> 00:01:00,810 [♫ ♫ música Suspens] 17 00:01:00,810 --> 00:01:03,580 [L'home] Això és l'equip de beisbol de Nuevita. Aquesta és la seva logotip. 18 00:01:03,580 --> 00:01:07,790 [Dona] I ell està parlant amb qui porta aquesta jaqueta. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Per tant, aquest és CS50 de 5 setmanes, i avui ens arruïnen una mica de la televisió i de la pel · lícula per a vostè. 20 00:01:13,730 --> 00:01:16,170 Així que quan estàs veient un espectacle com aquest d'aquí, 21 00:01:16,170 --> 00:01:19,910 i els policies diuen "Pots netejar això?" o "millorar" 22 00:01:19,910 --> 00:01:21,900 no hi ha millorar en el món real. 23 00:01:21,900 --> 00:01:25,220 De fet, el que realment aconsegueix és una mica d'alguna cosa com això. 24 00:01:25,220 --> 00:01:27,570 He aixecat una de les fotos del personal de la pàgina. 25 00:01:27,570 --> 00:01:30,980 Aquest és un programa anomenat Photoshop. Això és 1 feb Bowdens, 26 00:01:30,980 --> 00:01:36,300 Març 1 Bowdens realitat, avui dia, perquè tenim la Sra Bowden aquí també, amb Rob i Pau. 27 00:01:36,300 --> 00:01:41,950 Però aquí és Rob a la pantalla, i si ens centrem en aquesta brillantor que sempre ha tingut en els seus ulls, 28 00:01:41,950 --> 00:01:47,600 el que en realitat veiem és que el que veus és el que obtens. 29 00:01:47,600 --> 00:01:51,690 Això és "millorat", de manera que "CSI" té una mica malament. 30 00:01:51,690 --> 00:01:55,190 Hi ha un clip, si podem recollir a "CSI" només una mica més. 31 00:01:55,190 --> 00:01:58,500 Aquesta és una frase bonica per pronunciar des d'ara si voleu 32 00:01:58,500 --> 00:02:10,280 sonar tècnic amb els teus amics quan, en realitat, està dient absolutament res. 33 00:02:10,280 --> 00:02:12,970 >> [L'home] Durant setmanes he estat investigant els assassinats assassines Cabby 34 00:02:12,970 --> 00:02:15,360 amb un cert morbo. 35 00:02:15,360 --> 00:02:17,160 [Dona # 1] Això és en temps real. 36 00:02:17,160 --> 00:02:22,930 [Dona # 2] Vaig a crear una interfície GUI utilitzant Visual Basic, a veure si puc rastrejar una adreça IP. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Així àudio fora de sincronia de banda, la creació d'una interfície gràfica d'usuari amb Visual Basic 38 00:02:29,570 --> 00:02:31,820 per rastrejar una adreça IP és una completa tonteria. 39 00:02:31,820 --> 00:02:33,840 En aquests dies no s'utilitza Visual Basic, 40 00:02:33,840 --> 00:02:38,920 no hi ha necessitat d'una interfície gràfica d'usuari i l'adreça IP és un terme tècnicament precisa. 41 00:02:38,920 --> 00:02:41,730 Així que mantenir un ull cap a fora per a ells, i un dels meus favorits: 42 00:02:41,730 --> 00:02:45,070 Aquest és una mica més arcà, perquè el que necessita saber un idioma diferent. 43 00:02:45,070 --> 00:02:47,860 Hi ha un llenguatge anomenat Objective-C, que és un superconjunt de C. 44 00:02:47,860 --> 00:02:51,960 El que vol dir que és C més algunes característiques addicionals, com ara programació orientada a objectes. 45 00:02:51,960 --> 00:02:55,070 I aquest és el llenguatge que Apple ha popularitzat per a la programació de iOS. 46 00:02:55,070 --> 00:02:58,760 Així que aquí hi ha un clip d'un xou totalment diferent, de "Numbers" 47 00:02:58,760 --> 00:03:02,450 que si en realitat es mira de prop en el seu TiVo i la pausa en el moment just, 48 00:03:02,450 --> 00:03:07,700 veuràs que el que estem veient no és exactament el que s'està descrivint. 49 00:03:07,700 --> 00:03:11,170 I vaig a tractar d'un connector d'àudio diferent aquí i veure si no podem 50 00:03:11,170 --> 00:03:13,780 mantenir la sincronització d'àudio en aquest moment. 51 00:03:13,780 --> 00:03:20,530 Et dono "Numbers". 52 00:03:20,530 --> 00:03:23,240 >> [Home # 1] Es tracta d'una adreça IPv4 de 32 bits. 53 00:03:23,240 --> 00:03:38,930 [Home # 2] IP, que és la Internet. >> Private xarxa. És una xarxa privada d'Anita. 54 00:03:38,930 --> 00:03:43,810 [Malan] Bé. Es tracta d'Objective-C, i és per algun programa per acolorir per a nens, 55 00:03:43,810 --> 00:03:51,140 com vostè potser pot deduir del nom de la variable d'allà. 56 00:03:51,140 --> 00:03:54,410 Així que, llavors, era "Numbers". Així que avui i aquesta setmana et presentem 57 00:03:54,410 --> 00:03:57,740 una mica del món de la ciència forense i el context en els problemes, per tant. 58 00:03:57,740 --> 00:04:00,590 Avui serà una lliçó abreujada perquè hi ha un esdeveniment especial a aquí 59 00:04:00,590 --> 00:04:05,530 després, així que anem a fer una ullada, i es burlen tant dels estudiants com per als pares d'avui dia 60 00:04:05,530 --> 00:04:07,420 amb algunes de les coses que estan en l'horitzó. 61 00:04:07,420 --> 00:04:12,240 Entre ells, a partir de dilluns, tindrà una mica més dels seus companys de classe. 62 00:04:12,240 --> 00:04:16,050 EDX, Harvard i MIT nova iniciativa en línia per als cursos oberts 63 00:04:16,050 --> 00:04:19,120 i més, està posant en marxa al campus de Harvard, dilluns. 64 00:04:19,120 --> 00:04:21,490 Això significa venir dilluns vostè haurà de - a partir de l'últim recompte, 65 00:04:21,490 --> 00:04:26,210 86.000 companys de classe addicionals seguiran al llarg de amb xerrades CS50 66 00:04:26,210 --> 00:04:29,170 i seccions i tutorials i butlletins de problemes. 67 00:04:29,170 --> 00:04:32,350 I com a part d'això, es convertiran en membres de la classe inaugural de 68 00:04:32,350 --> 00:04:35,090 CS50 i CS50x ara. 69 00:04:35,090 --> 00:04:39,310 >> Com a part d'això, ara, adonar-se que hi haurà alguns Upsides també. 70 00:04:39,310 --> 00:04:43,790 Per preparar-se per això, per l'enorme quantitat d'estudiants, 71 00:04:43,790 --> 00:04:47,180 només cal dir que tot i que comptem amb 108 TFS i CAS, 72 00:04:47,180 --> 00:04:50,790 no exactament el millor estudiant / professor un cop arribem a 80.000 estudiants. 73 00:04:50,790 --> 00:04:52,850 Així que no anem a classificar problema per a molts jocs de forma manual. 74 00:04:52,850 --> 00:04:55,920 Així va presentar aquesta setmana en el conjunt de problemes serà CS50 Check, 75 00:04:55,920 --> 00:04:58,450 que serà una utilitat de línia d'ordres en l'aparell 76 00:04:58,450 --> 00:05:01,200 que obtindrà una vegada que el actualitzeu a finals d'aquest cap de setmana, 77 00:05:01,200 --> 00:05:03,200 i vostè serà capaç d'executar una ordre, comprovi 50, 78 00:05:03,200 --> 00:05:06,500 en el seu propi conjunt de processadors, i obtindrà una retroalimentació sobre si el seu programa és 79 00:05:06,500 --> 00:05:11,160 correcte o incorrecte d'acord a les especificacions de disseny diferents que ens han proporcionat. 80 00:05:11,160 --> 00:05:13,580 Així que més que en l'especificació i conjunt de problemes i 81 00:05:13,580 --> 00:05:17,240 els companys de classe CS50x va a utilitzar això també. 82 00:05:17,240 --> 00:05:19,230 >> Així butlletí de problemes 4 té a veure amb la medicina forense. 83 00:05:19,230 --> 00:05:21,940 I aquesta peça es va inspirar en algunes coses de la vida real, 84 00:05:21,940 --> 00:05:24,620 de manera que quan jo estava a la universitat, em van internar per un temps amb 85 00:05:24,620 --> 00:05:28,650 Oficina de Districte del Comtat de Middlesex del procurador fent el treball forense 86 00:05:28,650 --> 00:05:31,650 amb el seu principal investigador forense, i el que això equivalia a 87 00:05:31,650 --> 00:05:35,260 És a dir, crec que he esmentat la setmana passada alguns, és la policia estatal de comunicació o altres 88 00:05:35,260 --> 00:05:39,000 faria entrar, els deixen les coses com discs durs i CD i els disquets 89 00:05:39,000 --> 00:05:42,340 i similars, i llavors l'objectiu de l'oficina forense era determinar si els 90 00:05:42,340 --> 00:05:44,600 hi va haver o no evidència d'algun tipus. 91 00:05:44,600 --> 00:05:48,010 Aquesta va ser la Unitat d'Investigacions Especials, així que era delictes de coll blanc, 92 00:05:48,010 --> 00:05:52,350 era una espècie més problemàtica dels delictes, 93 00:05:52,350 --> 00:05:55,990 qualsevol cosa que implica algun tipus de mitjans de comunicació digitals, resulta que no molta gent 94 00:05:55,990 --> 00:05:59,370 escriure un correu electrònic dient: "Jo ho vaig fer". 95 00:05:59,370 --> 00:06:03,290 Així que molt sovint aquestes recerques forenses no es va presentar tot el que molt de fruit; 96 00:06:03,290 --> 00:06:05,850 però de vegades la gent anava a escriure aquests correus electrònics. 97 00:06:05,850 --> 00:06:08,490 Així que de vegades els esforços es van veure recompensats. 98 00:06:08,490 --> 00:06:14,420 >> Però per dur a aquest conjunt de processadors forense, anem a introduir en pset 4 una mica de gràfics. 99 00:06:14,420 --> 00:06:18,260 Així que probablement prendre aquestes coses per assegut, JPEG, GIF i els que en aquests dies, 100 00:06:18,260 --> 00:06:21,640 però si vostè realment pensa d'ell, una imatge, igual que la cara de Rob, 101 00:06:21,640 --> 00:06:24,430 pot modelar com una seqüència de punts o píxels. 102 00:06:24,430 --> 00:06:26,680 Ara, en el cas de la cara de Rob, hi ha tot tipus de colors, 103 00:06:26,680 --> 00:06:29,940 i comencem a veure els punts individuals, otherwide coneguts com píxels, 104 00:06:29,940 --> 00:06:31,610 una vegada que comencem per apropar la imatge 105 00:06:31,610 --> 00:06:35,590 Però si simplifiquem el món sigui una mica, i només puc dir que això aquí és Rob 106 00:06:35,590 --> 00:06:40,560 en blanc i negre, bé, per representar en blanc i negre que només es pot utilitzar binari. 107 00:06:40,560 --> 00:06:44,960 I si utilitzarem binari, 1 o 0, podem expressar aquesta mateixa imatge 108 00:06:44,960 --> 00:06:51,970 de la cara somrient de Rob amb aquest patró de bits: 11000011 representa 109 00:06:51,970 --> 00:06:55,160 blanc, blanc, negre, negre, negre, negre, blanc blanc. 110 00:06:55,160 --> 00:06:59,290 I el que no és un gran salt, llavors, començar a parlar de fotografies a tot color. 111 00:06:59,290 --> 00:07:01,920 Les coses que vostè veuria a Facebook o prendre amb una càmera digital, 112 00:07:01,920 --> 00:07:04,730 però, certament, quan es tracta de colors, necessita més bits. 113 00:07:04,730 --> 00:07:08,470 I molt comú en el món de les fotografies és utilitzar no 1-bit color, 114 00:07:08,470 --> 00:07:12,730 ja que això suggereix, però de 24-bit color, on realment obtenir milions de colors. 115 00:07:12,730 --> 00:07:15,430 Així com en el cas quan el zoom a l'ull de Rob, 116 00:07:15,430 --> 00:07:19,270 que era qualsevol nombre de milions de possibilitats diferents colors. 117 00:07:19,270 --> 00:07:22,260 >> Així que anem a introduir en aquest butlletí de problemes 4, així com en el tutorial, 118 00:07:22,260 --> 00:07:27,050 que serà avui a les 3:30 en lloc de les habituals a causa de 2:30 conferència de divendres aquí. 119 00:07:27,050 --> 00:07:29,930 Però el vídeo estarà en línia, com és habitual, demà. 120 00:07:29,930 --> 00:07:31,880 També vaig a presentar a un altre format d'arxiu. 121 00:07:31,880 --> 00:07:34,150 Així que això està deliberadament destinada a semblar intimidatori al principi, 122 00:07:34,150 --> 00:07:38,980 però això és només part de la documentació per a una estructura C. 123 00:07:38,980 --> 00:07:42,280 Resulta que Microsoft, fa anys, va ajudar a popularitzar aquest format, 124 00:07:42,280 --> 00:07:46,630 anomenat el format d'arxiu de mapa de bits, BMP, i això va ser un super-simple, 125 00:07:46,630 --> 00:07:50,390 colorit format d'arxius gràfics que s'utilitza des de fa força temps 126 00:07:50,390 --> 00:07:53,640 i de vegades encara per fons de pantalla en els escriptoris. 127 00:07:53,640 --> 00:07:57,410 Si vostè pensa de nou a Windows XP i els turons i el cel blau, 128 00:07:57,410 --> 00:08:00,660 que era típicament un BMP, o la imatge de mapa de bits i mapes de bits 129 00:08:00,660 --> 00:08:03,340 És divertit per a nosaltres perquè tenen una mica més de complexitat. 130 00:08:03,340 --> 00:08:05,640 No és tan simple com aquesta reixeta de 0 i de 1; 131 00:08:05,640 --> 00:08:10,680 en canvi, té coses com una capçalera al començament d'un arxiu. 132 00:08:10,680 --> 00:08:15,520 En altres paraules, dins d'un arxiu. Bmp és un manat sencer de 0 i de 1, 133 00:08:15,520 --> 00:08:18,070 però hi ha alguna cosa addicional 0 i 1 a allà. 134 00:08:18,070 --> 00:08:21,450 I resulta que el que probablement ha donat per fet durant anys, 135 00:08:21,450 --> 00:08:27,040 formats d'arxiu com. doc o. xls o mp3. o mp4., 136 00:08:27,040 --> 00:08:29,910 siguin quins siguin els formats d'arxiu que vostè està familiaritzat. 137 00:08:29,910 --> 00:08:31,900 Doncs bé, què significa ser fins i tot un format d'arxiu? 138 00:08:31,900 --> 00:08:35,740 Com que al final de la dia, tots aquests arxius d'utilitzar només 0 i d'1 139 00:08:35,740 --> 00:08:39,950 i potser els 0 i els 1 representen, b, c, a través d'ASCII o similar, 140 00:08:39,950 --> 00:08:42,030 però a través del final del dia, és només 0 i de 1. 141 00:08:42,030 --> 00:08:45,300 >> Així que els humans només de tant en tant decideixen inventar un nou format d'arxiu 142 00:08:45,300 --> 00:08:49,420 on estandarditzar el que els patrons de bits realment signifiquen. 143 00:08:49,420 --> 00:08:52,790 I en aquest cas aquí, amics els que va dissenyar el format de fitxer de mapa de bits 144 00:08:52,790 --> 00:08:58,260 va dir que en el primer byte en un arxiu de mapa de bits, com s'indica mitjançant el desplaçament 0, no, 145 00:08:58,260 --> 00:09:02,320 que serà una mica crípticament anomenat bfType variable anomenada, 146 00:09:02,320 --> 00:09:06,510 que només representa el tipus de fitxer de mapa de bits, el tipus de fitxer de mapa de bits que és això. 147 00:09:06,510 --> 00:09:10,780 Es pot inferir, potser, des de la segona fila de compensar 2, número 2 bytes, 148 00:09:10,780 --> 00:09:15,980 té un patró de 0 i 1 que representa què? 149 00:09:15,980 --> 00:09:18,320 La mida d'alguna cosa, i va des d'allà. 150 00:09:18,320 --> 00:09:20,660 Així que en conjunt el problema 4, vostè pot caminar a través d'algunes d'aquestes coses. 151 00:09:20,660 --> 00:09:24,480 >> No anem a acabar la cura de tots ells, però noti que comença a posar-se interessant 152 00:09:24,480 --> 00:09:30,780 al voltant de la línia o byte 54, rgbtBlue, verd i vermell. 153 00:09:30,780 --> 00:09:35,280 Si alguna vegada has escoltat la sigla RGB, vermell, verd, blau, aquesta és una referència a això. 154 00:09:35,280 --> 00:09:37,840 Perquè resulta que vostè pot pintar tots els colors de l'arc de Sant Martí 155 00:09:37,840 --> 00:09:41,580 amb una combinació de vermell, blau i verd. 156 00:09:41,580 --> 00:09:46,560 I, de fet, els pares a l'habitació pot recordar alguns dels primers projectors. 157 00:09:46,560 --> 00:09:49,360 En aquests dies, vostè acaba de veure una llum brillant que surt d'una lent. 158 00:09:49,360 --> 00:09:52,870 No obstant això, en el seu moment, va tenir la lent de color vermell, la lent blava i verd de la lent 159 00:09:52,870 --> 00:09:56,620 i junts dirigida a la pantalla i es va formar un quadre de colors. 160 00:09:56,620 --> 00:09:59,590 I molt sovint les escoles intermèdies i secundàries que tenen aquests lents 161 00:09:59,590 --> 00:10:02,680 sempre tan lleugerament decantat, de manera que eren una mena de veure imatges dobles o triples, 162 00:10:02,680 --> 00:10:07,500 però aquesta era la idea. Tenies llum vermella, verda i blava que pinta un quadre. 163 00:10:07,500 --> 00:10:09,570 I aquest mateix principi s'utilitza en els ordinadors. 164 00:10:09,570 --> 00:10:12,000 >> Així que un dels desafiaments, llavors, en el conjunt de problemes 4 165 00:10:12,000 --> 00:10:16,080 seran un parell de coses: una és per redimensionar una imatge. 166 00:10:16,080 --> 00:10:18,050 Per prendre en un patró de 0 i de 1, 167 00:10:18,050 --> 00:10:22,840 esbrinar què trossos de 0 i de 1 representen el que en una estructura d'aquest tipus, 168 00:10:22,840 --> 00:10:26,800 i després trobar la manera de reproduir els píxels: els vermells, els blaus, els verds 169 00:10:26,800 --> 00:10:32,460 dins, així que quan una imatge es veu com aquest principi, podria tenir aquest lloc després d'això. 170 00:10:32,460 --> 00:10:35,590 Entre altres desafiaments, també, serà que se li va lliurar 171 00:10:35,590 --> 00:10:38,900 una imatge forense d'un arxiu real d'una càmera digital 172 00:10:38,900 --> 00:10:42,410 i en aquesta cambra, fa molt de temps, eren un munt de fotos. 173 00:10:42,410 --> 00:10:47,030 El problema és que ens esborrin per accident o ha tingut la imatge danyada d'alguna manera. 174 00:10:47,030 --> 00:10:51,040 Les coses dolentes succeeixen amb càmeres digitals, de manera que ràpidament copiat tots els anys 0 i 1 de 175 00:10:51,040 --> 00:10:55,410 fora d'aquesta targeta per a vostè, va salvar a tots en un arxiu gran, i després els anem a lliurar a vostè 176 00:10:55,410 --> 00:11:00,000 problema en el grup 4 de manera que vostè pot escriure un programa en C amb el de recuperar 177 00:11:00,000 --> 00:11:02,660 tots aquests arxius JPEG, idealment. 178 00:11:02,660 --> 00:11:06,280 I resulta que els arxius JPEG, encara que són una mena format d'arxiu complex, 179 00:11:06,280 --> 00:11:09,580 són molt més complexes que aquesta cara somrient aquí. 180 00:11:09,580 --> 00:11:14,320 Resulta que cada JPEG comença amb els mateixos patrons de 0 i de 1. 181 00:11:14,320 --> 00:11:18,820 Així que usant un bucle while o un cicle for o similar, 182 00:11:18,820 --> 00:11:22,350 vostè pot iterar sobre tots els 0 i els 1 en aquesta imatge forense 183 00:11:22,350 --> 00:11:26,670 i cada vegada que veus el patró especial que està definit en l'especificació del conjunt del problema, 184 00:11:26,670 --> 00:11:29,770 es pot assumir, 'Oh, això és, amb una probabilitat molt alta, 185 00:11:29,770 --> 00:11:33,520 l'inici d'un arxiu JPEG, 'i pel que fa a trobar el mateix patró, 186 00:11:33,520 --> 00:11:36,050 un cert nombre de bytes o kilobytes o megabytes després, 187 00:11:36,050 --> 00:11:40,550 es pot assumir, 'Ooh! Heus aquí una segona JPEG, la foto que vaig prendre després de la primera. 188 00:11:40,550 --> 00:11:44,720 Permetin-me deixar de llegir aquest arxiu en primer lloc, començar a escriure aquest nou '. 189 00:11:44,720 --> 00:11:49,980 I la sortida del seu programa conjunt de processadors per 4 hi haurà fins 50 imatges JPEG. 190 00:11:49,980 --> 00:11:52,400 I si no són 50 imatges JPEG, té una mica d'un bucle. 191 00:11:52,400 --> 00:11:55,580 Si vostè té un nombre infinit d'imatges JPEG, té un bucle infinit. 192 00:11:55,580 --> 00:11:58,280 Així que, també, serà un cas bastant comú. 193 00:11:58,280 --> 00:12:00,280 Això és el que està en l'horitzó. 194 00:12:00,280 --> 00:12:03,740 >> Qüestionari 0, darrere nostre. Adona't, pel meu correu electrònic, que invariablement hi ha gent 195 00:12:03,740 --> 00:12:06,820 que són alhora tipus feliç, neutral, i trist voltant qüestionari temps 0. 196 00:12:06,820 --> 00:12:10,160 I si us plau acostar-se a mi, la TFS cap, Zamyla, el seu propi TF 197 00:12:10,160 --> 00:12:14,120 o una de les entitats emissores de certificats que vostè sàpiga si li agradaria discutir com anaven les coses. 198 00:12:14,120 --> 00:12:16,460 >> Així que per impressionar als pares aquí a l'habitació, 199 00:12:16,460 --> 00:12:23,990 el que és la biblioteca CS50? Bon treball. 200 00:12:23,990 --> 00:12:32,280 Quina és la biblioteca CS50? Sí? [Respostes dels estudiants, inintel · ligible] 201 00:12:32,280 --> 00:12:35,730 >> Bé, bé. Així que és un conjunt prescrit de codi que nosaltres, el personal, va escriure: 202 00:12:35,730 --> 00:12:38,460 que posem a per proporcionar algunes funcionalitats comuns. 203 00:12:38,460 --> 00:12:42,290 Coses com aconseguir-una cadena ¡Ajudeu-me a un int, totes les funcions que s'enumeren aquí. 204 00:12:42,290 --> 00:12:45,260 A partir d'ara, comencem a prendre realment aquestes rodes d'entrenament apagat. 205 00:12:45,260 --> 00:12:48,230 Així que anem a començar a portar una "cadena" de vostè, 206 00:12:48,230 --> 00:12:52,790 que, recordem, era només un sinònim per al tipus de dades real? char *. 207 00:12:52,790 --> 00:12:57,020 Així que per als pares, que probablement va ser - això és bo, així char * començarem a veure 208 00:12:57,020 --> 00:13:00,810 a la pantalla amb més raó ara que eliminar "cadena" del nostre vocabulari, 209 00:13:00,810 --> 00:13:02,760 almenys quan es tracta de realment escriure codi. 210 00:13:02,760 --> 00:13:06,240 De la mateixa manera, deixarem d'utilitzar algunes d'aquestes funcions com a molt, 211 00:13:06,240 --> 00:13:08,390 ja que els nostres programes es posaran més sofisticat 212 00:13:08,390 --> 00:13:11,370 en comptes de només escriure programes que se sentin allà amb un missatge parpellejant, 213 00:13:11,370 --> 00:13:13,580 esperant que l'usuari escrigui alguna cosa polz 214 00:13:13,580 --> 00:13:15,220 Vostè rebrà les seves entrades d'altres llocs. 215 00:13:15,220 --> 00:13:18,720 Per exemple, vostè els rebi d'una sèrie de bits en el disc dur local. 216 00:13:18,720 --> 00:13:23,340 En el seu lloc, vaig a aconseguir en el futur d'una connexió de xarxa, un lloc web en algun lloc. 217 00:13:23,340 --> 00:13:27,460 Així que anem a pelar aquesta capa, per primera vegada, i llevant l'aparell CS50 218 00:13:27,460 --> 00:13:32,300 i l'arxiu anomenat CS50.h, que ha estat fort fins i tot durant setmanes. 219 00:13:32,300 --> 00:13:34,380 >> Però anem a veure realment el que hi ha dins d'això. 220 00:13:34,380 --> 00:13:38,250 Així que la part superior de l'arxiu en blau és només un munt de comentaris, 221 00:13:38,250 --> 00:13:41,340 informació sobre la garantia i llicència. Aquesta és una espècie de paradigma comú 222 00:13:41,340 --> 00:13:44,600 en programari, ja que una gran quantitat de programari en aquests dies és el que s'anomena "codi obert" 223 00:13:44,600 --> 00:13:46,940 el que significa que algú ha escrit el codi 224 00:13:46,940 --> 00:13:50,060 i ho va fer lliurement disponibles, ja que per executar i utilitzar, 225 00:13:50,060 --> 00:13:53,660 però en realitat llegir i modificar i integrar en el seu propi treball. 226 00:13:53,660 --> 00:13:55,790 Així que això és el que vostè ha estat utilitzant, el programari de codi obert, 227 00:13:55,790 --> 00:13:58,030 encara que en una forma molt petita. 228 00:13:58,030 --> 00:14:01,860 Si em desplaço cap avall més enllà dels comentaris, però, començarem a veure algunes coses més familiars. 229 00:14:01,860 --> 00:14:08,090 Així notar a la part superior aquí, que l'arxiu CS50.h inclou una gran quantitat d'arxius de capçalera. 230 00:14:08,090 --> 00:14:11,160 Ara, la majoria d'ells no hem vist abans, però és un 231 00:14:11,160 --> 00:14:15,640 familiar, quin d'aquests hem vist, encara que breument, fins ara? 232 00:14:15,640 --> 00:14:18,720 Sí, les biblioteques estàndard. Stdlib.h té malloc, 233 00:14:18,720 --> 00:14:21,590 així que una vegada que comencem a parlar sobre l'assignació de memòria dinàmica, 234 00:14:21,590 --> 00:14:24,960 que anem a tornar a la setmana següent, així, que va començar a incloure aquest arxiu. 235 00:14:24,960 --> 00:14:29,660 Resulta que bool i veritat i la falsedat en realitat no existeix en C, per se, 236 00:14:29,660 --> 00:14:32,460 si no va acompanyat l'arxiu aquí. 237 00:14:32,460 --> 00:14:35,770 Així tenim, per setmanes, ha inclòs estàndard bool.h 238 00:14:35,770 --> 00:14:39,020 de manera que vostè pot utilitzar la noció d'una. bool, vertader o fals 239 00:14:39,020 --> 00:14:41,830 Sense això, vostè hauria d'ordenar d'fingir i utilitzar un int 240 00:14:41,830 --> 00:14:45,920 i només arbitràriament assumir que 0 és fals i 1 és veritable. 241 00:14:45,920 --> 00:14:49,980 >> Ara bé, si desplaceu-vos cap avall encara més, aquí és la nostra definició d'una cadena. 242 00:14:49,980 --> 00:14:54,820 Resulta que, com hem dit abans, que quan això * és en realitat no importa. 243 00:14:54,820 --> 00:14:56,750 Vostè pot fins i tot tenir espai al seu voltant. 244 00:14:56,750 --> 00:15:01,550 Nosaltres, en aquest semestre, ha estat promovent com això per deixar clar que la * té a veure amb el tipus. 245 00:15:01,550 --> 00:15:05,370 Però dese compte, com comú, sinó una mica més comú, és posar-lo allà 246 00:15:05,370 --> 00:15:07,480 però funcionalment és el mateix. 247 00:15:07,480 --> 00:15:11,070 Però ara, si llegim més avall, anem a fer una ullada a, diguem, getInt, 248 00:15:11,070 --> 00:15:15,350 perquè hem utilitzat que, potser, primer de tot aquest semestre. 249 00:15:15,350 --> 00:15:19,620 I aquí està getInt. Això és el que? 250 00:15:19,620 --> 00:15:24,650 Aquest és el prototip. Molt sovint, hem posat prototips a la part superior del nostre. Arxius c, 251 00:15:24,650 --> 00:15:28,190 però també es pot posar en prototips arxius de capçalera, arxius. h, 252 00:15:28,190 --> 00:15:32,110 com aquesta aquí, així que quan vostè escriu algunes funcions 253 00:15:32,110 --> 00:15:36,790 que vol que altres persones puguin utilitzar, que és exactament el cas de la biblioteca CS50, 254 00:15:36,790 --> 00:15:40,900 no només posar en pràctica les seves funcions en una mena CS50.c, 255 00:15:40,900 --> 00:15:46,720 també posar els prototips no en la part superior d'aquest arxiu, però a la part superior d'un arxiu de capçalera, 256 00:15:46,720 --> 00:15:50,810 després que l'arxiu de capçalera és el que els amics i col · legues inclouen, 257 00:15:50,810 --> 00:15:52,800 amb forta incloure en el seu propi codi. 258 00:15:52,800 --> 00:15:55,440 Així que tot aquest temps que has estat incloent tots aquests prototips 259 00:15:55,440 --> 00:15:59,870 eficaçment a la part superior del seu arxiu, però a través d'aquest mecanisme inclouen agut 260 00:15:59,870 --> 00:16:03,320 que, essencialment, còpia i enganxa aquest arxiu en el seu compte. 261 00:16:03,320 --> 00:16:06,400 Ara, aquí hi ha una mica de documentació molt detallada. 262 00:16:06,400 --> 00:16:08,880 >> Hem pràcticament per fet que getInt rep un int, 263 00:16:08,880 --> 00:16:10,740 però resulta que hi ha alguns casos extrems, no? 264 00:16:10,740 --> 00:16:14,320 Què passa si l'usuari escriu un nombre que és massa gran? 265 00:16:14,320 --> 00:16:17,350 Un trilió, que no pot cabre dins d'un int? 266 00:16:17,350 --> 00:16:21,180 Quin és el comportament esperat? Bé, l'ideal és predictible. 267 00:16:21,180 --> 00:16:23,460 Així que en aquest cas, si un llegeix la lletra petita, 268 00:16:23,460 --> 00:16:27,850 veuràs que si la línia no es pot llegir, aquesta INT_MAX devolucions. 269 00:16:27,850 --> 00:16:30,800 Mai hem parlat d'això, però sobre la base de la seva capitalització, 270 00:16:30,800 --> 00:16:33,030 el que és, probablement? 271 00:16:33,030 --> 00:16:36,610 És una constant, de manera que és una constant especial que probablement declarat 272 00:16:36,610 --> 00:16:39,460 en un d'aquests arxius de capçalera que hi ha més sobre al fitxer, 273 00:16:39,460 --> 00:16:43,400 i INT_MAX és probablement alguna cosa com, aproximadament, 2 milions de dòlars. 274 00:16:43,400 --> 00:16:48,160 La idea és que, perquè hem d'indicar d'alguna manera que alguna cosa va sortir malament, 275 00:16:48,160 --> 00:16:51,090 nosaltres, sí, tenim 4 milions de números a la nostra disposició, 276 00:16:51,090 --> 00:16:53,980 negatiu 2 milions de dòlars en fins a 2 milions de dòlars, més o menys. 277 00:16:53,980 --> 00:16:58,030 Bé, el que és comú en la programació és de robar un d'aquests nombres. 278 00:16:58,030 --> 00:17:02,250 Potser 0, potser 2 milions de dòlars, potser negatiu 2 milions de dòlars. 279 00:17:02,250 --> 00:17:06,720 Així de passar un dels seus valors possibles perquè pugui comprometre amb el món 280 00:17:06,720 --> 00:17:10,089 que si alguna cosa surt malament, jo em tornaré aquest valor super-gran. 281 00:17:10,089 --> 00:17:13,329 Però vostè no desitja que l'usuari escrigui alguna cosa críptica com "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 del nombre realment gran, on es generalitza en canvi com una constant. 283 00:17:17,079 --> 00:17:19,380 Així que en realitat, si s'estaven anal en les últimes setmanes, 284 00:17:19,380 --> 00:17:23,800 en qualsevol moment que cridi getInt, vostè ha d'haver estat revisant amb una condició if. 285 00:17:23,800 --> 00:17:27,109 El tipus d'usuari en INT_MAX, o més específicament, 286 00:17:27,109 --> 00:17:29,900 va fer INT_MAX getInt canvi? Perquè si ho fes, 287 00:17:29,900 --> 00:17:35,140 que en realitat vol dir que no ho escrigui, alguna cosa va sortir malament en aquest cas. 288 00:17:35,140 --> 00:17:38,970 Així que això és el que es coneix generalment com un "sentinella" de valor, la qual cosa significa especial. 289 00:17:38,970 --> 00:17:41,020 >> Bé, passem ara als arxius. C. 290 00:17:41,020 --> 00:17:44,500 L'arxiu de C ha existit en l'aparell durant algun temps, 291 00:17:44,500 --> 00:17:47,540 i, de fet, l'aparell ha de precompilat per a vostè 292 00:17:47,540 --> 00:17:49,720 en aquesta cosa que anomenem "codi objecte" 293 00:17:49,720 --> 00:17:52,940 però això no li importa a vostè on està perquè el sistema sap, 294 00:17:52,940 --> 00:17:54,780 en aquest cas, on és, l'aparell. 295 00:17:54,780 --> 00:18:00,620 Però anem ara a desplaçar-se cap avall getInt, i veure com getInt ha estat treballant tot aquest temps. 296 00:18:00,620 --> 00:18:02,380 Així que aquí tenim comentaris similars d'abans. 297 00:18:02,380 --> 00:18:04,930 Permetin-me fer un zoom sobre només la part del codi, 298 00:18:04,930 --> 00:18:07,410 i el que tenim per getInt és la següent. 299 00:18:07,410 --> 00:18:12,770 No es necessita entrada i retorna un int, mentre que (veritat), així que tenim un bucle infinit deliberada 300 00:18:12,770 --> 00:18:16,560 però, presumiblement, sortirem d'això d'alguna manera, o tornar des d'aquest. 301 00:18:16,560 --> 00:18:19,890 Així que anem a veure com funciona això. Bé, sembla que estem usant GetString 302 00:18:19,890 --> 00:18:22,550 en aquesta línia primer dins del bucle, 166. 303 00:18:22,550 --> 00:18:25,320 Això ara és una bona pràctica perquè en quines circumstàncies 304 00:18:25,320 --> 00:18:30,820 GetString podria tornar aquesta paraula clau especial NULL,? 305 00:18:30,820 --> 00:18:38,460 Si alguna cosa surt malament. Què podria sortir malament quan es diu alguna cosa així com GetString? 306 00:18:38,460 --> 00:18:42,550 Sí? [Resposta Estudiantil, inintel · ligible] >> Si. Així que potser malloc falla. 307 00:18:42,550 --> 00:18:45,310 En algun lloc sota la campana cridant a GetString malloc, 308 00:18:45,310 --> 00:18:48,210 que assigna la memòria, que permet l'emmagatzematge informàtic 309 00:18:48,210 --> 00:18:50,950 tots els caràcters que l'usuari escriu en el teclat. 310 00:18:50,950 --> 00:18:53,270 I suposem que l'usuari tenia un munt de temps lliure 311 00:18:53,270 --> 00:18:56,470 i escrit més, per exemple, de 2 mil milions de caràcters. 312 00:18:56,470 --> 00:18:59,600 Més caràcters que l'equip encara té RAM. 313 00:18:59,600 --> 00:19:02,350 Bé, GetString ha de ser capaç d'indicar que perquè, 314 00:19:02,350 --> 00:19:05,650 fins i tot si es tracta d'un cas super, super cantonada infreqüent. 315 00:19:05,650 --> 00:19:08,490 Ha de ser d'alguna manera capaç de manejar això, GetString i així, 316 00:19:08,490 --> 00:19:11,850 si tornar enrere i llegir la seva documentació, ho fa, de fet, torni NULL. 317 00:19:11,850 --> 00:19:16,150 Ara bé, si GetString falla en tornar NULL, getInt fallarà 318 00:19:16,150 --> 00:19:19,370 tornant INT_MAX, com un sentinella. 319 00:19:19,370 --> 00:19:22,650 Aquests són només convencions humanes. L'única manera de saber que aquest és el cas 320 00:19:22,650 --> 00:19:24,840 és mitjançant la lectura de la documentació. 321 00:19:24,840 --> 00:19:28,200 Així de desplaçar cap avall perquè el int és realment GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Així que si em desplaço una mica més lluny, en la línia 170 que té un comentari sobre aquestes línies. 323 00:19:34,220 --> 00:19:38,470 Per tant, declarem, en 172, un int n i aire char, i llavors aquesta nova funció 324 00:19:38,470 --> 00:19:41,870 que alguns de vosaltres heu ensopegat abans, però sscanf. 325 00:19:41,870 --> 00:19:44,190 Això significa cadena f exploració. 326 00:19:44,190 --> 00:19:48,580 En altres paraules, dóna'm una cadena i el vaig a buscar els fragments d'informació d'interès. 327 00:19:48,580 --> 00:19:53,820 Llavors, què significa això? Bé, suposo que escriure, literalment, 1 2 3 en el teclat, 328 00:19:53,820 --> 00:19:59,730 i després prem enter. Quin és el tipus de dades de 1 2 3 quan són retornats per GetString? 329 00:19:59,730 --> 00:20:05,010 Òbviament és una cadena, no? Tinc una cadena, de manera que 1 2 3 és realment "1 2 3" 330 00:20:05,010 --> 00:20:07,260 amb el 0 \ al final de la mateixa. Això no és un int. 331 00:20:07,260 --> 00:20:10,420 Això no és un nombre. Sembla un nombre, però no és en realitat. 332 00:20:10,420 --> 00:20:14,680 Llavors, què getInt he de fer? S'ha d'explorar aquesta cadena d'esquerra a dreta, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, i d'alguna manera convertir un enter real. 334 00:20:19,010 --> 00:20:21,010 Ara, vostè podria trobar la manera de fer això. 335 00:20:21,010 --> 00:20:24,240 Si penses en pset 2, vostè probablement té una mica còmode 336 00:20:24,240 --> 00:20:26,810 amb César o Vigenère pel que pot iterar sobre una seqüència, 337 00:20:26,810 --> 00:20:29,800 vostè pot convertir caràcters a sencers amb pua. Això és un munt de treball. 338 00:20:29,800 --> 00:20:32,800 Per què no cridar a una funció com sscanf que fa això per a vostè? 339 00:20:32,800 --> 00:20:37,520 Així sscanf espera un argument, en aquest cas anomenat línia, que és una cadena. 340 00:20:37,520 --> 00:20:41,310 A continuació, especificar, entre cometes, molt similar a printf, 341 00:20:41,310 --> 00:20:44,960 Què és el que s'espera veure en aquesta cadena? 342 00:20:44,960 --> 00:20:52,980 El que estic dient aquí és que esperem veure un nombre decimal i pot ser un personatge. 343 00:20:52,980 --> 00:20:54,990 I anem a veure per què aquest és el cas en un moment. 344 00:20:54,990 --> 00:20:58,440 Resulta que aquesta notació és ara una reminiscència de coses 345 00:20:58,440 --> 00:21:00,840 vam començar a parlar d'alguna cosa més d'una setmana. 346 00:21:00,840 --> 00:21:05,430 >> Quin és & N i & c fent per nosaltres aquí? [Respostes dels estudiants, inintel · ligible] 347 00:21:05,430 --> 00:21:07,610 Sí >>. M'està donant la direcció de n i la direcció de c. 348 00:21:07,610 --> 00:21:10,440 Ara, per què és tan important? Bé, ja saps que amb les funcions en C 349 00:21:10,440 --> 00:21:13,440 sempre es pot tornar un valor o cap valor en absolut. 350 00:21:13,440 --> 00:21:16,630 Vostè pot tornar un int, cadena, un flotador, char a, el que sigui. 351 00:21:16,630 --> 00:21:21,150 Podeu també tornar buida, sinó que només pot tornar una cosa al màxim. 352 00:21:21,150 --> 00:21:26,100 Però aquí volem sscanf per a mi tornar potser un enter, un nombre decimal, 353 00:21:26,100 --> 00:21:29,240 i també a. char, i vaig a explicar per què el char en un moment 354 00:21:29,240 --> 00:21:34,250 Així que efectivament volen f per tornar dues coses, això no és possible en C. 355 00:21:34,250 --> 00:21:38,460 Així que vostè pot evitar que en aprovar en 2 direccions, 356 00:21:38,460 --> 00:21:43,710 perquè quan et lliuren una funció de dues direccions, el que pot ser que la funció de fer amb ells? 357 00:21:43,710 --> 00:21:49,880 Es pot escriure en aquestes direccions. Vostè pot utilitzar l'operació * i "anar allà" per a cadascuna d'aquestes direccions. 358 00:21:49,880 --> 00:21:54,320 És una espècie d'aquest mecanisme de porta del darrere, però molt comú per canviar els valors de les variables 359 00:21:54,320 --> 00:21:58,020 en més de només 1 lloc, en aquest cas 2. 360 00:21:58,020 --> 00:22:04,590 Ara, notin que estic comprovant == a 1, i després tornar n si això és així, de fet, s'avaluen com true. 361 00:22:04,590 --> 00:22:09,340 Llavors, què està passant? Bé, tècnicament, tot el que realment volem que succeeixi en getInt és això. 362 00:22:09,340 --> 00:22:12,340 Volem analitzar, per dir-ho així, volem llegir la cadena 363 00:22:12,340 --> 00:22:16,210 "1 2 3", i si sembla que hi ha un nombre allà, 364 00:22:16,210 --> 00:22:21,360 el que estem dient sscanf de fer és posar aquest nombre, 1 2 3, en aquesta variable n per a mi. 365 00:22:21,360 --> 00:22:26,060 Per què, llavors, tinc això així? 366 00:22:26,060 --> 00:22:33,750 Quin és el paper de la també dient: sscanf, també pot ser que aconsegueixi un personatge aquí. 367 00:22:33,750 --> 00:22:36,890 [Parla l'estudiant, inintel · ligible] >> No - un punt decimal podia treballar. 368 00:22:36,890 --> 00:22:40,650 Anem a celebrar que va pensar per un moment. Què més? 369 00:22:40,650 --> 00:22:42,570 [Estudiant, inintel · ligible] >> Així que, bon pensament, podria ser el caràcter NULL. 370 00:22:42,570 --> 00:22:44,970 En realitat no és, en aquest cas. Sí? [Estudiant, inintel · ligible] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. O bé, permetin-me generalitzar encara més. 372 00:22:47,100 --> 00:22:49,670 El% c no és només per a la comprovació d'errors. 373 00:22:49,670 --> 00:22:52,510 No volem que hi hagi personatge després del número, 374 00:22:52,510 --> 00:22:54,980 però el que això em permet fer és el següent: 375 00:22:54,980 --> 00:23:01,270 Resulta que sscanf, a més d'emmagatzemar els valors de N i C, en aquest exemple aquí, 376 00:23:01,270 --> 00:23:08,170 el que també fa és que retorna el nombre de variables de posar els valors cm 377 00:23:08,170 --> 00:23:13,330 Així que si només escrius 1 2 3, llavors només el% d va a coincidir 378 00:23:13,330 --> 00:23:18,830 i només s'emmagatzema n amb un valor com 1 2 3 i res es posa en c; 379 00:23:18,830 --> 00:23:20,870 c segueix sent un valor escombraries, per dir-ho. 380 00:23:20,870 --> 00:23:23,550 Escombraries, ja que mai s'ha inicialitzat com un valor. 381 00:23:23,550 --> 00:23:29,390 Així que en aquest cas, sscanf retorna 1, perquè poblada un dels punters, 382 00:23:29,390 --> 00:23:33,650 en aquest cas, genial. Tinc un int, de manera que alliberar la línia per alliberar la memòria 383 00:23:33,650 --> 00:23:37,150 GetString que realment assignat, i després torno núm. 384 00:23:37,150 --> 00:23:42,210 Si no, si t'has preguntat on reintent declaració que ve, ve d'aquí. 385 00:23:42,210 --> 00:23:45,770 Si, per contra, de tipus I en 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 només alguna seqüència aleatòria de text, sscanf veurà, 387 00:23:48,640 --> 00:23:51,500 ooh, nombre, ooh, nombre, ooh, nombre, ooh - f. 388 00:23:51,500 --> 00:23:54,190 I es posarà la 1 2 3 núm. 389 00:23:54,190 --> 00:23:59,970 Es posarà la f en c, i després tornar 2. 390 00:23:59,970 --> 00:24:02,980 Així que tenim, simplement usant la definició bàsica de la conducta de scanf, 391 00:24:02,980 --> 00:24:06,170 una manera molt senzilla - bé, complex a primera vista, però al final de la dia, 392 00:24:06,170 --> 00:24:11,460 mecanisme bastant simple de dir, hi ha un int, i si ho és, que l'únic que he trobat? 393 00:24:11,460 --> 00:24:14,950 I l'espai en blanc aquí és deliberada. Si llegeix la documentació de sscanf, 394 00:24:14,950 --> 00:24:18,690 ella li diu que si s'inclou un tros d'espai en blanc al principi o al final, 395 00:24:18,690 --> 00:24:24,990 sscanf també permetrà a l'usuari, per qualsevol raó, per colpejar la barra d'espai 1 2 3, i que serà legítim. 396 00:24:24,990 --> 00:24:28,310 No crida en l'usuari només perquè prémer la barra espaiadora al principi o al final, 397 00:24:28,310 --> 00:24:32,160 que és només una mica més fàcil d'utilitzar. 398 00:24:32,160 --> 00:24:34,160 >> Qualsevol pregunta, llavors, en GetInts? Sí? 399 00:24:34,160 --> 00:24:36,820 [Pregunta Estudiant, inintel · ligible] 400 00:24:36,820 --> 00:24:40,740 >> Bona pregunta. Què passa si vostè acaba d'escriure en un char, com f, i prem enter 401 00:24:40,740 --> 00:24:47,830 sense haver de teclejar 1 2 3; què et sembla el comportament d'aquesta línia de codi seria llavors? 402 00:24:47,830 --> 00:24:50,500 Així sscanf que pot cobrir també, perquè en aquest cas, 403 00:24:50,500 --> 00:24:56,280 que no va a omplir n oc, sinó que tornarà en lloc 0. 404 00:24:56,280 --> 00:25:01,540 En aquest cas, també estic captura d'aquest escenari, ja que el valor esperat que vull és 1. 405 00:25:01,540 --> 00:25:07,310 Només vull una, i només una cosa per ser omplerts. Bona pregunta. Altres? 406 00:25:07,310 --> 00:25:09,610 >> Molt bé, així que no anirem a través de totes les funcions d'aquí, 407 00:25:09,610 --> 00:25:11,820 però la que sembla, potser, l'interès restant 408 00:25:11,820 --> 00:25:14,530 es GetString perquè resulta que GetFloat, getInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble GetLongLong tot punt gran part de la seva funcionalitat a GetString. 410 00:25:19,490 --> 00:25:22,860 Així que donem una ullada a la manera com es porta a terme aquí. 411 00:25:22,860 --> 00:25:27,040 Aquest sembla una mica complex però utilitza els mateixos fonaments 412 00:25:27,040 --> 00:25:29,680 que comencem a parlar de la setmana passada. Així que en GetString, 413 00:25:29,680 --> 00:25:32,670 que no té en argument com pel buit fins aquí, 414 00:25:32,670 --> 00:25:37,110 i retorna una cadena, de manera que estic declarant una cadena anomenada buffer. 415 00:25:37,110 --> 00:25:39,670 Realment no sé el que serà utilitzat per encara, però ja veurem. 416 00:25:39,670 --> 00:25:42,950 Looks like capacitat és, per defecte, 0; sense saber ben bé a on va això. 417 00:25:42,950 --> 00:25:44,920 No estic segur que n serà utilitzat per encara. 418 00:25:44,920 --> 00:25:47,860 Però ara s'està tornant una mica més interessant, pel que en la línia 243, 419 00:25:47,860 --> 00:25:51,760 declarem 1 int c, això és una espècie d'un detall tonto. 420 00:25:51,760 --> 00:25:58,080 Un char és de 8 bits, i 8 bits pot emmagatzemar quants valors diferents? 421 00:25:58,080 --> 00:26:03,310 256. El problema és que si vostè vol tenir 256 caràcters ASCII diferents, 422 00:26:03,310 --> 00:26:06,210 que hi ha, si vostè pensa de nou, i això no és una cosa per memoritzar. 423 00:26:06,210 --> 00:26:09,100 Però si penses en aquesta taula ASCII gran que vam tenir setmanes enrere, 424 00:26:09,100 --> 00:26:13,780 hi va haver, en aquest cas, 128 o 256 caràcters ASCII. 425 00:26:13,780 --> 00:26:16,220 Utilitzem tots els patrons de 0 i 1 que passa. 426 00:26:16,220 --> 00:26:19,410 Això és un problema si vostè vol ser capaç de detectar un error. 427 00:26:19,410 --> 00:26:23,290 Perquè si vostè ja està utilitzant 256 valors per als seus personatges, 428 00:26:23,290 --> 00:26:26,390 que en realitat no planificar el futur, perquè ara no hi ha manera de dir: 429 00:26:26,390 --> 00:26:29,750 "Això no és un personatge de fiar, el que és cert missatge erroni". 430 00:26:29,750 --> 00:26:32,430 Llavors, què fa el món és, utilitzar el valor més proper; 431 00:26:32,430 --> 00:26:35,790 una mena int perquè tingui un nombre boig de bits, 432 00:26:35,790 --> 00:26:39,610 32 per 4 bilions de valors possibles, de manera que només ha de acaben usant, 433 00:26:39,610 --> 00:26:44,800 essencialment, 257 d'ells, 1 dels quals té un significat especial com un error. 434 00:26:44,800 --> 00:26:49,190 >> Així que anem a veure com funciona això. En la línia 246, tinc aquest gran bucle while 435 00:26:49,190 --> 00:26:54,530 que està trucant fgetc, de f significat, getc, a continuació, stdin. 436 00:26:54,530 --> 00:26:59,030 Resulta que aquesta és només la forma més precisa de dir "llegir l'entrada des del teclat." 437 00:26:59,030 --> 00:27:02,730 Teclat estàndard mitjà d'entrada, la sortida estàndard significa pantalla, 438 00:27:02,730 --> 00:27:06,920 i l'error estàndard, que veurem en pset 4, significa que la pantalla, 439 00:27:06,920 --> 00:27:09,670 però una part especial de la pantalla de manera que no està fusionat 440 00:27:09,670 --> 00:27:13,760 amb una producció real que es pretén imprimir, però més sobre això en el futur. 441 00:27:13,760 --> 00:27:19,430 Així fgetc només significa llegir un caràcter del teclat i emmagatzemar-on? 442 00:27:19,430 --> 00:27:24,000 Guardi'l en c, i després comprovar, així que estic fent servir algunes conjuncions booleans aquí, 443 00:27:24,000 --> 00:27:28,430 comprovar que no és igual a \ n, de manera que l'usuari ha arribat a entrar. 444 00:27:28,430 --> 00:27:31,510 Volem deixar en aquest punt, al final del bucle, i també volem comprovar 445 00:27:31,510 --> 00:27:36,170 per la constant especial, EOF, el que si sap o endevina - què significa? 446 00:27:36,170 --> 00:27:39,860 Final de l'arxiu. Així que això és una cosa sense sentit, perquè si estic escrivint en el teclat, 447 00:27:39,860 --> 00:27:41,900 no hi ha realment cap arxiu involucrats en això, 448 00:27:41,900 --> 00:27:44,330 però això és només una espècie del terme genèric utilitzat per a referir- 449 00:27:44,330 --> 00:27:50,320 que només ve dels dits de l'humà. EOF. Final de l'arxiu. 450 00:27:50,320 --> 00:27:52,600 Com acotació al marge, si mai t'has colpejat el control d en el teclat, 451 00:27:52,600 --> 00:27:54,680 No és que vostè tindria encara, vostè ha colpejat control c. 452 00:27:54,680 --> 00:27:57,920 Però el control d enviar aquest especial EOF constant anomenada. 453 00:27:57,920 --> 00:28:03,100 >> Així que ara només ens queda una mica d'assignació de memòria dinàmica. 454 00:28:03,100 --> 00:28:06,460 Així que si n + 1> la capacitat, ara explicaré núm. 455 00:28:06,460 --> 00:28:09,380 n és simplement quants bytes es troben actualment en el buffer, 456 00:28:09,380 --> 00:28:11,970 la cadena que s'està construint en l'actualitat per part de l'usuari. 457 00:28:11,970 --> 00:28:16,240 Si vostè té més personatges en la memòria intermèdia del que té la capacitat de la memòria intermèdia, 458 00:28:16,240 --> 00:28:20,760 intuïtivament, el que hem de fer llavors és assignar més capacitat. 459 00:28:20,760 --> 00:28:24,490 Vaig a passar fregant algunes de les operacions aritmètiques aquí 460 00:28:24,490 --> 00:28:26,900 i centrar-se només en aquesta funció aquí. 461 00:28:26,900 --> 00:28:29,170 Saps el que malloc és, o almenys familiaritzats general. 462 00:28:29,170 --> 00:28:32,380 Endevina el que realloc fa. [Resposta Estudiantil, inintel · ligible] 463 00:28:32,380 --> 00:28:35,690 Sí >>. I no és prou l'addició de memòria, sinó que reassigna la memòria de la següent manera: 464 00:28:35,690 --> 00:28:40,530 Si encara hi ha espai a l'extrem de la corda perquè duri més que la memòria 465 00:28:40,530 --> 00:28:43,370 del que originalment li dóna, llavors vostè aconseguirà que la memòria addicional. 466 00:28:43,370 --> 00:28:46,640 Així que vostè pot posar les cadenes de caràcters esquena amb esquena a esquena amb esquena. 467 00:28:46,640 --> 00:28:49,290 Però si aquest no és el cas, ja que va esperar massa temps 468 00:28:49,290 --> 00:28:51,700 i té alguna cosa aleatori es va deixar caure en memòria allà, però no és extra 469 00:28:51,700 --> 00:28:56,480 memòria aquí, això està bé. Realloc farà tot el treball pesat per a vostè, 470 00:28:56,480 --> 00:28:58,810 moure la cadena ha llegit fins ara d'aquí, 471 00:28:58,810 --> 00:29:02,550 el va deixar allà, i després li donen la pista una mica més en aquest punt. 472 00:29:02,550 --> 00:29:05,610 Així que amb un gest de la mà, deixa dir que el que està fent GetString 473 00:29:05,610 --> 00:29:09,540 s'està començant amb un buffer petit, potser un sol caràcter, 474 00:29:09,540 --> 00:29:12,300 i si l'usuari escriu en 2 caràcters, GetString acaba 475 00:29:12,300 --> 00:29:15,210 trucant realloc i diu: "Oh, un personatge no era suficient. 476 00:29:15,210 --> 00:29:18,480 Dóna'm 2 caràcters. Llavors, si vostè llegeix a través de la lògica del bucle, 477 00:29:18,480 --> 00:29:21,070 que dirà, 'Oh, l'usuari va escriure en 3 caràcters. 478 00:29:21,070 --> 00:29:25,690 Dóna'm ara no 2, sinó 4 caràcters, llavors dóna'm 8, llavors dóna'm 16 i 32. 479 00:29:25,690 --> 00:29:28,180 El fet que estic doblant la capacitat cada vegada 480 00:29:28,180 --> 00:29:30,320 significa que el buffer no creixerà lentament. 481 00:29:30,320 --> 00:29:35,870 Creixerà molt ràpid, i el que podria ser l'avantatge d'això? 482 00:29:35,870 --> 00:29:38,540 Per què estic doblant la mida de la memòria intermèdia, encara que l'usuari 483 00:29:38,540 --> 00:29:41,450 només pot ser que necessiti un personatge extra del teclat? 484 00:29:41,450 --> 00:29:44,830 [Estudiant resposta inintel · ligible]. >> Què és això? 485 00:29:44,830 --> 00:29:46,750 Exactament. No ha de créixer amb tanta freqüència. 486 00:29:46,750 --> 00:29:48,870 I això és només una espècie de - vostè està de cobertura seves apostes aquí. 487 00:29:48,870 --> 00:29:54,150 La idea és que vostè no desitja trucar realloc molt, ja que tendeix a ser lenta. 488 00:29:54,150 --> 00:29:56,840 Cada vegada que li demana al sistema operatiu per a la memòria, com aviat veurem 489 00:29:56,840 --> 00:30:00,620 en un conjunt de problemes en el futur, es tendeix a portar el seu temps. 490 00:30:00,620 --> 00:30:04,980 Així que minimitza la quantitat de temps, fins i tot si vostè està perdent una mica d'espai, tendeix a ser una bona cosa. 491 00:30:04,980 --> 00:30:07,250 >> Però si llegim a través de la part final del GetString aquí, 492 00:30:07,250 --> 00:30:10,880 i de nou, la comprensió de cada línia aquí no és tan important avui en dia. 493 00:30:10,880 --> 00:30:14,830 Però cal notar que finalment crida a malloc nou, i l'assignació al 494 00:30:14,830 --> 00:30:16,980 exactament tants bytes com necessita per a la cadena 495 00:30:16,980 --> 00:30:21,620 i després llença a les escombraries trucant lliure, la memòria intermèdia excessivament gran, 496 00:30:21,620 --> 00:30:23,510 si de fet he doblat diverses vegades. 497 00:30:23,510 --> 00:30:25,970 En fi, així és com GetString ha estat treballant tot aquest temps. 498 00:30:25,970 --> 00:30:30,100 Tot el que fa és llegir un caràcter alhora una i altra vegada i una altra 499 00:30:30,100 --> 00:30:37,930 i cada vegada que necessita una mica de memòria addicional, li demana al sistema operatiu perquè en cridar realloc. 500 00:30:37,930 --> 00:30:41,660 Alguna pregunta? Està bé. 501 00:30:41,660 --> 00:30:45,220 >> Un atac. Ara que entenem els punters, o almenys 502 00:30:45,220 --> 00:30:47,560 estan cada vegada més familiaritzats amb els punters, 503 00:30:47,560 --> 00:30:50,020 anem a considerar com el món sencer comença a esfondrar- 504 00:30:50,020 --> 00:30:53,160 si no arribes a defensar contra els usuaris contradictori, 505 00:30:53,160 --> 00:30:55,180 persones que estan tractant de tallar al sistema. 506 00:30:55,180 --> 00:31:00,260 Les persones que estan tractant de robar seu programari eludint un codi de registre 507 00:31:00,260 --> 00:31:02,150 que en cas contrari podria haver d'escriure polz 508 00:31:02,150 --> 00:31:04,860 Fes un cop d'ull a aquest exemple aquí, que és només el codi C 509 00:31:04,860 --> 00:31:07,920 que té una funció principal a la part inferior, que crida a una funció foo, 510 00:31:07,920 --> 00:31:12,100 i què és el que passa a foo? [Estudiant] Un sol argument. 511 00:31:12,100 --> 00:31:15,660 Solter >> argument. Així que argv [1], el que significa la primera paraula que l'usuari va escriure 512 00:31:15,660 --> 00:31:19,150 en la línia d'ordres després de a.out o el que s'anomena el programa. 513 00:31:19,150 --> 00:31:24,920 Així foo, a la part superior, porta en un char *, char *, però és el que? 514 00:31:24,920 --> 00:31:28,860 String. No hi ha res de nou aquí, i aquesta cadena és arbitràriament ser anomenat bar. 515 00:31:28,860 --> 00:31:36,090 En aquesta línia aquí, char c [12], en una mena de semi-Anglès tècnic, el que està fent aquesta línia? 516 00:31:36,090 --> 00:31:40,640 Matriu de -? Personatges. Dóna'm una matriu de 12 caràcters. 517 00:31:40,640 --> 00:31:44,970 Així que podríem anomenar això un buffer. S'anomena tècnicament c, però en un tampó de programació 518 00:31:44,970 --> 00:31:47,890 només significa un munt d'espai que vostè pot posar algunes coses polz 519 00:31:47,890 --> 00:31:49,940 >> A continuació, finalment, memcpy, no hem usat abans. 520 00:31:49,940 --> 00:31:52,380 Però que és fàcil endevinar el que fa. Còpia de la memòria. 521 00:31:52,380 --> 00:31:58,790 Què fer? Bé, pel que sembla còpia bar, la seva entrada, al c, 522 00:31:58,790 --> 00:32:03,420 però només fins a la longitud de la barra. 523 00:32:03,420 --> 00:32:07,440 Però hi ha un error aquí. 524 00:32:07,440 --> 00:32:14,500 Bé, per la qual cosa tècnicament hauria de fer strlen (bar) x sizeof (char), això és correcte. 525 00:32:14,500 --> 00:32:17,920 Però en el pitjor dels casos aquí, anem a suposar que això és - així, està bé. 526 00:32:17,920 --> 00:32:23,760 Llavors hi ha dos errors. Així sizeof (char), està bé, farem això una mica més. 527 00:32:23,760 --> 00:32:28,860 Així que ara que encara hi ha un error, que és el que? 528 00:32:28,860 --> 00:32:31,630 [Resposta Estudiantil, inintel · ligible] >> veure per què? Bé, pel que ha de comprovar 529 00:32:31,630 --> 00:32:35,010 NULL, perquè les coses dolentes succeeixen quan el punter és NULL, 530 00:32:35,010 --> 00:32:38,490 Com que vostè pot ser que acabi sobre de anar-hi, i no sempre es va a NULL 531 00:32:38,490 --> 00:32:40,890 per eliminació de referències amb l'operador *. 532 00:32:40,890 --> 00:32:45,250 Així que això és bo, i què més farem? Lògicament hi ha un error aquí. 533 00:32:45,250 --> 00:32:47,650 [Resposta Estudiantil, inintel · ligible] 534 00:32:47,650 --> 00:32:51,340 Per tal de comprovar si >> argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Bé, de manera que hi ha tres errors en aquest programa. 536 00:32:54,130 --> 00:33:00,080 No estem comprovant si l'usuari realment escriure en res a argv [1], bé. 537 00:33:00,080 --> 00:33:02,240 Quin és l'error tercera? Sí? 538 00:33:02,240 --> 00:33:04,420 [Resposta Estudiantil, inintel · ligible] >> Bé. 539 00:33:04,420 --> 00:33:09,590 Així que ens registrem un escenari. Hem comprovat implícitament no copiar més memòria 540 00:33:09,590 --> 00:33:12,800 que s'excedeixi la longitud de la barra. 541 00:33:12,800 --> 00:33:15,720 Així que si la cadena que l'usuari va escriure en és de 10 caràcters de longitud, 542 00:33:15,720 --> 00:33:18,260 això ens diu: "Només copiar 10 caràcters. 543 00:33:18,260 --> 00:33:21,140 I això està bé, però què passa si l'usuari va escriure en una paraula en l'indicador 544 00:33:21,140 --> 00:33:29,360 com una paraula de 20 caràcters, el que és, dient còpia 20 caràcters de barra en què? 545 00:33:29,360 --> 00:33:32,840 c, també conegut com el nostre buffer, el que significa que acabes d'escriure dades 546 00:33:32,840 --> 00:33:35,950 a 8 llocs byte que vostè no és propietari, 547 00:33:35,950 --> 00:33:38,320 i no els tenen en el sentit que mai se'ls assignen. 548 00:33:38,320 --> 00:33:41,190 Així que això és el que es coneix generalment com l'atac de desbordament de memòria intermèdia, 549 00:33:41,190 --> 00:33:46,650 o buffer overrun atac i atac, en el sentit que si l'usuari 550 00:33:46,650 --> 00:33:50,650 o el programa que està trucant a la seva funció està fent això amb malícia, 551 00:33:50,650 --> 00:33:53,780 el que realment passa a continuació podria ser molt dolent. 552 00:33:53,780 --> 00:33:55,690 >> Anem a fer una ullada a aquesta foto aquí. 553 00:33:55,690 --> 00:33:59,070 Aquest quadre representa la pila de memòria. 554 00:33:59,070 --> 00:34:01,050 I recordar que cada vegada que es crida a una funció, 555 00:34:01,050 --> 00:34:04,520 rep aquest petit marc a la pila i després una altra i després una altra i una altra. 556 00:34:04,520 --> 00:34:07,250 I fins ara hem només una mica abstret aquestes lluny com rectangles 557 00:34:07,250 --> 00:34:09,380 o bé hi ha a la pissarra oa la pantalla aquí. 558 00:34:09,380 --> 00:34:12,219 Però si ens centrem en un d'aquests rectangles, 559 00:34:12,219 --> 00:34:16,460 quan es crida a una funció foo, resulta que hi ha més a la pila 560 00:34:16,460 --> 00:34:18,739 dins d'aquest marc i rectangle que 561 00:34:18,739 --> 00:34:23,370 que amb prou feines x i i i a i b, com ho vam fer parlant de swap. 562 00:34:23,370 --> 00:34:25,949 Resulta que hi ha alguns detalls de nivell inferior, 563 00:34:25,949 --> 00:34:27,780 entre ells la direcció de retorn. 564 00:34:27,780 --> 00:34:33,020 Així que resulta quan principal diu foo, el principal ha d'informar foo 565 00:34:33,020 --> 00:34:36,760 quina és la direcció principal està en la memòria de l'ordinador. 566 00:34:36,760 --> 00:34:40,659 Perquè si no, tan aviat com foo es fa executar, com en aquest cas aquí, 567 00:34:40,659 --> 00:34:43,790 una vegada que arribi a aquest claudàtor prop al final de foo, 568 00:34:43,790 --> 00:34:48,860 com diables se sap foo on el control del programa se suposa que ha d'anar? 569 00:34:48,860 --> 00:34:52,460 Resulta que la resposta a aquesta pregunta és en aquest rectangle vermell aquí. 570 00:34:52,460 --> 00:34:56,130 Això representa un punter, i li toca a l'ordinador per emmagatzemar, temporalment, 571 00:34:56,130 --> 00:35:00,250 a la pila de trucada de la direcció principal, de manera que tan aviat com foo es fa executar, 572 00:35:00,250 --> 00:35:04,110 l'equip sap on i quina línia principal per tornar. 573 00:35:04,110 --> 00:35:06,900 Saved punter marc relaciona de manera similar a això. 574 00:35:06,900 --> 00:35:09,620 Bar Char * aquí representa què? 575 00:35:09,620 --> 00:35:14,740 Bé, ara aquest segment blau aquí és foo marc, quin és bar? 576 00:35:14,740 --> 00:35:18,300 Bé, per bar és només l'argument de la funció foo. 577 00:35:18,300 --> 00:35:20,720 >> Així que ara estem de tornada en el quadre familiar. 578 00:35:20,720 --> 00:35:22,960 Hi ha més coses i més distraccions a la pantalla 579 00:35:22,960 --> 00:35:27,490 però aquest segment de color blau clar és el que hem estat dibuixant a la pissarra per a alguna cosa com swap. 580 00:35:27,490 --> 00:35:31,890 Aquest és el marc per foo i l'únic que en aquest moment és bar, 581 00:35:31,890 --> 00:35:34,630 que és aquest paràmetre. 582 00:35:34,630 --> 00:35:39,840 Però el que més hauria d'estar a la pila, d'acord amb aquest codi aquí? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Així que també hem de veure 12 quadres de la memòria, 584 00:35:44,280 --> 00:35:46,260 assignat a una variable anomenada c. 585 00:35:46,260 --> 00:35:48,340 I, de fet hem de a la pantalla. 586 00:35:48,340 --> 00:35:51,650 La part superior hi ha c [0], i llavors l'autor d'aquest diagrama 587 00:35:51,650 --> 00:35:55,130 no es va molestar a dibuixar totes les places però en realitat hi ha 12 hi 588 00:35:55,130 --> 00:36:00,120 perquè si ens fixem en la part inferior dreta, c [11], si comptem des de 0, és de 12 bytes mateixes. 589 00:36:00,120 --> 00:36:06,190 Però aquí està el problema: En quina direcció es c creixent? 590 00:36:06,190 --> 00:36:10,390 Ordenar de dalt a baix, no? Si s'inicia a la part superior i creix cap al fons, 591 00:36:10,390 --> 00:36:13,480 no sembla que ens va deixar la pista molt aquí en absolut. 592 00:36:13,480 --> 00:36:15,320 Hem classe de nosaltres mateixos pintat en una cantonada, 593 00:36:15,320 --> 00:36:20,210 i que c [11] és just contra bar, que està just en contra punter del marc de pila, 594 00:36:20,210 --> 00:36:23,800 que és just en contra la direcció del remitent, hi ha espai més. 595 00:36:23,800 --> 00:36:26,100 Llavors, ¿quina és la implicació, llavors, si fiques la pota, 596 00:36:26,100 --> 00:36:30,460 i està llegint 20 bytes en un buffer de 12 bytes? 597 00:36:30,460 --> 00:36:33,460 On són aquests 8 bytes addicionals anirà? 598 00:36:33,460 --> 00:36:36,370 Dins de tota la resta, alguns dels quals és súper important. 599 00:36:36,370 --> 00:36:40,480 I el més important, potencialment, és el quadre vermell aquí, l'adreça del remitent. 600 00:36:40,480 --> 00:36:44,720 Perquè suposo que vostè és ja sigui accidental o de contradicció 601 00:36:44,720 --> 00:36:48,040 sobreescriure aquests 4 bytes, que s'ocupen de punter, 602 00:36:48,040 --> 00:36:53,190 no només amb les escombraries, però amb un nombre que passa a representar una adreça real a la memòria? 603 00:36:53,190 --> 00:36:55,930 Quina és la implicaiton, lògicament? 604 00:36:55,930 --> 00:36:59,080 [Respostes dels estudiants, inintel · ligible] >> Exactament. Quan torna foo 605 00:36:59,080 --> 00:37:03,560 i èxits que claudàtor, el programa es procedirà per no tornar al menú principal, 606 00:37:03,560 --> 00:37:08,320 que tornarà al que la direcció està en aquesta caixa vermella. 607 00:37:08,320 --> 00:37:11,560 >> Ara bé, en el cas del registre de programari eludir, 608 00:37:11,560 --> 00:37:14,400 Quina és l'adreça que està sent retornat a la funció es 609 00:37:14,400 --> 00:37:18,820 que normalment es diu després d'haver pagat pel programari i els introdueix el teu codi de registre? 610 00:37:18,820 --> 00:37:23,160 Vostè pot ordenar truc de l'ordinador en no anar aquí, però en el seu lloc, anar aquí. 611 00:37:23,160 --> 00:37:27,950 O, si ets realment intel · ligent, un adversari realment pot escriure en el teclat, 612 00:37:27,950 --> 00:37:32,500 per exemple, no és una paraula real, els personatges no 20, però suposo que ell o ella 613 00:37:32,500 --> 00:37:36,200 en alguns tipus de caràcters que representen el codi? 614 00:37:36,200 --> 00:37:38,860 I no serà el codi C, que serà els personatges 615 00:37:38,860 --> 00:37:42,920 que representen els codis binaris de màquines, 0 i 1. 616 00:37:42,920 --> 00:37:46,740 Però suposem que ets prou intel · ligent com per fer això, per enganxar d'alguna manera en l'indicatiu GetString 617 00:37:46,740 --> 00:37:49,460 una cosa que és essencialment el codi compilat, 618 00:37:49,460 --> 00:37:56,900 i els últims 4 bytes que sobreescriure la direcció del remitent, i quina direcció ho fa d'entrada? 619 00:37:56,900 --> 00:38:01,860 S'emmagatzema en aquest rectangle vermell la direcció del primer byte de la memòria intermèdia. 620 00:38:01,860 --> 00:38:04,270 Així que cal ser molt intel · ligent, i això és un munt de prova i error 621 00:38:04,270 --> 00:38:08,500 per a la gent dolenta per aquí, però, si es pot saber què tan gran és aquest tampó 622 00:38:08,500 --> 00:38:12,170 de manera que els últims bytes de l'entrada que s'inclouen amb el programa 623 00:38:12,170 --> 00:38:15,970 passar a ser equivalent a la direcció d'inici de la memòria intermèdia, 624 00:38:15,970 --> 00:38:22,270 vostè pot fer això. Si diem, en general, hola, i \ 0, això és el que acaba en la memòria intermèdia. 625 00:38:22,270 --> 00:38:27,860 Però si ets més intel · ligent, i omplir el buffer amb el que genèricament anomenarem codi d'atac, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: Atacar, atacar, atacar i atacar, quan això és una cosa que fa una cosa dolenta. 627 00:38:31,920 --> 00:38:35,190 Bé, què passa si ets realment intel · ligent, aquí teniu com: 628 00:38:35,190 --> 00:38:41,740 En el quadre vermell aquí és una seqüència de nombres: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Recordeu que que coincideix amb el nombre que està aquí dalt. 630 00:38:44,890 --> 00:38:47,280 Està en ordre invers, però més d'això en un altre moment. 631 00:38:47,280 --> 00:38:51,430 Tingueu en compte que aquesta direcció de retorn s'hagin modificat 632 00:38:51,430 --> 00:38:54,970 per igualar la direcció d'aquí, no l'adreça de la principal. 633 00:38:54,970 --> 00:39:00,170 Així que si el dolent de la pel · lícula és súper intel · ligent, ell o ella va a incloure en aquest codi d'atac 634 00:39:00,170 --> 00:39:02,890 una mena, 'Elimina tots els arxius de l'usuari. 635 00:39:02,890 --> 00:39:06,320 O 'Copiar les contrasenyes ", o" Crea un compte d'usuari que podeu entrar en. 636 00:39:06,320 --> 00:39:10,130 Res en absolut, i això és alhora el perill i el poder de la C. 637 00:39:10,130 --> 00:39:12,900 Com que té accés a la memòria a través de punters 638 00:39:12,900 --> 00:39:15,950 i per tant es pot escriure el que vulgui en la memòria d'un ordinador. 639 00:39:15,950 --> 00:39:19,290 Vostè pot fer que un equip fer el que vulguis amb només 640 00:39:19,290 --> 00:39:22,780 haver saltar dins del seu propi espai de memòria. 641 00:39:22,780 --> 00:39:27,230 I així, fins ara, de manera que molts programes i llocs web internacionals de tants que estan compromesos 642 00:39:27,230 --> 00:39:29,730 es redueixen a les persones que prenen avantatge d'això. 643 00:39:29,730 --> 00:39:32,510 I això pot semblar un atac super-sofisticada, 644 00:39:32,510 --> 00:39:34,220 però no sempre comença d'aquesta manera. 645 00:39:34,220 --> 00:39:36,770 >> La realitat és que el que la gent dolenta sol fer és, 646 00:39:36,770 --> 00:39:41,470 si es tracta d'un programa en una línia d'ordres o un programa d'interfície gràfica d'usuari o una pàgina web, 647 00:39:41,470 --> 00:39:43,290 S'acaba de començar a proporcionar una tonteria. 648 00:39:43,290 --> 00:39:46,940 Vostè escriu en una paraula molt gran en el camp de cerca i premeu enter, 649 00:39:46,940 --> 00:39:49,030 i esperar a veure si es bloqueja el lloc web. 650 00:39:49,030 --> 00:39:53,270 O esperar a veure si el programa es manifesta algun missatge d'error. 651 00:39:53,270 --> 00:39:55,480 Perquè si tens sort, ja que el dolent de la pel · lícula, 652 00:39:55,480 --> 00:39:59,610 i proporcionar alguna entrada boig que bloqueja el programa, 653 00:39:59,610 --> 00:40:02,280 això vol dir que el programador no va preveure el seu mal comportament 654 00:40:02,280 --> 00:40:05,420 el que significa que probablement pugui, amb el suficient esforç, 655 00:40:05,420 --> 00:40:09,870 suficient judici i error, trobar la manera de lliurar un atac més precís. 656 00:40:09,870 --> 00:40:15,900 Així que una part tan important de la seguretat no és només evitar aquests atacs del tot, però la seva detecció 657 00:40:15,900 --> 00:40:20,250 i en realitat mirant logs i veure el que la gent boja entrades teclejades al seu lloc web. 658 00:40:20,250 --> 00:40:26,040 Quins termes de cerca i la gent escriu a la seva pàgina web amb l'esperança d'algun desbordament buffer? 659 00:40:26,040 --> 00:40:28,900 I tot això es redueix al bàsic senzilles del que és una matriu, 660 00:40:28,900 --> 00:40:32,510 i què significa per assignar i utilitzar la memòria? 661 00:40:32,510 --> 00:40:34,920 I relacionat amb això, també, és la següent. 662 00:40:34,920 --> 00:40:37,520 >> Així que anem a fer una ullada a l'interior d'un disc dur nou. 663 00:40:37,520 --> 00:40:40,190 Pel que recordo d'una o dues setmanes enrere, que en arrossegar arxius 664 00:40:40,190 --> 00:40:45,470 a la paperera de reciclatge o pot d'escombraries, què passa? 665 00:40:45,470 --> 00:40:47,850 [Estudiant] Res. >> Sí, absolutament res. Finalment, si s'executa sota 666 00:40:47,850 --> 00:40:51,370 espai en disc, Windows o Mac OS començarà a eliminar arxius per vostè. 667 00:40:51,370 --> 00:40:53,670 Però si arrossega alguna cosa allà, llavors no és pas segur. 668 00:40:53,670 --> 00:40:56,550 Tot membre del seu company de quart, un amic o familiar ha de fer és doble clic, i llest. 669 00:40:56,550 --> 00:40:59,720 No tots els arxius incomplets que van tractar d'esborrar. 670 00:40:59,720 --> 00:41:02,840 Així que la majoria de nosaltres si més no saber que vostè ha de fer clic dret o control clic 671 00:41:02,840 --> 00:41:05,320 i buidar les escombraries, o alguna cosa per l'estil. 672 00:41:05,320 --> 00:41:07,900 Però fins i tot llavors, que no acaba de fer el truc. 673 00:41:07,900 --> 00:41:11,340 Perquè el que passa quan es té un arxiu en el disc dur 674 00:41:11,340 --> 00:41:14,590 que representa algun processador de text o JPEG poc? 675 00:41:14,590 --> 00:41:18,820 I això representa el disc dur, i diguem que aquesta estella aquí representa aquest arxiu, 676 00:41:18,820 --> 00:41:21,640 i es compon d'un munt de 0 i 1. 677 00:41:21,640 --> 00:41:25,470 Què passa quan vostè no només arrossegar el fitxer a la paperera o paperera de reciclatge, 678 00:41:25,470 --> 00:41:30,390 però també buidar? 679 00:41:30,390 --> 00:41:32,820 Una espècie de res. No hi ha absolutament res ara. 680 00:41:32,820 --> 00:41:37,630 Ara és simplement res, perquè una mica d'alguna cosa que passa en la forma d'aquesta taula. 681 00:41:37,630 --> 00:41:41,170 Així que hi ha una mena de base de dades o taula dins de la memòria d'un ordinador 682 00:41:41,170 --> 00:41:44,470 que essencialment té 1 columna per als noms de fitxers, 683 00:41:44,470 --> 00:41:50,550 i una columna per a la ubicació de l'arxiu, on això podria ser la ubicació 123, un nombre a l'atzar. 684 00:41:50,550 --> 00:41:58,270 Així que podríem tenir quelcom x.jpg i la ubicació 123. 685 00:41:58,270 --> 00:42:02,870 I què passa llavors, en buidar la paperera? 686 00:42:02,870 --> 00:42:06,720 Que se'n vagin. Però el que no desapareix és del 0 i l'1. 687 00:42:06,720 --> 00:42:09,690 >> Llavors, què és, llavors, la connexió al conjunt de processadors 4? 688 00:42:09,690 --> 00:42:13,460 Bé, amb el conjunt de processadors 4, només perquè hem esborrat accidentalment 689 00:42:13,460 --> 00:42:15,890 la targeta flash compacta que tenia totes aquestes fotos, 690 00:42:15,890 --> 00:42:18,710 o simplement perquè la mala sort es va corrompre, 691 00:42:18,710 --> 00:42:21,170 no vol dir que el 0 i el d'1 no estan encara allà. 692 00:42:21,170 --> 00:42:23,920 Potser alguns d'ells s'han perdut perquè alguna cosa es corromp 693 00:42:23,920 --> 00:42:26,530 en el sentit que alguns de 0 convertir en 1 i la d'1 es va convertir en 0. 694 00:42:26,530 --> 00:42:30,460 Les coses dolentes poden succeir a causa de programari defectuós o maquinari defectuós. 695 00:42:30,460 --> 00:42:33,510 Però molts d'aquests bits, potser fins i tot el 100% d'ells encara hi són, 696 00:42:33,510 --> 00:42:38,330 el que passa és que l'ordinador o la càmera no sap on va començar JPEG 1 697 00:42:38,330 --> 00:42:41,660 i on JPEG 2 va començar, però si vostè, el programador, 698 00:42:41,660 --> 00:42:45,800 saps, amb una mica de sentit comú, on els arxius JPEG o el que semblen, 699 00:42:45,800 --> 00:42:49,570 vostè pot analitzar els 0 i els 1 i dir, 'Ooh. JPEG. Ooh, JPEG. 700 00:42:49,570 --> 00:42:52,830 Vostè pot escriure un programa amb essencialment un bucle for o while 701 00:42:52,830 --> 00:42:56,100 que recupera tots i cada un d'aquests arxius. 702 00:42:56,100 --> 00:42:59,360 Així que la lliçó llavors, és començar "segura" esborrant els seus arxius 703 00:42:59,360 --> 00:43:01,720 si vols evitar això del tot. Sí? 704 00:43:01,720 --> 00:43:06,940 [Pregunta Estudiant, inintel · ligible] 705 00:43:06,940 --> 00:43:11,150 >> Tenir més memòria que abans - 706 00:43:11,150 --> 00:43:14,790 Oh! Bona pregunta. Per què, llavors, després de buidar les escombraries, 707 00:43:14,790 --> 00:43:18,300 L'ordinador li dirà que vostè té més espai lliure que abans? 708 00:43:18,300 --> 00:43:22,450 En poques paraules, perquè està mentint. Més tècnicament, vostè té més espai. 709 00:43:22,450 --> 00:43:26,720 Perquè ara que has dit, pots posar altres coses en aquest arxiu un cop va ser, 710 00:43:26,720 --> 00:43:28,930 però això no vol dir que els bits desapareixeran, 711 00:43:28,930 --> 00:43:33,070 i això no vol dir que els bits s'estan canviant tots els 0, per exemple, per a la seva protecció. 712 00:43:33,070 --> 00:43:37,520 En canvi, si "segura" esborrar arxius, o destruir físicament el dispositiu, 713 00:43:37,520 --> 00:43:40,810 que realment és l'única manera, de vegades, al voltant d'això. 714 00:43:40,810 --> 00:43:45,300 Així que per què no ens anem en aquesta nota semi-por, i ens veiem el dilluns. 715 00:43:45,300 --> 00:43:52,810 CS50.TV