1 00:00:00,000 --> 00:00:02,700 [Powered by Google Translate] [Walkthrough - Problem Set 4] 2 00:00:02,700 --> 00:00:05,000 [Zamyla Chan - Harvard University] 3 00:00:05,000 --> 00:00:07,340 [To je CS50. - CS50.TV] 4 00:00:08,210 --> 00:00:11,670 V redu. Pozdravljeni, vsi, in dobrodošli potopis 4. 5 00:00:11,670 --> 00:00:14,270 >> Danes je naša pset je forenzika. 6 00:00:14,270 --> 00:00:18,080 Forenziki je res zabavno pset ki vključuje stik z bitne datoteke 7 00:00:18,080 --> 00:00:21,550 ugotoviti kdo storil kaznivo dejanje. 8 00:00:21,550 --> 00:00:24,200 Potem bomo nekaj spremeniti velikost bitne datoteke 9 00:00:24,200 --> 00:00:27,780 potem bomo tudi dogaja, da se ukvarjajo z zelo zabavni del se imenuje obnovitev, 10 00:00:27,780 --> 00:00:31,160 , v katerem smo v bistvu predali spominsko kartico 11 00:00:31,160 --> 00:00:34,350 , v katerem je nekdo zbrisal vse svoje datoteke, 12 00:00:34,350 --> 00:00:38,860 in smo prosili, da si opomore te datoteke. 13 00:00:38,860 --> 00:00:42,910 >> Ampak najprej, preden smo prišli v pset, res samo želim čestitati vsem. 14 00:00:42,910 --> 00:00:45,230 Mi smo približno na polovici tega predmeta. 15 00:00:45,230 --> 00:00:50,070 Kviz 0 je za nami in smo na pset4, tako da v bistvu smo na polovici poti. 16 00:00:50,070 --> 00:00:55,490 Prišli smo daleč, če pogledaš nazaj v svoje psets, pset0 in pset1, 17 00:00:55,490 --> 00:00:57,300 zato se čestitam za to, 18 00:00:57,300 --> 00:01:00,760 in bomo dobili v nekaj res zabavno stvari. 19 00:01:00,760 --> 00:01:07,070 >> Torej, naša orodjarna za to pset, še enkrat, namesto da teče sudo yum-y posodobitev, 20 00:01:07,070 --> 00:01:13,890 bomo lahko šele teči update50 če ste na različico 17,3 in več od aparata. 21 00:01:13,890 --> 00:01:17,380 Torej, se prepričajte, da delujejo update50 - to je veliko lažje, nekaj manj znakov - 22 00:01:17,380 --> 00:01:20,640 se prepričajte, da ste v najnovejši različici aparata. 23 00:01:20,640 --> 00:01:25,410 Še posebej je pomembno, da update50, ko smo začeli uporabljati CS50 Check. 24 00:01:25,410 --> 00:01:28,700 Torej, se prepričajte, da to storite. 25 00:01:28,700 --> 00:01:30,760 >> Za vse dele za to pset, 26 00:01:30,760 --> 00:01:34,350 bomo morali ukvarjati z datoteko vhodov in izhodov, vložite I / O. 27 00:01:34,350 --> 00:01:38,140 Bomo šli skozi veliko programov, ki se ukvarjajo z nizi 28 00:01:38,140 --> 00:01:40,350 kaže, da datoteke in stvari, kot je ta, 29 00:01:40,350 --> 00:01:43,050 zato želimo zagotoviti, da smo res pozna in udobno 30 00:01:43,050 --> 00:01:47,990 , ki se ukvarjajo s tem, kako vhod in izhod v datotekah. 31 00:01:47,990 --> 00:01:52,080 >> V distribucijskem oznake za to pset je datoteka z imenom copy.c, 32 00:01:52,080 --> 00:01:55,280 in to je tisto, kar bomo našli se bo res koristno za nas 33 00:01:55,280 --> 00:02:00,340 ker bomo na koncu dejansko kopiranje datotek copy.c 34 00:02:00,340 --> 00:02:05,350 in samo nekoliko spremenila, da bi lahko dosegli prva 2 del problema niza. 35 00:02:05,350 --> 00:02:09,030 >> In tako je, kot sem že omenil, imamo opravka z bitne slike kot tudi JPEG. 36 00:02:09,030 --> 00:02:13,170 Torej, res razumevanju strukture, kako so organizirane te datoteke, 37 00:02:13,170 --> 00:02:16,170 kako lahko resnično prevesti 0s in 1s v konstrukti 38 00:02:16,170 --> 00:02:19,040 in stvari, ki jih lahko dejansko razumejo in interpretirajo in uredi, 39 00:02:19,040 --> 00:02:21,000 da bo zelo pomembno, 40 00:02:21,000 --> 00:02:25,970 Tako bo v JPEG in bitne datoteke in razumevanju strukture teh. 41 00:02:25,970 --> 00:02:30,780 >> Pset4, kot ponavadi, prične z delom vprašanj. 42 00:02:30,780 --> 00:02:36,600 Tisti, ki se bo ukvarjal z datoteko I / O in dobili boste navadili na to. 43 00:02:36,600 --> 00:02:42,520 Potem del 1, je Whodunit, v kateri ste dobili datoteko z bitno sliko 44 00:02:42,520 --> 00:02:45,630 , ki izgleda nekako kot rdeče pike povsod. 45 00:02:45,630 --> 00:02:52,180 In potem v bistvu tisto, kar smo naredili, je, da to datoteko in jo uredite tako malo 46 00:02:52,180 --> 00:02:54,010 v različici, ki se lahko prebere. 47 00:02:54,010 --> 00:02:56,000 V bistvu, ko končamo, bomo imeli isto datoteko, 48 00:02:56,000 --> 00:03:02,630 razen bomo lahko videli skrite sporočilo skriva za vsemi temi rdečimi pikami. 49 00:03:02,630 --> 00:03:07,310 Potem Resize je program, ki se glede na datoteko 50 00:03:07,310 --> 00:03:11,490 in nato glede na ime datoteke, da realizacij in nato dati več, kot tudi, 51 00:03:11,490 --> 00:03:16,850 bo dejansko velikost bitne slike, s tem, da je celo vrednost. 52 00:03:16,850 --> 00:03:19,240 Potem končno, imamo izterjati pset. 53 00:03:19,240 --> 00:03:24,160 Mi smo dobili pomnilniško kartico, nato pa morajo izterjati vseh fotografij 54 00:03:24,160 --> 00:03:25,920 , ki so bile pomotoma izbrisane, 55 00:03:25,920 --> 00:03:31,420 vendar, kot bomo učili, dejansko ne izbriše in odstrani iz spisa; 56 00:03:31,420 --> 00:03:38,470 smo kar nekako izgubili, kjer so bili v spisu, vendar se bomo, da si opomore, da je. 57 00:03:38,470 --> 00:03:44,950 >> Čudovito. Torej gre v datoteko I / O Natančneje, gre za celoten seznam funkcij, ki jih boste uporabljali. 58 00:03:44,950 --> 00:03:49,840 Ste že videli malo osnove fopen, fread in fwrite, 59 00:03:49,840 --> 00:03:54,350 ampak gremo pogledati še v kakšno datoteko I / O funkcije, kot so fputc, 60 00:03:54,350 --> 00:03:56,930 v katerem si napisati en znak naenkrat, 61 00:03:56,930 --> 00:04:02,000 da fseek, kjer si nekako premaknete kazalnik datoteke položaja naprej in nazaj, 62 00:04:02,000 --> 00:04:05,770 in še nekaj drugih. Ampak bomo šli v to, nekoliko kasneje pa še v pset. 63 00:04:08,050 --> 00:04:13,100 >> Torej, najprej, samo da bi dobili v datoteki / I, preden gremo v pset, 64 00:04:13,100 --> 00:04:19,860 Če želite odpreti datoteko, na primer, je tisto, kar morate storiti, je dejansko nastavite kazalec na datoteko. 65 00:04:19,860 --> 00:04:22,710 Torej imamo kazalec datoteki *. 66 00:04:22,710 --> 00:04:27,140 V tem primeru, kličem, da v kazalca, kajti to se dogaja, da se moja INFILE. 67 00:04:27,140 --> 00:04:33,340 In tako bom uporabiti funkcijo fopen in potem ime datoteke 68 00:04:33,340 --> 00:04:36,360 in nato Način, v katerem bom lahko ukvarjajo z datoteko. 69 00:04:36,360 --> 00:04:42,080 Torej je "r" v tem primeru za branje, "w" za pisanje, nato pa "" za slepič. 70 00:04:42,080 --> 00:04:44,270 Na primer, če imate opravka z INFILE 71 00:04:44,270 --> 00:04:47,310 in vse, kar želite storiti, je prebral bitov in bajtov shranjene tam, 72 00:04:47,310 --> 00:04:50,420 potem ste verjetno boš želel uporabiti "r" kot svoj način. 73 00:04:50,420 --> 00:04:54,520 Če želite dejansko napisati, nekako narediti novo datoteko, 74 00:04:54,520 --> 00:04:57,220 potem kaj bomo storiti je, da bomo odprli novo datoteko 75 00:04:57,220 --> 00:05:02,410 in uporabo "w" način pisanja. 76 00:05:02,410 --> 00:05:07,540 >> Torej, če ste dejansko branje v datoteke, struktura je, kot sledi. 77 00:05:07,540 --> 00:05:14,930 Najprej so kazalec na struct, ki bo vseboval bajte, da bereš. 78 00:05:14,930 --> 00:05:19,830 Tako, da se bo konec lokacija bajte, da bereš. 79 00:05:19,830 --> 00:05:23,360 Saj potem pa navesti velikosti, kot v bistvu koliko bajtov 80 00:05:23,360 --> 00:05:30,100 vaš program mora brati v spis, velikost bistvu en element je, 81 00:05:30,100 --> 00:05:32,620 in potem boš določite, koliko elementov želite prebrati. 82 00:05:32,620 --> 00:05:34,980 In potem končno, morate vedeti, kje berete iz, 83 00:05:34,980 --> 00:05:37,580 tako da se bo vaš v kazalec. 84 00:05:37,580 --> 00:05:41,780 Jaz obarvani, saj po fread je tudi zelo podoben fwrite, 85 00:05:41,780 --> 00:05:47,050 razen hočeš prepričati, da uporabljate pravi ukaz, 86 00:05:47,050 --> 00:05:51,960 se prepričajte, da ste dejansko pisanje ali branje z desne datoteke. 87 00:05:54,910 --> 00:05:58,610 >> Torej tako kot prej, če imamo na velikost elementa, kot tudi število elementov, 88 00:05:58,610 --> 00:06:00,600 potem lahko igramo tukaj malo. 89 00:06:00,600 --> 00:06:06,810 Recimo imam psa struct, zato pa hočem, da se glasi dva psa naenkrat. 90 00:06:06,810 --> 00:06:12,450 Kaj lahko storim je rekel velikost enega elementa se bo velikost enega psa 91 00:06:12,450 --> 00:06:14,770 in jaz bom prebral dve. 92 00:06:14,770 --> 00:06:18,290 Druga možnost je, kar sem lahko naredil je reči, da sem le, da bo prebral en element 93 00:06:18,290 --> 00:06:21,340 in da je eden od elementov, se bo v velikosti dveh psov. 94 00:06:21,340 --> 00:06:24,320 Torej, to je podobno, kako lahko nekako igral z velikostjo in številom 95 00:06:24,320 --> 00:06:28,250 odvisno od tega, kaj je bolj intuitiven za vas. 96 00:06:28,250 --> 00:06:30,810 >> V redu. Zdaj smo prišli do pisanja spisov. 97 00:06:30,810 --> 00:06:36,880 Če želite napisati spis, prva trditev je dejansko, če bereš iz. 98 00:06:36,880 --> 00:06:42,050 Torej, to je v bistvu podatki, ki jih boste napisali v datoteko 99 00:06:42,050 --> 00:06:44,490 ki je od kazalec na koncu. 100 00:06:44,490 --> 00:06:47,670 Torej, če ste se ukvarjajo z pset, poskrbite, da ne boste dobili zmeden. 101 00:06:47,670 --> 00:06:50,480 Mogoče imajo definicije drug ob drugem. 102 00:06:50,480 --> 00:06:58,090 Lahko potegnite opredelitev v priročniku, ki jih vnesete moškega in nato fwrite, na primer, 103 00:06:58,090 --> 00:06:59,950 v terminalu, ali se lahko vrne na ta diapozitiv 104 00:06:59,950 --> 00:07:03,570 in se prepričajte, da ste z uporabo pravega. 105 00:07:03,570 --> 00:07:08,700 Torej, še enkrat, za fwrite, ko imate datoteko, ki jo želite pisati v, 106 00:07:08,700 --> 00:07:14,290 da bo še zadnji argument in da se bo kazalec na datoteko. 107 00:07:14,290 --> 00:07:18,670 Torej to je, kako smo se ukvarjajo s pisanjem morda več zlogov, v času, 108 00:07:18,670 --> 00:07:21,820 ampak da želite samo napisati v samo enem značaja. 109 00:07:21,820 --> 00:07:25,940 Kot bomo videli kasneje, v tem primeru v bitne slike bomo morali uporabiti, da. 110 00:07:25,940 --> 00:07:32,180 Takrat bomo lahko uporabite fputc, v bistvu samo polaganje en znak naenkrat, chr, 111 00:07:32,180 --> 00:07:37,050 v datoteko kazalec, in to je naša kazalec od tam. 112 00:07:38,700 --> 00:07:41,560 Potem, ko smo iskali ali pisati v datoteko, 113 00:07:41,560 --> 00:07:44,690 datoteka sledenja, kje smo. 114 00:07:44,690 --> 00:07:47,810 Torej je to neke vrste kazalca, datoteka položaj kazalca. 115 00:07:47,810 --> 00:07:54,330 In tako, ko smo pisati ali brati znova v datoteko, 116 00:07:54,330 --> 00:07:56,760 datoteka dejansko spomni, kje je, 117 00:07:56,760 --> 00:07:59,270 in tako se nadaljuje od kjer je kazalec. 118 00:07:59,270 --> 00:08:03,970 To je lahko koristno, če želite, da, recimo, preberite v določenem znesku nekaj storiti 119 00:08:03,970 --> 00:08:06,160 nato pa preberite v naslednji višini, 120 00:08:06,160 --> 00:08:10,700 ampak včasih se želimo iti nazaj ali dejansko začeti iz neke referenčne vrednosti. 121 00:08:10,700 --> 00:08:16,870 Torej je funkcija fseek, kaj počne, je nam omogoča, da premaknete kazalec na določeno datoteko 122 00:08:16,870 --> 00:08:19,680 določeno število bajtov. 123 00:08:19,680 --> 00:08:24,260 In potem, kaj moramo storiti, je določiti, kje je referenčna vrednost. 124 00:08:24,260 --> 00:08:31,520 Torej, ali se premika naprej ali nazaj, od koder je kazalec trenutno je, 125 00:08:31,520 --> 00:08:35,750 ali pa lahko določi, da mora le korak od začetka datoteke 126 00:08:35,750 --> 00:08:37,090 ali od konca datoteke. 127 00:08:37,090 --> 00:08:41,230 In tako se lahko prenese na negativne ali pozitivne vrednosti za znesek, 128 00:08:41,230 --> 00:08:44,960 in da bo nekako premaknite kazalec bodisi naprej ali nazaj. 129 00:08:46,170 --> 00:08:51,920 >> Preden smo prišli v drugi psets, vsa vprašanja o datoteki / I? 130 00:08:53,860 --> 00:08:59,990 Ok. Kot smo dobili v več primerih, vas prosimo, da me ustavi za vprašanja. 131 00:08:59,990 --> 00:09:06,930 >> Torej, v Whodunit, ste predali datoteko z bitno sliko, podobno tej rdečega na diapozitivu 132 00:09:06,930 --> 00:09:14,510 in izgleda, da je to - kup rdeče pike - in res ne vem, kaj je napisano. 133 00:09:14,510 --> 00:09:23,310 Če škiljenje, boste morda lahko videli modro barvo rahlo v notranjosti sredini. 134 00:09:23,310 --> 00:09:26,270 V bistvu, to je, če je shranjena besedilo. 135 00:09:26,270 --> 00:09:30,270 Prišlo je umor, ki se je zgodilo, zato moramo ugotoviti, kdo je to storil. 136 00:09:30,270 --> 00:09:36,760 Da bi to dosegli, moramo nekako pretvoriti sliko v berljivi obliki. 137 00:09:36,760 --> 00:09:42,740 Če vi že kdaj naleteli to, včasih bi bilo malo kompleti 138 00:09:42,740 --> 00:09:48,510 če bi imeli povečevalno steklo z rdečim filmom. Kdorkoli? Ja. 139 00:09:48,510 --> 00:09:52,770 Zato bi vam roko kaj takega, bi si morali s povečevalnim steklom 140 00:09:52,770 --> 00:09:58,130 z rdečim filmom nad njim, bi ga dal čez sliko 141 00:09:58,130 --> 00:10:03,410 in ti bi lahko videli sporočilo skrit v njej. 142 00:10:03,410 --> 00:10:07,080 Mi nimamo povečevalno steklo z rdečo folijo, tako da namesto da bomo nekako ustvarijo sami 143 00:10:07,080 --> 00:10:09,060 V tem pset. 144 00:10:09,060 --> 00:10:15,760 In tako si bo whodunit vhod, potem pojma. Bmp, 145 00:10:15,760 --> 00:10:18,800 tako da je INFILE, da je rdeča pika sporočilo 146 00:10:18,800 --> 00:10:23,550 in potem pravijo verdict.bmp se bo naša izhodna_datoteka. 147 00:10:23,550 --> 00:10:27,900 Torej, da se bo ustvaril novo podobo bitno podobno clue 1 148 00:10:27,900 --> 00:10:32,600 razen v berljivi obliki, kjer lahko vidimo skrito sporočilo. 149 00:10:32,600 --> 00:10:37,550 >> Ker bomo morali ukvarjati z urejanjem in manipuliranja bitne slike za neke vrste, 150 00:10:37,550 --> 00:10:42,400 bomo vrste potop v strukturi teh bitne datoteke. 151 00:10:42,400 --> 00:10:48,130 Šli smo v teh malo v predavanju, pa poglejmo v njih nekaj več. 152 00:10:48,130 --> 00:10:51,740 Bitne slike so v bistvu samo razporeditev bajtov 153 00:10:51,740 --> 00:10:55,790 kjer smo natančno navedli, kateri bajti pomeni kaj. 154 00:10:55,790 --> 00:11:00,540 Torej, tukaj je nekako kot zemljevidu bitno sliko 155 00:11:00,540 --> 00:11:08,550 pravijo, da se začne z nekaterimi glavi datoteke, se začne z nekaj informacij tam. 156 00:11:08,550 --> 00:11:16,540 Vidiš, da okoli bajt številko 14 je velikost navedeno v bitne slike, 157 00:11:16,540 --> 00:11:18,520 in se nadaljuje. 158 00:11:18,520 --> 00:11:23,810 Toda kaj potem smo res zanima, je tu začetkom okoli bajt številko 54. 159 00:11:23,810 --> 00:11:26,060 Imamo teh RGB trojice. 160 00:11:26,060 --> 00:11:30,760 Kaj se dogaja, da storiti, je, vsebuje dejanske slikovnih pik, barvnih vrednosti. 161 00:11:30,760 --> 00:11:35,950 Vse zgoraj, v glavi je nekaj informacij 162 00:11:35,950 --> 00:11:41,240 ustreza velikosti slike, širino slike, in višine. 163 00:11:41,240 --> 00:11:44,930 Ko smo šli v polnilu kasneje, bomo videli, zakaj je velikost slike 164 00:11:44,930 --> 00:11:48,670 lahko drugačen od širine ali višine. 165 00:11:48,670 --> 00:11:54,240 Torej, da predstavljajo ti - ti bitne slike so zaporedja bajtov - 166 00:11:54,240 --> 00:11:59,370 kaj, kar lahko storimo je rekel v redu, bom se spomnite, da je na indeksu 14, 167 00:11:59,370 --> 00:12:03,380 to je, če je velikost, na primer, ampak kaj bomo storili, da bi to lažje 168 00:12:03,380 --> 00:12:06,020 se jo zajame v struct. 169 00:12:06,020 --> 00:12:08,880 In tako imamo dve konstrukti naredili za nas, BITMAPFILEHEADER 170 00:12:08,880 --> 00:12:10,440 in BITMAPINFOHEADER, 171 00:12:10,440 --> 00:12:14,840 in tako, ko smo brali v tem spisu, ki ga privzeto, da se dogaja, da se bo v redu, 172 00:12:14,840 --> 00:12:22,360 in tako, da se je tudi dogaja, da izpolnite v spremenljivkah, kot so biWidth in biSize. 173 00:12:25,270 --> 00:12:31,230 In potem končno, vsak pixel predstavlja s tremi zlogi. 174 00:12:31,230 --> 00:12:35,500 Prvi je znesek modra v piko, drugi je količina zelene barve, 175 00:12:35,500 --> 00:12:41,120 in končno višino rdeče, pri čemer 0 pomeni v bistvu ni modro ali zeleno ali ne ni rdeča 176 00:12:41,120 --> 00:12:43,720 in nato ss je najvišja vrednost. 177 00:12:43,720 --> 00:12:46,800 To so šestnajstiške vrednosti. 178 00:12:46,800 --> 00:12:53,870 Torej, če imamo FF0000, nato pa, da ustreza najvišjim zneskom modra 179 00:12:53,870 --> 00:12:58,890 in potem ni zelena in rdeča ne, tako da potem bi to nam modro piko. 180 00:12:58,890 --> 00:13:04,190 Potem, če imamo vse FF je povsod, potem to pomeni, da imamo belo piko. 181 00:13:04,190 --> 00:13:11,370 To je nekako nasprotni ponavadi, ko smo rekli RGB. To se dejansko dogaja BGR. 182 00:13:12,750 --> 00:13:18,990 >> Torej, če bi dejansko preuči primer bitne slike - Naj 1 potegnite gor. 183 00:13:31,560 --> 00:13:33,830 To je malo majhen. 184 00:13:39,890 --> 00:13:47,840 Jaz sem povečave, pa smo lahko videli, da je pixelated. Izgleda, bloki barve. 185 00:13:47,840 --> 00:13:50,110 Imate bele kocke, potem pa rdeči bloki. 186 00:13:50,110 --> 00:13:53,700 Če boste igrali v Microsoft Paint, na primer, lahko narediš kaj takega 187 00:13:53,700 --> 00:13:58,960 ki jih v bistvu samo slikarstvo nekatere kvadratke v določenem vrstnem redu. 188 00:13:58,960 --> 00:14:08,060 Torej, kaj to pomeni v bitne slike je, kot sledi. 189 00:14:08,060 --> 00:14:15,710 Tukaj imamo bele pike 1., da so vsi 6 so f-ih, nato pa smo imeli rdeče pike, 190 00:14:15,710 --> 00:14:19,910 označuje 0000FF. 191 00:14:19,910 --> 00:14:27,940 In tako zaporedje bajtov, ki jih imamo nakazuje, kako bitna slika bo pogledati. 192 00:14:27,940 --> 00:14:32,230 Torej je to, kar sem tukaj naredil samo izpisati vse te bajte in nato obarvani rdeče 193 00:14:32,230 --> 00:14:37,550 tako da lahko nekako vidim, če škiljenje malo, kako se je to nekako kaže smeška. 194 00:14:40,180 --> 00:14:46,390 >> Tako, da bitne slike delo sem ga zamislili predvsem kot mrežo. 195 00:14:46,390 --> 00:14:54,940 In tako je privzeto, vsaka vrsta mreže mora biti večkratnik 4 bajte. 196 00:15:00,520 --> 00:15:07,060 Če se ozremo na bitno sliko, ki ste ga izpolnite vsako vrednost. 197 00:15:07,060 --> 00:15:17,370 Na primer, boste morda morali rdeči tukaj, tukaj je zeleno, modro tukaj 198 00:15:17,370 --> 00:15:24,950 vendar se morate prepričati, da je slika zapolnimo z večkratnikom 4 bajtov. 199 00:15:24,950 --> 00:15:32,200 Torej, če hočem sliko, ki jo trije bloki svetu, potem bi morali dati prazno vrednost 200 00:15:32,200 --> 00:15:35,640 v zadnjem 1, da bi bilo več od štirih. 201 00:15:35,640 --> 00:15:39,530 Torej, potem bi dodali v nekaj, kar smo kliče oblazinjenje. 202 00:15:39,530 --> 00:15:43,750 Grem kar pomeni, da je z x. 203 00:15:44,920 --> 00:15:54,160 Zdaj pravijo, da si želijo sliko, ki je 7 točk dolgo, na primer. 204 00:15:54,160 --> 00:15:59,550 Imamo 1, 2, 3, 4, 5, 6, 7, 205 00:16:04,750 --> 00:16:07,000 in vsi, ki izpolnijo z barvo. 206 00:16:07,000 --> 00:16:10,620 Tako, da bitne slike delo je, da moramo 8.. 207 00:16:10,620 --> 00:16:12,460 Zdaj imamo 1, 2, 3, 4, 5, 6, 7. 208 00:16:12,460 --> 00:16:19,360 Potrebujemo 8 prostore za bitne slike, da pravilno glasi. 209 00:16:19,360 --> 00:16:25,600 Torej, kaj moramo storiti, je dodajanje v samo malo oblazinjenje 210 00:16:25,600 --> 00:16:29,430 zagotoviti, da so vsi širine enotna 211 00:16:29,430 --> 00:16:34,260 in da so vsi širin so večkratnik 4. 212 00:16:42,110 --> 00:16:47,310 In tako sem že navedel, oblazinjenje kot x ali vijugasto črto, 213 00:16:47,310 --> 00:16:53,880 ampak v dejanskih bitnih slik je polnilo označuje šestnajstiško 0. 214 00:16:53,880 --> 00:16:57,340 Torej bi bilo to sam znak, 0. 215 00:16:58,980 --> 00:17:06,329 Kaj bi lahko prišel prav, je xxd ukaz. 216 00:17:06,329 --> 00:17:11,220 Kaj pa je dejansko vam pokaže, rad podoben temu, kar sem prej s smiley 217 00:17:11,220 --> 00:17:15,630 ko sem dejansko natisnjena, kaj bi vsaka barva za piko 218 00:17:15,630 --> 00:17:21,800 in potem z barvno lestvico, ko zaženete xxd z naslednjimi ukazi, 219 00:17:21,800 --> 00:17:28,670 potem bo dejansko izpisal kaj so barve za tiste slikovnih pik. 220 00:17:28,670 --> 00:17:33,810 Kaj morate storiti, je, tukaj sem navesti, tako kot 54-ih 221 00:17:33,810 --> 00:17:36,530 pravi, da bom začela na 54. bajtu 222 00:17:36,530 --> 00:17:40,820 ker pred tem, ne pozabite, če se ozremo nazaj na zemljevidom rastrske 223 00:17:40,820 --> 00:17:42,690 to je vse informacije v glavi in ​​podobno. 224 00:17:42,690 --> 00:17:46,280 Toda tisto, kar resnično skrbi, je dejanska točk, ki označujejo barvo. 225 00:17:46,280 --> 00:17:52,700 Torej, z dodatkom v tej zastavo, s 54, potem smo lahko videli barvne vrednosti. 226 00:17:52,700 --> 00:17:56,020 In ne skrbite za zapletene zastavami in takih stvari. 227 00:17:56,020 --> 00:18:05,020 V spec problem set, boste imeli navodila, kako uporabljati xxd za prikaz slikovnih pik. 228 00:18:07,070 --> 00:18:15,590 Torej, če vidite tukaj, je nekako izgleda zelenem polju, ta mala stvar. 229 00:18:15,590 --> 00:18:23,610 Sem barvno kodiranje 00ff00 v bistvu rekel, ni modro, veliko zeleno in rdečo ne. 230 00:18:23,610 --> 00:18:26,370 Tako, da ustreza zeleno. 231 00:18:26,370 --> 00:18:31,920 Kot vidite tukaj, smo videli zeleno kvadrat. 232 00:18:31,920 --> 00:18:36,660 Ta zelena pravokotnik je le 3 slikovnih pik, tako da potem, kaj moramo storiti 233 00:18:36,660 --> 00:18:44,350 se prepričajte, da je slika večkratnik 4 široka je dodati v podaljšku oblazinjenja. 234 00:18:44,350 --> 00:18:49,460 In tako je to, kako vidiš te 0s tukaj. 235 00:18:49,460 --> 00:18:54,510 To bo dejansko rezultat vašega Resize pset, 236 00:18:54,510 --> 00:19:01,350 predvsem pri čemer majhno bitno sliko in jo nato z razširitvijo 4. 237 00:19:01,350 --> 00:19:09,380 In kaj vidimo, da je pravzaprav ta slika 12 slikovnih pik, ampak 12 je večkratnik števila 4, 238 00:19:09,380 --> 00:19:12,940 in tako smo dejansko ne vidim nobene 0S na koncu, ker nam ni treba dodati vse 239 00:19:12,940 --> 00:19:19,070 zato, ker je v celoti podložena. To nima nobene več prostora. 240 00:19:20,720 --> 00:19:23,470 >> Ok. Vsa vprašanja v zvezi s polnilom? 241 00:19:25,150 --> 00:19:27,460 Ok. Kul. 242 00:19:27,460 --> 00:19:32,520 >> Kot sem že omenil, so bitne slike so le zaporedje bajtov. 243 00:19:32,520 --> 00:19:39,170 In kaj imamo, namesto da bi morali slediti točno kateri števila bajt 244 00:19:39,170 --> 00:19:47,050 ustreza določenemu elementu, smo dejansko ustvarili struct, ki zastopa to. 245 00:19:47,050 --> 00:19:50,930 Torej, kaj imamo, je RGBTRIPLE struct. 246 00:19:50,930 --> 00:19:54,590 Kadarkoli imate primerek RGB trojico, 247 00:19:54,590 --> 00:20:00,970 ker je to tip opredeliti struct, potem lahko dostopate do rgbtBlue spremenljivko, 248 00:20:00,970 --> 00:20:09,520 Podobno je zelena in rdeča spremenljivke, ki kažejo na to, koliko modra, zelena, rdeča, 249 00:20:09,520 --> 00:20:11,580 oziroma, da si. 250 00:20:11,580 --> 00:20:16,800 >> Torej, če imamo modro nastavljeno na 0, zelena nastavljena na FF, 251 00:20:16,800 --> 00:20:22,060 kar je najvišja vrednost lahko imate, nato pa rdeče nastavljeno na 0, 252 00:20:22,060 --> 00:20:27,870 potem kakšne barve bi to predvsem trojni RGB predstavlja? >> [Študent] Green. 253 00:20:27,870 --> 00:20:29,150 Green. Točno tako. 254 00:20:29,150 --> 00:20:34,480 To se dogaja, da je koristno vedeti, da vsakič, ko se primerek RGB trojico, 255 00:20:34,480 --> 00:20:41,340 lahko dejansko dostop do višine barva - modra, zelena in rdeča - ločeno. 256 00:20:43,350 --> 00:20:54,900 >> Zdaj, ko smo se pogovarjali o strukturi, da pa si oglejte datoteke BMP. 257 00:20:54,900 --> 00:20:57,870 To so konstrukti, ki za vas. 258 00:20:57,870 --> 00:21:01,820 Tukaj imamo BITMAPFILEHEADER struct. 259 00:21:01,820 --> 00:21:07,610 Zanimiva je velikost. 260 00:21:07,610 --> 00:21:12,660 Kasneje smo imeli info glavo, ki ima še nekaj stvari, ki so zanimive za nas, 261 00:21:12,660 --> 00:21:15,480 in sicer velikost, širina in višina. 262 00:21:15,480 --> 00:21:19,170 Ker bomo šli v kasneje, ko ste prebrali, da bi spis, 263 00:21:19,170 --> 00:21:25,500 samodejno prebere, ker smo se določi vrstni red mora biti enako. 264 00:21:25,500 --> 00:21:31,990 Tako bo biSize vsebuje prave bajte, ki ustrezajo dejansko velikost slike. 265 00:21:34,700 --> 00:21:40,500 In potem sem na koncu, kot smo govorili, da imamo RGBTRIPLE typedef struct. 266 00:21:40,500 --> 00:21:46,840 Imamo rgbtBlue, zelena, rdeča, povezane z njo. 267 00:21:48,210 --> 00:21:49,340 >> Čudovito. Ok. 268 00:21:49,340 --> 00:21:56,360 Zdaj, ko razumemo bitne malo, razumemo, da imamo glavo datoteke 269 00:21:56,360 --> 00:22:00,790 in info glava, povezana z njim, nato pa po tem, da imamo zanimive stvari 270 00:22:00,790 --> 00:22:05,110 V barvah, in so te barve zastopa RGBTRIPLE konstrukti, 271 00:22:05,110 --> 00:22:12,710 in tiste, v zameno tri vrednote, povezane z modro, zeleno in rdečo. 272 00:22:12,710 --> 00:22:17,270 >> Torej, zdaj, bomo lahko nekako razmišljam o zopet malo. 273 00:22:17,270 --> 00:22:20,130 Žal mi je. Pomislite Whodunit. 274 00:22:20,130 --> 00:22:25,750 Ko imamo datoteko pojma, kaj potem smo želeli storiti, je brati z njim piko po piko 275 00:22:25,750 --> 00:22:33,860 in potem nekako spremeniti tiste pike, tako da bomo lahko proizvodnja v berljivi obliki. 276 00:22:33,860 --> 00:22:41,020 In tako, da se proizvodnja, gremo pisati pik, ki jih pixel v verdict.bmp datoteke. 277 00:22:41,020 --> 00:22:45,120 To je neke vrste veliko storiti. Zavedamo se, da. 278 00:22:45,120 --> 00:22:49,860 Torej, kaj smo naredili, je, da smo dejansko vam z copy.c. 279 00:22:49,860 --> 00:22:57,610 Kaj copy.c ne le omogoča natančno kopijo določeno datoteko bitnih in jo oddaja. 280 00:22:57,610 --> 00:23:01,900 Torej, to je že odpre datoteko za vas, bere pik, ki jih pixel, 281 00:23:01,900 --> 00:23:04,510 in potem piše v izhodni v datoteko. 282 00:23:04,510 --> 00:23:07,080 >> Oglejmo pogled na to. 283 00:23:13,390 --> 00:23:18,290 To zagotavlja pravilno uporabo, 284 00:23:18,290 --> 00:23:22,640 dobili imena datotek tukaj. 285 00:23:22,640 --> 00:23:29,940 Kaj to je, da določa vhodno datoteko za kar smo opravili v na INFILE tukaj, 286 00:23:29,940 --> 00:23:34,750 ki je naš drugi argument v ukazni vrstici. 287 00:23:34,750 --> 00:23:37,640 Pregledi zagotoviti, da bomo lahko odprete. 288 00:23:38,960 --> 00:23:44,860 Pregledi zagotoviti, da bomo lahko novo izhodna_datoteka tukaj. 289 00:23:45,630 --> 00:23:53,270 Torej, kaj to počne tu, je samo v bistvu začne branja do datoteke bitnih od začetka. 290 00:23:53,270 --> 00:23:56,700 Na začetku je, kot vemo, vsebuje BITMAPFILEHEADER, 291 00:23:56,700 --> 00:24:03,200 in tako bodo ta zaporedja bitov neposredno izpolnite BITMAPFILEHEADER. 292 00:24:03,200 --> 00:24:07,940 Torej, kaj imamo tukaj je povedal, da BITMAPFILEHEADER BF - 293 00:24:07,940 --> 00:24:13,150 To je naša nova spremenljivka BITMAPFILEHEADER tipa - 294 00:24:13,150 --> 00:24:22,560 bomo pa je v bf kar prebere v kazalec, ki je naš INFILE. 295 00:24:22,560 --> 00:24:23,970 Koliko beremo? 296 00:24:23,970 --> 00:24:32,160 Prebrali smo v bajti, koliko moramo, da vsebujejo celo BITMAPFILEHEADER. 297 00:24:32,160 --> 00:24:34,660 Prav, to je tisto, kar počnemo za info glavo. 298 00:24:34,660 --> 00:24:39,010 Torej smo naprej po našem spisu v INFILE, 299 00:24:39,010 --> 00:24:44,360 in smo branju teh bitov in bajtov, in smo jih priključite neposredno v 300 00:24:44,360 --> 00:24:47,880 v teh primerih spremenljivk, ki jih uvajamo. 301 00:24:49,370 --> 00:24:53,800 Tukaj smo samo pazite, da je bitna slika bitna slika. 302 00:24:57,670 --> 00:25:01,030 >> Zdaj imamo izhodna_datoteka, kajne? 303 00:25:01,030 --> 00:25:04,420 Torej, kakršen je, ko smo jo ustvarili, to je v bistvu prazna. 304 00:25:04,420 --> 00:25:07,710 Zato moramo v bistvu ustvariti nov bitmap iz nič. 305 00:25:07,710 --> 00:25:12,280 Kaj moramo storiti, je, da moramo poskrbeti, da bomo kopirali v glave datoteke 306 00:25:12,280 --> 00:25:16,850 in informacije glave tako kot je INFILE. 307 00:25:16,850 --> 00:25:22,850 Kaj moramo storiti, je, da smo napisali - in ne pozabite, da bf je spremenljivka 308 00:25:22,850 --> 00:25:29,300 od BITMAPFILEHEADER tipa, tako da tisto, kar počnemo je, da smo samo uporabo te vsebine 309 00:25:29,300 --> 00:25:34,980 pisati v outfile. 310 00:25:36,550 --> 00:25:38,510 Tu ne pozabite, smo se pogovarjali o polnilu, 311 00:25:38,510 --> 00:25:47,820 kako pomembno je, da se prepričajte, da je znesek točk, ki jih imamo, je večkratnik števila 4. 312 00:25:47,820 --> 00:25:52,790 To je zelo koristno formula za izračun, koliko ste oblazinjenje 313 00:25:52,790 --> 00:25:57,670 glede na širino datoteke. 314 00:25:57,670 --> 00:26:04,120 Želim vama, da se spomnimo, da je v copy.c imamo formulo za izračun odmika. 315 00:26:04,120 --> 00:26:07,970 V redu? Torej, vsi se spomnim. Čudovito. 316 00:26:07,970 --> 00:26:14,050 Torej, kaj potem počne copy.c Naslednji je ponovi čez vse scanlines. 317 00:26:14,050 --> 00:26:23,730 To gre skozi vrstice in šele nato shrani vsako trojico, ki se glasi 318 00:26:23,730 --> 00:26:26,920 in ga nato zapiše v outfile. 319 00:26:26,920 --> 00:26:33,120 Torej tukaj smo berete samo eno triple RGB naenkrat 320 00:26:33,120 --> 00:26:39,860 nato pa damo to isto Triple v outfile. 321 00:26:41,120 --> 00:26:48,340 Prepreden del je, da podloga ni RGB potrojil 322 00:26:48,340 --> 00:26:55,200 in zato ne moremo samo brati, da oblazinjenja znesek trojic RGB. 323 00:26:55,200 --> 00:27:01,460 Kaj moramo storiti, je pravzaprav samo premaknete kazalnik naše datoteke stališča, premaknite kazalec naš, 324 00:27:01,460 --> 00:27:06,840 na vrsto preskočite vse oblazinjenje, tako da smo v naslednji vrstici. 325 00:27:06,840 --> 00:27:12,990 In potem, kaj to počne, je kopija vam pokaže, kako boste morda želeli dodati polnilo. 326 00:27:12,990 --> 00:27:14,990 Zato smo se izračuna, koliko oblazinjenje moramo, 327 00:27:14,990 --> 00:27:18,220 tako da pomeni, da moramo oblazinjenja število 0s. 328 00:27:18,220 --> 00:27:24,510 Kaj to je za zanke, ki postavlja oblazinjenja število 0s v našo outfile. 329 00:27:24,510 --> 00:27:31,170 In potem na koncu, ko zaprete obe datoteki. Zaprete INFILE kot tudi izhodna_datoteka. 330 00:27:31,170 --> 00:27:34,870 >> Torej, to je, kako copy.c dela, 331 00:27:34,870 --> 00:27:37,430 in da se bo zelo koristno. 332 00:27:39,720 --> 00:27:43,750 Namesto, da se dejansko neposredno kopirate in prilepite 333 00:27:43,750 --> 00:27:46,800 ali pa samo gledaš na to in tipkanje na karkoli želite, 334 00:27:46,800 --> 00:27:49,440 boste morda samo želim, da izvedete ta ukaz v terminal, 335 00:27:49,440 --> 00:27:54,520 cp copy.c whodunit.c, ki bo ustvaril novo datoteko, whodunit.c, 336 00:27:54,520 --> 00:27:58,330 , ki vsebuje natančno isto vsebino, kot kopija ne. 337 00:27:58,330 --> 00:28:03,880 Torej, kaj lahko storimo, je, da uporabite, da kot okvir, na podlagi katerega gradnjo in urejanje 338 00:28:03,880 --> 00:28:06,900 za naše whodunit datoteke. 339 00:28:08,500 --> 00:28:14,670 >> To so naši za-dos storiti za Whodunit, ampak kaj počne copy.c 340 00:28:14,670 --> 00:28:16,730 dejansko skrbi za večino izmed njih za nas. 341 00:28:16,730 --> 00:28:21,900 Torej, vse kar morate storiti, je spremeniti naslednje slikovnih pik, kot je potrebno 342 00:28:21,900 --> 00:28:25,920 dejansko bo datoteka berljiva. 343 00:28:25,920 --> 00:28:32,960 Ne pozabite, da za določeno piko trojno, da za določeno spremenljivko RGBTRIPLE tipa, 344 00:28:32,960 --> 00:28:35,990 lahko dostopate do modre, zelene, rdeče in vrednote. 345 00:28:35,990 --> 00:28:38,670 To bo prišel prav, ker če jih lahko dostopate, 346 00:28:38,670 --> 00:28:41,770 to pomeni, da jih lahko tudi preverite, 347 00:28:41,770 --> 00:28:45,430 kar pomeni, da jih lahko tudi spremenite. 348 00:28:45,430 --> 00:28:49,430 >> Torej, ko smo šli nazaj na našo rdečo primer povečevalno steklo, 349 00:28:49,430 --> 00:28:53,390 v bistvu, da je deloval kot nekakšen filter za nas. 350 00:28:53,390 --> 00:28:58,160 Torej, kaj želimo narediti, je, da smo želeli izločiti vse trojic, ki prihajajo noter 351 00:28:58,160 --> 00:29:01,240 Obstaja več različnih načinov, da to storijo. 352 00:29:01,240 --> 00:29:07,100 V bistvu, lahko imate kakršno koli filtra želite. 353 00:29:07,100 --> 00:29:09,890 Morda boste želeli spremeniti vse rdeče pike 354 00:29:09,890 --> 00:29:13,570 ali morda želite spremeniti drugačno barvo piko na drugo barvo. 355 00:29:13,570 --> 00:29:15,400 To je odvisno od vas. 356 00:29:15,400 --> 00:29:19,580 Ne pozabite, da lahko preverite, kakšne barve je pixel 357 00:29:19,580 --> 00:29:23,000 in potem jih lahko tudi spremeni, ko greste skozi. 358 00:29:24,410 --> 00:29:26,420 >> Ok. Tako da je Whodunit. 359 00:29:26,420 --> 00:29:32,760 Ko zaženete Whodunit, boste vedeli, kdo je krivec kaznivega dejanja je bilo. 360 00:29:32,760 --> 00:29:35,540 >> Zdaj bomo šli Resize. 361 00:29:35,540 --> 00:29:37,990 Mi bomo še vedno ukvarjajo z bitne slike. 362 00:29:37,990 --> 00:29:40,750 Kaj bomo naredili, je da bomo imeli vhodno bitno sliko 363 00:29:40,750 --> 00:29:45,890 in potem se bomo mimo v številnih in nato dobili izhodna_datoteka bitno sliko 364 00:29:45,890 --> 00:29:51,380 če to je v bistvu naša INFILE normira s n. 365 00:29:54,670 --> 00:30:01,450 Povejte mi datoteka je bila le ena pika velika. 366 00:30:01,450 --> 00:30:09,100 Potem, če je moja n je 3, luščenje s 3, potem bi ponovil, da je piko n število krat, 367 00:30:09,100 --> 00:30:14,410 tako da 3-krat, nato pa ga tudi 3-krat lestvici navzdol, kot dobro. 368 00:30:14,410 --> 00:30:17,840 Torej vidite, da sem ga normiranje vertikalno kot tudi horizontalno. 369 00:30:17,840 --> 00:30:19,680 >> In potem tukaj je primer. 370 00:30:19,680 --> 00:30:27,590 Če imate n = 2, boste videli, da je prva modra pika ponovi 2 krat 371 00:30:27,590 --> 00:30:30,930 horizontalno kot tudi vertikalno dvakrat. 372 00:30:30,930 --> 00:30:38,040 In potem se še nadaljuje, zato imate neposredno krčenje izvirnega slike z dva. 373 00:30:40,920 --> 00:30:47,600 >> Torej, če bi podrobno določa psevdokod za to, da želimo odpreti. 374 00:30:47,600 --> 00:30:49,880 In potem vemo, da če gremo nazaj, 375 00:30:49,880 --> 00:30:54,540 vidimo, da je širina za outfile se bo drugačen od širine za INFILE. 376 00:30:54,540 --> 00:30:56,130 Kaj to pomeni? 377 00:30:56,130 --> 00:31:01,230 To pomeni, da naše informacije v glavi se bo spremenilo. 378 00:31:01,230 --> 00:31:03,790 In kaj bomo želeli storiti, je posodobiti glavo informacij, 379 00:31:03,790 --> 00:31:11,820 vedoč, da ko beremo v spise, če ste delujejo na copy.c okvira, 380 00:31:11,820 --> 00:31:17,570 že imamo spremenljivko, ki kaže, kaj je velikost in take stvari. 381 00:31:17,570 --> 00:31:24,060 Torej, ko ste, da je tisto, kar boste morda želeli storiti, je spremeniti te posebne spremenljivke. 382 00:31:24,060 --> 00:31:29,380 Ne pozabite, če imate struct, kako dostopati do spremenljivke v to. 383 00:31:29,380 --> 00:31:32,080 Uporabite dot operaterja, kajne? 384 00:31:32,080 --> 00:31:36,420 Torej uporabi, da veste, da boste morali spremeniti header info. 385 00:31:36,480 --> 00:31:41,030 Torej, tukaj je samo seznam dejanskih elementov, ki se bodo spreminjali v datoteki. 386 00:31:41,030 --> 00:31:45,180 Velikost datoteke se bo spreminja podobo, kot tudi širino in višino. 387 00:31:45,180 --> 00:31:50,080 Torej grem nazaj na zemljevid na rastrske 388 00:31:50,080 --> 00:31:57,730 pogled na to, ali je glava datoteke ali informacije glava, ki vsebuje te informacije 389 00:31:57,730 --> 00:32:00,920 in nato spremenite, kot je potrebno. 390 00:32:05,010 --> 00:32:12,470 Še enkrat, recimo cp copy.c resize.c. 391 00:32:12,470 --> 00:32:19,270 To pomeni, da resize.c zdaj vsebuje vse, kar se nahaja znotraj izvod 392 00:32:19,270 --> 00:32:24,490 ker je kopija omogoča nam način branja za vsak piksel scanline s piko. 393 00:32:24,490 --> 00:32:29,860 Razen zdaj, in ne le spreminjanje vrednot, kot smo to storili v Whodunit, 394 00:32:29,860 --> 00:32:37,980 kaj želimo storiti, je, da smo želeli napisati v več pik 395 00:32:37,980 --> 00:32:43,580 tako dolgo, kot je naša n večji od 1. 396 00:32:43,580 --> 00:32:47,110 >> Potem, kaj želimo narediti, je, da želimo, da se raztezajo vodoravno z n, 397 00:32:47,110 --> 00:32:50,490 kot se raztezajo navpično n. 398 00:32:50,490 --> 00:32:52,710 Kako lahko to storimo? 399 00:32:52,710 --> 00:32:56,890 Recimo, da imate n 2 in imate to določeno INFILE. 400 00:32:56,890 --> 00:32:58,730 Vaš kazalec se bo začelo v prvem, 401 00:32:58,730 --> 00:33:03,530 in kaj želite storiti, če je n 2, ki jih želite natisniti v tistih 2. 402 00:33:03,530 --> 00:33:05,490 Torej tiskate v tistih 2. 403 00:33:05,490 --> 00:33:10,830 Nato kazalec se bo premaknil na naslednjo piko, ki je rdeče 1, 404 00:33:10,830 --> 00:33:18,400 in da se bo izpisal 2 teh rdečih in ga dodajo na tisto, kar je bilo storjeno. 405 00:33:18,400 --> 00:33:26,280 Potem se bo kazalec premaknete na naslednjo piko in risanje v tistih 2. 406 00:33:26,280 --> 00:33:37,180 Če pogledate nazaj na copy.c okvira, kaj počne tukaj 407 00:33:37,180 --> 00:33:42,830 se ustvari nov primerek RGB trojico, novo spremenljivko imenovano trojno. 408 00:33:42,830 --> 00:33:50,500 In tukaj, ko se bere v to, da se glasi od INFILE 1 RGBTRIPLE 409 00:33:50,500 --> 00:33:53,470 in ga shrani v notranjosti te trojne spremenljivke. 410 00:33:53,470 --> 00:33:57,590 Torej ste dejansko imajo spremenljivke, ki predstavlja to posebno piko. 411 00:33:57,590 --> 00:34:05,290 Potem, ko pišete, kaj bi si želeli storiti, je Obložite fwrite izjavo v zanki za 412 00:34:05,290 --> 00:34:11,080 , ki ga je napisal v svoj outfile tolikokrat, kot je potrebno. 413 00:34:17,449 --> 00:34:20,100 To je enostavno dovolj. 414 00:34:20,200 --> 00:34:27,590 Samo v bistvu ponovite postopek pisanja n število krat, da jo lestvici vodoravno. 415 00:34:27,590 --> 00:34:32,969 >> Ampak potem se moramo zavedati, da naša oblazinjenje se bo spremenilo. 416 00:34:47,350 --> 00:34:53,020 Prej, da smo imeli nekaj dolžine 3. 417 00:34:53,020 --> 00:35:00,130 Potem bi samo dodati v koliko polnilo? Samo še eno, da bo večkratnik 4. 418 00:35:00,130 --> 00:35:10,480 Ampak pravijo, da smo normiranje to posebno sliko, ki jih je n = 2. 419 00:35:10,480 --> 00:35:16,300 Torej, koliko modrih pik bi imeli na koncu? Radi bi imeli 6. 420 00:35:16,300 --> 00:35:21,470 1, 2, 3, 4, 5, 6. V redu. 421 00:35:21,470 --> 00:35:26,580 6 ni večkratnik 4. Kaj je najbližji večkratnik 4? To se dogaja, da je 8. 422 00:35:26,580 --> 00:35:33,200 Torej smo dejansko dogaja, da imajo 2 znakov oblazinjenje tam. 423 00:35:33,200 --> 00:35:38,720 >> Ali kdo spomnite, če imamo formulo za izračun odmika 424 00:35:38,720 --> 00:35:41,350 in če bi to lahko bilo? 425 00:35:41,350 --> 00:35:45,160 [Neslišno študentski odziv] >> Ja, copy.c. Prav. 426 00:35:45,160 --> 00:35:49,800 Obstaja formula v copy.c za izračun, koliko ste oblazinjenje 427 00:35:49,800 --> 00:35:53,810 s posebno širino bitmap slike. 428 00:35:53,810 --> 00:36:02,950 Torej, da se dogaja, da je uporabno, če želite dodati v določenem znesku oblazinjenja 429 00:36:02,950 --> 00:36:06,160 dejansko ugotoviti, koliko oblazinjenje boste morali dodati. 430 00:36:10,820 --> 00:36:15,850 Ampak ena opomba, čeprav je, da želite, da se prepričajte, da ste z uporabo prave velikosti. 431 00:36:15,850 --> 00:36:21,410 Samo biti previdni, ker ste v bistvu dogaja, da se ukvarjajo z dvema bitne slike. 432 00:36:21,410 --> 00:36:23,410 Hočeš, da poskrbite, da boste uporabljali pravega. 433 00:36:23,410 --> 00:36:26,820 Ko ste izračun odmika za outfile, ki jo želite uporabiti širino outfile 434 00:36:26,820 --> 00:36:29,860 in ne širina prejšnjega. 435 00:36:29,860 --> 00:36:37,240 >> Čudovito. Takšen skrbi za raztezanje celo bitno sliko vodoravno. 436 00:36:37,240 --> 00:36:41,290 Ampak, kaj hočemo storiti, je dejansko razteza navpično, kot dobro. 437 00:36:41,290 --> 00:36:48,760 To bo malo težje, ker ko smo končali kopiranje vrstico 438 00:36:48,760 --> 00:36:51,580 in pisanje to vrstico, naša kazalec se bo ob koncu leta. 439 00:36:51,580 --> 00:36:56,210 Torej, če bomo želeli ponovno prebrati, potem pa se je le, da bo prebral, da bi v naslednji vrstici. 440 00:36:56,210 --> 00:37:03,660 Torej, kaj želimo narediti, je nekako najti način razmnoževanja te vrstice še enkrat 441 00:37:03,660 --> 00:37:12,500 ali pa samo nekako ob to vrstico in ga reportaža znova. 442 00:37:14,380 --> 00:37:17,940 Kot sem nekako namiguje, da obstaja več različnih načinov, da to storijo. 443 00:37:17,940 --> 00:37:23,040 Kaj lahko narediš, je, kot da greš skozi in skozi branje zlasti scanline 444 00:37:23,040 --> 00:37:28,560 in ga spreminja, kar je potrebno, potem nekako trgovine vseh teh pik v matriki. 445 00:37:28,560 --> 00:37:36,350 Potem kasneje, veste, da boste morali natisniti, da je niz spet 446 00:37:36,350 --> 00:37:39,830 in tako lahko le uporabite ta niz za to. 447 00:37:39,830 --> 00:37:44,500 Drug način za to je, da bi prepišite eno vrstico, 448 00:37:44,500 --> 00:37:47,950 Razumem, da morate kopirati še enkrat, tako da dejansko premakniti kazalec, 449 00:37:47,950 --> 00:37:50,950 in to se dogaja, da se z metodo fseek. 450 00:37:50,950 --> 00:37:56,410 Lahko premaknete kazalec vso pot nazaj in ponovite postopek kopiranja znova. 451 00:37:56,410 --> 00:38:03,960 >> Torej, če je naš luščenje število n, potem kolikokrat bomo morali vrniti 452 00:38:03,960 --> 00:38:10,500 in znova črto? >> [Študent] n - 1. >> Ja, odlično. n - 1. 453 00:38:10,500 --> 00:38:14,390 Mi smo to storili že enkrat, tako da potem bomo želeli ponoviti postopek gredo nazaj 454 00:38:14,390 --> 00:38:17,460 n - 1 količina časa. 455 00:38:22,730 --> 00:38:25,860 Ok. Torej imate spreminjanje velikosti funkcijo. 456 00:38:25,860 --> 00:38:34,360 >> Zdaj bomo lahko prišli do res zabavni del, moj najljubši pset, kar je zopet. 457 00:38:34,360 --> 00:38:39,580 Namesto bitne slike, tokrat imamo opravka z JPEG. 458 00:38:39,580 --> 00:38:43,370 Mi smo dejansko niso dobili datoteko samo za JPEG, 459 00:38:43,370 --> 00:38:46,600 saj smo v bistvu surovo obliko pomnilniško kartico. 460 00:38:46,600 --> 00:38:51,790 In tako ta vsebuje nekaj vrednosti informacijskih in smeti na začetku, 461 00:38:51,790 --> 00:38:57,240 in potem se začne in ima kup datotek JPEG. 462 00:38:57,240 --> 00:39:03,430 Vendar pa smo predali kartico, kjer smo izbrisali fotografije; 463 00:39:03,430 --> 00:39:08,300 v bistvu smo pozabili, kjer so fotografije, ki je v njej. 464 00:39:08,300 --> 00:39:12,770 Torej naša naloga v Zopet je iti skozi to obliko kartice 465 00:39:12,770 --> 00:39:16,500 in našli tiste slike znova. 466 00:39:16,500 --> 00:39:23,990 >> Na srečo se je struktura datoteke JPEG in kartice spis je malo koristno. 467 00:39:23,990 --> 00:39:28,850 To bi vsekakor bilo malo težje, če ne bi bilo v tem formatu. 468 00:39:28,850 --> 00:39:40,160 Vsaka datoteka JPEG dejansko začne z dvema možnima sekvenc, ki so našteti zgoraj. 469 00:39:40,160 --> 00:39:42,970 V bistvu, ko imate novo datoteko JPEG, 470 00:39:42,970 --> 00:39:52,720 začne bodisi z zaporedjem ffd8 ffe0 ali druga, ffd8 ffe1. 471 00:39:52,720 --> 00:39:59,530 Še ena koristna stvar je vedeti, da so JPEG shranjene contiguously. 472 00:39:59,530 --> 00:40:03,380 Torej, ko se konča 1 JPEG, druga pa se začne. 473 00:40:03,380 --> 00:40:07,070 Torej ne obstaja nobena vrsta vmes vrednosti tam. 474 00:40:07,070 --> 00:40:15,510 Ko zadeti začetek JPEG, če ste že bral JPEG, 475 00:40:15,510 --> 00:40:21,800 veste, da ste zadeli konec prejšnjega in začetek naslednjega. 476 00:40:21,800 --> 00:40:25,890 >> Za vrste predstavljate tako, sem shematično. 477 00:40:25,890 --> 00:40:36,910 Druga stvar je, JPEG, da jih lahko preberete v zaporedja 512 bajtov hkrati, 478 00:40:36,910 --> 00:40:39,380 podobno z začetkom njene veljavnosti. 479 00:40:39,380 --> 00:40:43,370 Mi ni treba, da preveri vsak zlog, ker bi bilo to slabo. 480 00:40:43,370 --> 00:40:48,200 Torej, namesto, kaj lahko storimo, je pravzaprav zgolj brati v 512 bajtov hkrati 481 00:40:48,200 --> 00:40:54,700 in potem, namesto da preverjam med tistimi, ki v tistih drobcenih rezine 482 00:40:54,700 --> 00:40:58,640 lahko samo preverite na začetku 512 bajtov. 483 00:40:58,640 --> 00:41:02,570 V bistvu, na tej sliki, kar vidite, je v začetku kartice 484 00:41:02,570 --> 00:41:08,700 imate vrednote, ki jih v resnici pomembne dejanske JPEGs sami. 485 00:41:08,700 --> 00:41:15,830 Ampak potem kaj imam, je zvezda, ki označuje eno od dveh začetnih zaporedja za JPEG. 486 00:41:15,830 --> 00:41:19,910 Torej, ko vidiš zvezdo, veste, da imate datoteko JPEG. 487 00:41:19,910 --> 00:41:25,030 In potem vse datoteke JPEG se bo nekaj več od 512 bajtov 488 00:41:25,030 --> 00:41:27,880 vendar pa ni nujno enak mnogokratnik. 489 00:41:27,880 --> 00:41:32,050 Tako, da veste, da ste zadeli še JPEG je, če ste zadeli še eno zvezdo 490 00:41:32,050 --> 00:41:39,090 en začetni zaporedje bajtov. 491 00:41:39,090 --> 00:41:43,330 Potem, kaj imate tukaj, je, da imate rdeče JPEG datoteko trajno, dokler ne dosežete zvezda, 492 00:41:43,330 --> 00:41:45,150 , ki je označen z novo barvo. 493 00:41:45,150 --> 00:41:48,510 Še naprej in potem ste zadeli še eno zvezdo, ste zadeli še JPEG, 494 00:41:48,510 --> 00:41:50,590 boste nadaljevali vse do konca. 495 00:41:50,590 --> 00:41:53,180 Ste na zadnjem slike tukaj, roza 1. 496 00:41:53,180 --> 00:41:58,220 Ti pojdi do konca, dokler ne dosežete konec značaja datoteke. 497 00:41:58,220 --> 00:42:00,820 To bo res koristno. 498 00:42:00,820 --> 00:42:03,170 >> Nekaj ​​glavnih takeaways tukaj: 499 00:42:03,170 --> 00:42:06,670 Kartica datoteka ne začne z JPEG, 500 00:42:06,670 --> 00:42:13,350 ko pa se začne JPEG, so vsi shranjeni JPEGs vzporedno drug drugemu. 501 00:42:17,520 --> 00:42:20,420 >> Nekateri psevdokod za obnovitev. 502 00:42:20,420 --> 00:42:22,570 Najprej bomo odprli našo kartico datoteko 503 00:42:22,570 --> 00:42:27,500 in to se dogaja, da se z našo sliko I / O funkcije. 504 00:42:27,500 --> 00:42:32,430 Bomo ponovili naslednji postopek, dokler ne bomo prišli do konca datoteke. 505 00:42:32,430 --> 00:42:36,450 Bomo prebrati 512 bajtov hkrati. 506 00:42:36,450 --> 00:42:39,180 In tisto, kar sem rekel, tukaj je bomo, da jo shranite v pomnilnik, 507 00:42:39,180 --> 00:42:46,230 tako da v bistvu imajo na teh 512 bajtov, dokler ne bomo vedeli, kaj storiti z njimi. 508 00:42:46,230 --> 00:42:50,300 Torej, kaj želimo narediti, je, da smo želeli preveriti, ali smo zadeli zvezdo ali ne. 509 00:42:50,300 --> 00:42:57,960 Če smo zadeli zvezdo, če smo zadeti enega od vhodnih zaporedij, 510 00:42:57,960 --> 00:42:59,980 potem vemo, da smo zadeli novo JPEG datoteko. 511 00:42:59,980 --> 00:43:08,860 Kaj bomo želeli storiti, je bomo želeli ustvariti novo datoteko v naši pset4 imenik 512 00:43:08,860 --> 00:43:14,480 da želite nadaljevati s to datoteko. 513 00:43:14,480 --> 00:43:18,220 Ampak tudi, če smo že naredili JPEG prej, 514 00:43:18,220 --> 00:43:25,620 Nato smo želeli končati to datoteko in jo potisnite v pset4 mapo 515 00:43:25,620 --> 00:43:29,780 Tam bomo imeli, da je shranjena kajti če ne podate, da smo to končalo JPEG datoteko 516 00:43:29,780 --> 00:43:37,290 potem bomo imeli v bistvu neomejeno količino. V JPEG ne bo nikoli konec. 517 00:43:37,290 --> 00:43:40,840 Zato želimo, da se prepričajte, da ko bereš se v datoteko JPEG in pisno izjavi, 518 00:43:40,840 --> 00:43:46,590 želimo posebej blizu, da z namenom, da se odpre naslednjo. 519 00:43:46,590 --> 00:43:48,430 Bomo želeli preveriti nekaj stvari. 520 00:43:48,430 --> 00:43:52,880 Želimo, da bi preverili, ali smo na začetku novega JPEG naš pufrom 521 00:43:52,880 --> 00:43:56,780 in tudi, če smo že našli pred JPEG 522 00:43:56,780 --> 00:44:03,930 ker to se bo spremenilo vaš proces malo. 523 00:44:03,930 --> 00:44:07,880 Torej, potem, ko si šel skozi vse poti in se odpravite na konec datoteke 524 00:44:07,880 --> 00:44:11,570 kaj potem boste želeli storiti, je, da boste želeli, da zaprete vse datoteke, ki so trenutno odprta. 525 00:44:11,570 --> 00:44:14,100 To bo verjetno zadnja datoteka JPEG imate, 526 00:44:14,100 --> 00:44:18,930 kot tudi kartice datoteko, ki ste se ukvarjajo s. 527 00:44:21,940 --> 00:44:28,670 >> Zadnja ovira, da moramo obravnavati, je, kako dejansko lahko datoteko JPEG 528 00:44:28,670 --> 00:44:31,950 in kako pravzaprav ga potisnite v mapo. 529 00:44:33,650 --> 00:44:39,850 The pset zahteva, da vsak JPEG, ki jih najdete v naslednji obliki, 530 00:44:39,850 --> 00:44:43,990 če imate številko. jpg. 531 00:44:43,990 --> 00:44:50,750 Število, tudi če je 0, pravimo 000.jpg. 532 00:44:50,750 --> 00:44:55,730 Kadarkoli boste našli JPEG v vaš program, 533 00:44:55,730 --> 00:44:58,040 boste želeli, da ga imenujejo v vrstnem redu, ki je bil to. 534 00:44:58,040 --> 00:44:59,700 Kaj to pomeni? 535 00:44:59,700 --> 00:45:03,530 Moramo vrste spremljali, koliko smo ugotovili, 536 00:45:03,530 --> 00:45:08,680 in kaj je treba številko vsake JPEG biti. 537 00:45:08,680 --> 00:45:13,800 Tu bomo izkoristiti sprintf funkcije. 538 00:45:13,800 --> 00:45:17,480 Podobno kot printf, ki nekako odtisov vrednost ven v terminal, 539 00:45:17,480 --> 00:45:23,910 sprintf natisne datoteko ven v mapo. 540 00:45:23,910 --> 00:45:30,870 In kaj bi to storil, če bi imel sprintf, naslov, nato pa niz tam, 541 00:45:30,870 --> 00:45:36,660 bi izpisal 2.jpg. 542 00:45:36,660 --> 00:45:41,020 Ob predpostavki, da sem zaprl datoteke pravilno, 543 00:45:41,020 --> 00:45:47,210 , ki bi vsebovala datoteko, ki mi je bilo pisanje ven. 544 00:45:47,210 --> 00:45:50,320 Ampak ena stvar je, da je koda, da imam tukaj 545 00:45:50,320 --> 00:45:53,360 ne povsem zadovoljiti, kaj pset zahteva. 546 00:45:53,360 --> 00:46:02,410 The pset zahteva, da je treba drugi JPEG datoteko z imenom 002 namesto samo 2. 547 00:46:02,410 --> 00:46:09,160 Torej, ko natisnete ime, potem bi morda želite spremeniti ogrado malo. 548 00:46:09,160 --> 00:46:18,140 >> Ali kdo spomnite, kako smo lahko za dodatne prostore, ko natisnete nekaj? 549 00:46:18,140 --> 00:46:22,530 Ja. >> [Študent] Ti dal 3-odstotnim med znakom in 2. >> Ja, odlično. 550 00:46:22,530 --> 00:46:25,610 Boste dal 3 v tem primeru, ker želimo, prostor za 3. 551 00:46:25,610 --> 00:46:32,590 % 3d bi verjetno dal 002.jpg namesto 2. 552 00:46:32,590 --> 00:46:40,120 Prvi argument v funkciji sprintf je dejansko char array, 553 00:46:40,120 --> 00:46:42,520 ki smo jih prej poznali kot strune. 554 00:46:42,520 --> 00:46:50,700 Tisti, volja, nekako bolj kot začasnega skladiščenja, samo shranite dobljeni niz. 555 00:46:50,700 --> 00:46:54,950 Ne boste res morali ukvarjati s tem, ampak jo morate vključiti. 556 00:46:54,950 --> 00:47:00,710 >> Vemo, da ima vsaka datoteka ime ima številko, ki traja največ tri znake, 557 00:47:00,710 --> 00:47:06,770 in potem. jpg, kako dolgo naj bi to polje lahko bilo? 558 00:47:09,070 --> 00:47:14,310 Vrzi ven številko. Koliko znakov v naslovu, v imenu? 559 00:47:18,090 --> 00:47:26,320 Torej je 3 hashtags, obdobje, jpg. >> [Študent] 7. >> 7. Ne čisto. 560 00:47:26,320 --> 00:47:32,000 Bomo želeli 8, ker želimo, da se omogoči null terminator, kot dobro. 561 00:47:45,340 --> 00:47:49,730 >> Končno, samo da bi potegnili proces, ki boste opravljali za obnovitev, 562 00:47:49,730 --> 00:47:55,420 imate kakšno začetno informacije. 563 00:47:55,420 --> 00:48:02,460 Še naprej, dokler ne najdete začetek datoteke JPEG, 564 00:48:02,460 --> 00:48:07,900 in da se lahko bodisi eno od dveh vhodnih sekvenc. 565 00:48:07,900 --> 00:48:12,510 Si še vedno preberejo. Vsak poševnica tukaj predstavlja 512 bajtov. 566 00:48:12,510 --> 00:48:22,630 Če boš na obravnavi, še vedno preberejo, dokler ne boste naleteli drugega startnega vrstnega reda. 567 00:48:22,630 --> 00:48:29,790 Ko ste, da končate trenutni JPEG - v tem primeru je to rdeča 1, 568 00:48:29,790 --> 00:48:31,030 tako da boste želeli, da končate. 569 00:48:31,030 --> 00:48:35,540 Hočeš, da sprintf ime, ki v vašo pset4 mapo, 570 00:48:35,540 --> 00:48:41,580 potem pa želite odpreti novo JPEG, nato pa vedno preberejo 571 00:48:41,580 --> 00:48:46,370 dokler ne naletite na naslednjo. 572 00:48:46,370 --> 00:48:49,040 Hranite na obravnavi, hraniti na obravnavi, 573 00:48:49,040 --> 00:48:56,290 in končno, na koncu, boš dosegel konec datoteke 574 00:48:56,290 --> 00:49:00,360 in tako boste želeli, da zaprete zadnji JPEG, ki ste delali z njimi 575 00:49:00,360 --> 00:49:08,380 sprintf, da v svoj pset4 mapo, nato pa poiščite na vse slike, ki ste jih dobila. 576 00:49:08,380 --> 00:49:12,050 Te slike so pravzaprav slike CS50 osebja, 577 00:49:12,050 --> 00:49:16,430 in tako je to, če bonus zabaven del pset prihaja v 578 00:49:16,430 --> 00:49:26,310 je, da tekmujejo v vaših delih, da bi našli TFS v slikah 579 00:49:26,310 --> 00:49:34,610 in slikal z njimi, da dokaže, da ste storili pset 580 00:49:34,610 --> 00:49:37,030 in tako lahko vidite, katere uslužbenci so v slikah. 581 00:49:37,030 --> 00:49:41,510 Torej si lahko slike z osebjem. Včasih boste morali, da jih lovil. 582 00:49:41,510 --> 00:49:44,680 Verjetno bodo nekateri izmed njih poskušajo pobegniti od vas. 583 00:49:44,680 --> 00:49:47,320 Si slikal z njimi. 584 00:49:47,320 --> 00:49:51,190 To je v teku. To ni potrebno, kadar pset je posledica. 585 00:49:51,190 --> 00:49:53,340 Rok se bo objavljen v spec. 586 00:49:53,340 --> 00:49:58,060 Nato skupaj s svojim oddelkom, pri čemer oddelek ima največ slike 587 00:49:58,060 --> 00:50:04,430 z večino članov osebja bo dobil precej super nagrado. 588 00:50:04,430 --> 00:50:08,890 To je neke vrste spodbuda, da se vaš pset4 končal čim prej 589 00:50:08,890 --> 00:50:10,820 ker potem lahko preidemo na posel 590 00:50:10,820 --> 00:50:14,570 lov določitvi vseh različnih CS50 članov osebja. 591 00:50:14,570 --> 00:50:17,500 To ni obvezno, čeprav, tako da, ko boste dobili fotografije, 592 00:50:17,500 --> 00:50:20,310 potem ste končali s pset4. 593 00:50:20,310 --> 00:50:23,970 >> In sem končal s potopis 4, tako da hvala vsem za obisk. 594 00:50:23,970 --> 00:50:29,330 Vso srečo pri forenzike. [Aplavz] 595 00:50:29,330 --> 00:50:31,000 [CS50.TV]