1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [Semana 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Harvard University] 3 00:00:04,760 --> 00:00:11,990 [Esta es CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Mujer] Está mintiendo, sobre qué, no lo sé. 5 00:00:17,780 --> 00:00:20,300 [El hombre] Entonces, ¿qué sabemos? 6 00:00:20,300 --> 00:00:24,120 [La mujer] Eso a las 9:15, Ray Santoya estaba en el cajero automático. 7 00:00:24,120 --> 00:00:27,420 [El hombre] Así que la pregunta es, ¿qué estaba haciendo a las 9:16? 8 00:00:27,420 --> 00:00:29,980 [Mujer] El rodaje de la 9 mm en algo. 9 00:00:29,980 --> 00:00:31,900 Tal vez vio al francotirador. 10 00:00:31,900 --> 00:00:34,000 [El hombre] O que estaba trabajando con él. 11 00:00:34,000 --> 00:00:36,330 [Hombre] Espera. Vuelve uno. 12 00:00:36,330 --> 00:00:38,330 [Hombre] ¿Qué es lo que ves? 13 00:00:38,330 --> 00:00:44,520 [♫ ♫ música Suspenso] 14 00:00:44,520 --> 00:00:48,320 [Mujer] Traiga su boca arriba. Pantalla completa. 15 00:00:48,320 --> 00:00:51,230 [Hombre] su gafas. >> Hay una reflexión. 16 00:00:51,230 --> 00:01:00,810 [♫ ♫ música Suspenso] 17 00:01:00,810 --> 00:01:03,580 [El hombre] Eso es el equipo de béisbol de Nuevita. Esa es su logotipo. 18 00:01:03,580 --> 00:01:07,790 [Mujer] Y él está hablando con quien lleva esa chaqueta. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Por lo tanto, este es CS50 de 5 semanas, y hoy nos arruinan un poco de la televisión y de la película para usted. 20 00:01:13,730 --> 00:01:16,170 Así que cuando estás viendo un espectáculo como este de aquí, 21 00:01:16,170 --> 00:01:19,910 y los policías dicen "¿Puedes limpiar eso?" o "mejorar" 22 00:01:19,910 --> 00:01:21,900 no hay mejorar en el mundo real. 23 00:01:21,900 --> 00:01:25,220 De hecho, lo que realmente consigue es un poco de algo como esto. 24 00:01:25,220 --> 00:01:27,570 He levantado una de las fotos del personal de la página. 25 00:01:27,570 --> 00:01:30,980 Este es un programa llamado Photoshop. Esto es 1 de 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 de 3 Bowdens realidad, hoy en día, porque tenemos la Sra. Bowden aquí también, con Rob y Pablo. 27 00:01:36,300 --> 00:01:41,950 Pero aquí es Rob en la pantalla, y si nos centramos en ese brillo que siempre ha tenido en sus ojos, 28 00:01:41,950 --> 00:01:47,600 lo que en realidad vemos es que lo que ves es lo que obtienes. 29 00:01:47,600 --> 00:01:51,690 Esto es "mejorado", por lo que "CSI" tiene un poco mal. 30 00:01:51,690 --> 00:01:55,190 Hay un clip, si podemos recoger en "CSI" sólo un poco más. 31 00:01:55,190 --> 00:01:58,500 Esta es una frase bonita para pronunciar en adelante si desea 32 00:01:58,500 --> 00:02:10,280 sonar técnico con tus amigos cuando, en realidad, está diciendo absolutamente nada. 33 00:02:10,280 --> 00:02:12,970 >> [El hombre] Durante semanas he estado investigando los asesinatos asesinas Cabby 34 00:02:12,970 --> 00:02:15,360 con un cierto morbo. 35 00:02:15,360 --> 00:02:17,160 [Mujer # 1] Esto es en tiempo real. 36 00:02:17,160 --> 00:02:22,930 [Mujer # 2] Voy a crear una interfaz GUI utilizando Visual Basic, a ver si puedo rastrear una dirección IP. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Así audio fuera de sincronía a un lado, la creación de una interfaz gráfica de usuario con Visual Basic 38 00:02:29,570 --> 00:02:31,820 para rastrear una dirección IP es una completa tontería. 39 00:02:31,820 --> 00:02:33,840 En estos días no se utiliza Visual Basic, 40 00:02:33,840 --> 00:02:38,920 no hay necesidad de una interfaz gráfica de usuario y la dirección IP es un término técnicamente precisa. 41 00:02:38,920 --> 00:02:41,730 Así que mantener un ojo hacia fuera para ellos, y uno de mis favoritos: 42 00:02:41,730 --> 00:02:45,070 Éste es un poco más arcano, porque lo que necesita saber un idioma diferente. 43 00:02:45,070 --> 00:02:47,860 Hay un lenguaje llamado Objective-C, que es un superconjunto de C. 44 00:02:47,860 --> 00:02:51,960 Lo que significa que es C más algunas características adicionales, entre ellos programación orientada a objetos. 45 00:02:51,960 --> 00:02:55,070 Y este es el lenguaje que Apple ha popularizado para la programación de iOS. 46 00:02:55,070 --> 00:02:58,760 Así que aquí hay un clip de un show totalmente diferente, de "Numbers" 47 00:02:58,760 --> 00:03:02,450 que si en realidad se mira de cerca en su TiVo y la pausa en el momento justo, 48 00:03:02,450 --> 00:03:07,700 verás que lo que estamos viendo no es exactamente lo que se está describiendo. 49 00:03:07,700 --> 00:03:11,170 Y voy a tratar de un conector de audio diferente aquí y ver si no podemos 50 00:03:11,170 --> 00:03:13,780 mantener la sincronización de audio en este momento. 51 00:03:13,780 --> 00:03:20,530 Te doy "Numbers". 52 00:03:20,530 --> 00:03:23,240 >> [Hombre # 1] Se trata de una dirección IPv4 de 32 bits. 53 00:03:23,240 --> 00:03:38,930 [Hombre # 2] IP, que es la Internet. >> Private red. Es una red privada de Anita. 54 00:03:38,930 --> 00:03:43,810 [Malan] Bueno. Se trata de Objective-C, y es por algún programa para colorear para niños, 55 00:03:43,810 --> 00:03:51,140 como usted tal vez puede deducir del nombre de la variable de allí. 56 00:03:51,140 --> 00:03:54,410 Así que, entonces, era "Numbers". Así que hoy y esta semana te presentamos 57 00:03:54,410 --> 00:03:57,740 un poco del mundo de la ciencia forense y el contexto en los problemas, por lo tanto. 58 00:03:57,740 --> 00:04:00,590 Hoy será una lección abreviada porque hay un evento especial en aquí 59 00:04:00,590 --> 00:04:05,530 después, así que vamos a echar un vistazo, y se burlan tanto de los estudiantes como para los padres de hoy en día 60 00:04:05,530 --> 00:04:07,420 con algunas de las cosas que están en el horizonte. 61 00:04:07,420 --> 00:04:12,240 Entre ellos, a partir del lunes, tendrá un poco más de sus compañeros de clase. 62 00:04:12,240 --> 00:04:16,050 EDX, Harvard y MIT nueva iniciativa en línea para los cursos abiertos 63 00:04:16,050 --> 00:04:19,120 y más, está poniendo en marcha en el campus de Harvard, el lunes. 64 00:04:19,120 --> 00:04:21,490 Lo que significa venir lunes usted tendrá que - a partir del último recuento, 65 00:04:21,490 --> 00:04:26,210 86.000 compañeros de clase adicionales van a seguir a lo largo de con charlas CS50 66 00:04:26,210 --> 00:04:29,170 y secciones y tutoriales y boletines de problemas. 67 00:04:29,170 --> 00:04:32,350 Y como parte de esto, se convertirán en miembros de la clase inaugural de 68 00:04:32,350 --> 00:04:35,090 CS50 y CS50x ahora. 69 00:04:35,090 --> 00:04:39,310 >> Como parte de esto, ahora, darse cuenta de que habrá algunos Upsides también. 70 00:04:39,310 --> 00:04:43,790 Para prepararse para esto, por la enorme cantidad de estudiantes, 71 00:04:43,790 --> 00:04:47,180 baste decir que a pesar de que contamos con 108 TFS y CAS, 72 00:04:47,180 --> 00:04:50,790 no exactamente el mejor estudiante / profesor una vez llegamos a 80.000 estudiantes. 73 00:04:50,790 --> 00:04:52,850 Así que no vamos a clasificar problema para muchos juegos de forma manual. 74 00:04:52,850 --> 00:04:55,920 Así presentó esta semana en el conjunto de problemas será CS50 Check, 75 00:04:55,920 --> 00:04:58,450 que va a ser una utilidad de línea de comandos en el aparato 76 00:04:58,450 --> 00:05:01,200 que obtendrá una vez que lo actualice a finales de este fin de semana, 77 00:05:01,200 --> 00:05:03,200 y usted será capaz de ejecutar un comando, compruebe 50, 78 00:05:03,200 --> 00:05:06,500 en su propio conjunto de procesadores, y obtendrá una retroalimentación en cuanto a si su programa es 79 00:05:06,500 --> 00:05:11,160 correcto o incorrecto de acuerdo a las especificaciones de diseño diferentes que nos han proporcionado. 80 00:05:11,160 --> 00:05:13,580 Así que más que en la especificación y conjunto de problemas y 81 00:05:13,580 --> 00:05:17,240 los compañeros de clase CS50x va a utilizar esto también. 82 00:05:17,240 --> 00:05:19,230 >> Así boletín de problemas 4 tiene que ver con la medicina forense. 83 00:05:19,230 --> 00:05:21,940 Y esta pieza se inspiró en algunas cosas de la vida real, 84 00:05:21,940 --> 00:05:24,620 por lo que cuando yo estaba en la universidad, me internaron por un tiempo con 85 00:05:24,620 --> 00:05:28,650 Oficina de Distrito del Condado de Middlesex del Procurador haciendo el trabajo forense 86 00:05:28,650 --> 00:05:31,650 con su principal investigador forense, y lo que esto equivalía a 87 00:05:31,650 --> 00:05:35,260 Es decir, creo que mencioné la semana pasada algunos, es la policía estatal de comunicación u otros 88 00:05:35,260 --> 00:05:39,000 haría entrar, les dejan las cosas como discos duros y CD y los disquetes 89 00:05:39,000 --> 00:05:42,340 y similares, y entonces el objetivo de la oficina forense era determinar si los 90 00:05:42,340 --> 00:05:44,600 hubo o no evidencia de algún tipo. 91 00:05:44,600 --> 00:05:48,010 Esta fue la Unidad de Investigaciones Especiales, así que era delitos de cuello blanco, 92 00:05:48,010 --> 00:05:52,350 era una especie más problemática de los delitos, 93 00:05:52,350 --> 00:05:55,990 cualquier cosa que implica algún tipo de medios de comunicación digitales, resulta que no mucha gente 94 00:05:55,990 --> 00:05:59,370 escribir un e-mail diciendo: "Yo lo hice". 95 00:05:59,370 --> 00:06:03,290 Así que muy a menudo estas búsquedas forenses no se presentó todo lo que mucho fruto; 96 00:06:03,290 --> 00:06:05,850 pero a veces la gente iba a escribir dichos correos electrónicos. 97 00:06:05,850 --> 00:06:08,490 Así que a veces los esfuerzos se vieron recompensados. 98 00:06:08,490 --> 00:06:14,420 >> Pero para llevar a este conjunto de procesadores forense, vamos a introducir en pset 4 un poco de gráficos. 99 00:06:14,420 --> 00:06:18,260 Así que probablemente tomar estas cosas por sentado, JPEG, GIF y los que en estos días, 100 00:06:18,260 --> 00:06:21,640 pero si usted realmente piensa de él, una imagen, al igual que la cara de Rob, 101 00:06:21,640 --> 00:06:24,430 puede modelarse como una secuencia de puntos o píxeles. 102 00:06:24,430 --> 00:06:26,680 Ahora, en el caso de la cara de Rob, hay todo tipo de colores, 103 00:06:26,680 --> 00:06:29,940 y empezamos a ver los puntos individuales, otherwide conocidos como píxeles, 104 00:06:29,940 --> 00:06:31,610 una vez que empezamos para acercar la imagen 105 00:06:31,610 --> 00:06:35,590 Pero si simplificamos el mundo sea un poco, y sólo puedo decir que esto aquí es Rob 106 00:06:35,590 --> 00:06:40,560 en blanco y negro, bueno, para representar en blanco y negro que sólo se puede utilizar binario. 107 00:06:40,560 --> 00:06:44,960 Y si vamos a utilizar binario, 1 ó 0, podemos expresar esta misma imagen 108 00:06:44,960 --> 00:06:51,970 de la cara sonriente de Rob con este patrón de bits: 11000011 representa 109 00:06:51,970 --> 00:06:55,160 blanco, blanco, negro, negro, negro, negro, blanco blanco. 110 00:06:55,160 --> 00:06:59,290 Y lo que no es un gran salto, entonces, empezar a hablar de fotografías a todo color. 111 00:06:59,290 --> 00:07:01,920 Las cosas que usted vería en Facebook o tomar con una cámara digital, 112 00:07:01,920 --> 00:07:04,730 pero, ciertamente, cuando se trata de colores, necesita más bits. 113 00:07:04,730 --> 00:07:08,470 Y muy común en el mundo de las fotografías es utilizar no 1-bit color, 114 00:07:08,470 --> 00:07:12,730 ya que esto sugiere, pero de 24-bit color, en el que realmente obtener millones de colores. 115 00:07:12,730 --> 00:07:15,430 Así como en el caso cuando el zoom en el ojo de Rob, 116 00:07:15,430 --> 00:07:19,270 que era cualquier número de millones de posibilidades diferentes colores. 117 00:07:19,270 --> 00:07:22,260 >> Así que vamos a introducir en este boletín de problemas 4, así como en el tutorial, 118 00:07:22,260 --> 00:07:27,050 que será hoy a las 3:30 en lugar de las habituales a causa de 2:30 conferencia del viernes aquí. 119 00:07:27,050 --> 00:07:29,930 Pero el video estará en línea, como es habitual, mañana. 120 00:07:29,930 --> 00:07:31,880 También voy a presentar a otro formato de archivo. 121 00:07:31,880 --> 00:07:34,150 Así que esto está deliberadamente destinada a parecer intimidante al principio, 122 00:07:34,150 --> 00:07:38,980 pero esto es sólo parte de la documentación para una estructura C. 123 00:07:38,980 --> 00:07:42,280 Resulta que Microsoft, hace años, ayudó a popularizar este formato, 124 00:07:42,280 --> 00:07:46,630 llamado el formato de archivo de mapa de bits, BMP, y esto fue un super-simple, 125 00:07:46,630 --> 00:07:50,390 colorido formato de archivos gráficos que se utiliza desde hace bastante tiempo 126 00:07:50,390 --> 00:07:53,640 ya veces aún para fondos de pantalla en los escritorios. 127 00:07:53,640 --> 00:07:57,410 Si usted piensa de nuevo a Windows XP y las colinas y el cielo azul, 128 00:07:57,410 --> 00:08:00,660 que era típicamente un BMP, o la imagen de mapa de bits y mapas de bits 129 00:08:00,660 --> 00:08:03,340 Es divertido para nosotros porque tienen un poco más de complejidad. 130 00:08:03,340 --> 00:08:05,640 No es tan simple como esta rejilla de 0 y de 1; 131 00:08:05,640 --> 00:08:10,680 en cambio, tiene cosas como un encabezado al comienzo de un archivo. 132 00:08:10,680 --> 00:08:15,520 En otras palabras, dentro de un archivo. Bmp es un manojo entero de 0 y de 1, 133 00:08:15,520 --> 00:08:18,070 pero hay algo adicional 0 y 1 en allí. 134 00:08:18,070 --> 00:08:21,450 Y resulta que lo que probablemente ha dado por sentado durante años, 135 00:08:21,450 --> 00:08:27,040 formatos de archivo como. doc o. xls o mp3. o mp4., 136 00:08:27,040 --> 00:08:29,910 sean cuales sean los formatos de archivo que usted está familiarizado. 137 00:08:29,910 --> 00:08:31,900 Pues bien, ¿qué significa ser incluso un formato de archivo? 138 00:08:31,900 --> 00:08:35,740 Debido a que al final de la día, todos estos archivos tienen que utilizar sólo 0 y de 1 139 00:08:35,740 --> 00:08:39,950 y tal vez los 0 y los 1 representan a, b, c, a través de ASCII o similar, 140 00:08:39,950 --> 00:08:42,030 pero a través del final del día, es sólo 0 y de 1. 141 00:08:42,030 --> 00:08:45,300 >> Así que los humanos sólo de vez en cuando deciden inventar un nuevo formato de archivo 142 00:08:45,300 --> 00:08:49,420 donde estandarizar lo que los patrones de bits realmente significan. 143 00:08:49,420 --> 00:08:52,790 Y en este caso aquí, amigos los que diseñó el formato de archivo de mapa de bits 144 00:08:52,790 --> 00:08:58,260 dijo que en el primer byte en un archivo de mapa de bits, como se indica mediante el desplazamiento 0, no, 145 00:08:58,260 --> 00:09:02,320 que va a ser un poco crípticamente llamado bfType variable llamada, 146 00:09:02,320 --> 00:09:06,510 que sólo representa el tipo de archivo de mapa de bits, el tipo de archivo de mapa de bits que es esto. 147 00:09:06,510 --> 00:09:10,780 Se puede inferir, tal vez, desde la segunda fila que compensar 2, número 2 bytes, 148 00:09:10,780 --> 00:09:15,980 tiene un patrón de 0 y 1 que representa qué? 149 00:09:15,980 --> 00:09:18,320 El tamaño de algo, y va desde allí. 150 00:09:18,320 --> 00:09:20,660 Así que en conjunto el problema 4, usted puede caminar a través de algunas de estas cosas. 151 00:09:20,660 --> 00:09:24,480 >> No vamos a terminar el cuidado de todos ellos, pero note que empieza a ponerse interesante 152 00:09:24,480 --> 00:09:30,780 alrededor de la línea o byte 54, rgbtBlue, verde y rojo. 153 00:09:30,780 --> 00:09:35,280 Si alguna vez has escuchado la sigla RGB, rojo, verde, azul, esta es una referencia a eso. 154 00:09:35,280 --> 00:09:37,840 Porque resulta que usted puede pintar todos los colores del arco iris 155 00:09:37,840 --> 00:09:41,580 con una combinación de rojo, azul y verde. 156 00:09:41,580 --> 00:09:46,560 Y, de hecho, los padres en la habitación puede recordar algunos de los primeros proyectores. 157 00:09:46,560 --> 00:09:49,360 En estos días, usted acaba de ver una luz brillante que sale de una lente. 158 00:09:49,360 --> 00:09:52,870 Sin embargo, en su día, tuvo la lente de color rojo, la lente azul y verde de la lente 159 00:09:52,870 --> 00:09:56,620 y juntos dirigida a la pantalla y se formó un cuadro de colores. 160 00:09:56,620 --> 00:09:59,590 Y muy a menudo las escuelas intermedias y secundarias que tienen esos lentes 161 00:09:59,590 --> 00:10:02,680 siempre tan ligeramente ladeado, por lo que eran una especie de ver imágenes dobles o triples, 162 00:10:02,680 --> 00:10:07,500 pero esa era la idea. Tenías luz roja, verde y azul que pinta un cuadro. 163 00:10:07,500 --> 00:10:09,570 Y ese mismo principio se utiliza en las computadoras. 164 00:10:09,570 --> 00:10:12,000 >> Así que uno de los desafíos, entonces, en el conjunto de problemas 4 165 00:10:12,000 --> 00:10:16,080 van a ser un par de cosas: una es para redimensionar una imagen. 166 00:10:16,080 --> 00:10:18,050 Para tomar en un patrón de 0 y de 1, 167 00:10:18,050 --> 00:10:22,840 averiguar qué trozos de 0 y de 1 representan lo que en una estructura de este tipo, 168 00:10:22,840 --> 00:10:26,800 y luego encontrar la manera de reproducir los píxeles: los rojos, los azules, los verdes 169 00:10:26,800 --> 00:10:32,460 dentro, así que cuando una imagen se ve como este principio, podría tener este lugar después de eso. 170 00:10:32,460 --> 00:10:35,590 Entre otros desafíos, también, va a ser que se le entregó 171 00:10:35,590 --> 00:10:38,900 una imagen forense de un archivo real de una cámara digital 172 00:10:38,900 --> 00:10:42,410 y en esa cámara, hace mucho tiempo, eran un montón de fotos. 173 00:10:42,410 --> 00:10:47,030 El problema es que nos borren por accidente o ha tenido la imagen dañada de alguna manera. 174 00:10:47,030 --> 00:10:51,040 Las cosas malas suceden con cámaras digitales, por lo que rápidamente copiado todos los años 0 y 1 de 175 00:10:51,040 --> 00:10:55,410 fuera de esa tarjeta para usted, salvó a todos en un archivo grande, y luego los vamos a entregar a usted 176 00:10:55,410 --> 00:11:00,000 problema en el grupo 4 de modo que usted puede escribir un programa en C con el que recuperar 177 00:11:00,000 --> 00:11:02,660 todos esos archivos JPEG, idealmente. 178 00:11:02,660 --> 00:11:06,280 Y resulta que los archivos JPEG, aunque son algo así como un formato de archivo complejo, 179 00:11:06,280 --> 00:11:09,580 son mucho más complejas que esta cara sonriente aquí. 180 00:11:09,580 --> 00:11:14,320 Resulta que cada JPEG comienza con los mismos patrones de 0 y de 1. 181 00:11:14,320 --> 00:11:18,820 Así que usando un bucle while o un ciclo for o similar, 182 00:11:18,820 --> 00:11:22,350 usted puede iterar sobre todos los 0 y los 1 en esta imagen forense 183 00:11:22,350 --> 00:11:26,670 y cada vez que ves el patrón especial que está definido en la especificación del conjunto del problema, 184 00:11:26,670 --> 00:11:29,770 se puede asumir, 'Oh, esto es, con una probabilidad muy alta, 185 00:11:29,770 --> 00:11:33,520 el inicio de un archivo JPEG, 'y en cuanto a encontrar el mismo patrón, 186 00:11:33,520 --> 00:11:36,050 un cierto número de bytes o kilobytes o megabytes después, 187 00:11:36,050 --> 00:11:40,550 se puede asumir, 'Ooh! He aquí una segunda JPEG, la foto que tomé después de la primera. 188 00:11:40,550 --> 00:11:44,720 Permítanme dejar de leer ese archivo en primer lugar, empezar a escribir este nuevo '. 189 00:11:44,720 --> 00:11:49,980 Y la salida de su programa conjunto de procesadores por 4 va a haber hasta 50 imágenes JPEG. 190 00:11:49,980 --> 00:11:52,400 Y si no son 50 imágenes JPEG, tiene un poco de un bucle. 191 00:11:52,400 --> 00:11:55,580 Si usted tiene un número infinito de imágenes JPEG, tiene un bucle infinito. 192 00:11:55,580 --> 00:11:58,280 Así que, también, será un caso bastante común. 193 00:11:58,280 --> 00:12:00,280 Eso es lo que está en el horizonte. 194 00:12:00,280 --> 00:12:03,740 >> Cuestionario 0, detrás de nosotros. Date cuenta, por mi correo electrónico, que invariablemente hay gente 195 00:12:03,740 --> 00:12:06,820 que son a la vez tipo feliz, neutral, y triste alrededor cuestionario tiempo 0. 196 00:12:06,820 --> 00:12:10,160 Y por favor acercarse a mí, la TFS cabeza, Zamyla, su propio TF 197 00:12:10,160 --> 00:12:14,120 o una de las entidades emisoras de certificados que usted sepa si usted quisiera discutir cómo iban las cosas. 198 00:12:14,120 --> 00:12:16,460 >> Así que para impresionar a los padres aquí en la habitación, 199 00:12:16,460 --> 00:12:23,990 lo que es la biblioteca CS50? Buen trabajo. 200 00:12:23,990 --> 00:12:32,280 ¿Cuál es la biblioteca CS50? ¿Sí? [Respuestas de los estudiantes, ininteligible] 201 00:12:32,280 --> 00:12:35,730 >> Bien, bien. Así que es un conjunto preescrito de código que nosotros, el personal, escribió: 202 00:12:35,730 --> 00:12:38,460 que le proporcionamos, para proporcionar algunas funcionalidades comunes. 203 00:12:38,460 --> 00:12:42,290 Cosas como conseguirme una cadena ¡ayúdeme a un int, todas las funciones que se enumeran aquí. 204 00:12:42,290 --> 00:12:45,260 A partir de ahora, empezamos a tomar realmente estas ruedas de entrenamiento apagado. 205 00:12:45,260 --> 00:12:48,230 Así que vamos a empezar a llevar una "cadena" de usted, 206 00:12:48,230 --> 00:12:52,790 que, recordemos, era sólo un sinónimo para el tipo de datos real? char *. 207 00:12:52,790 --> 00:12:57,020 Así que para los padres, que probablemente fue - eso es bueno, así char * empezaremos a ver 208 00:12:57,020 --> 00:13:00,810 en la pantalla con mayor razón ahora que eliminar "cadena" de nuestro vocabulario, 209 00:13:00,810 --> 00:13:02,760 al menos cuando se trata de realmente escribir código. 210 00:13:02,760 --> 00:13:06,240 Del mismo modo, vamos a dejar de utilizar algunas de estas funciones como mucho, 211 00:13:06,240 --> 00:13:08,390 ya que nuestros programas se van a poner más sofisticado 212 00:13:08,390 --> 00:13:11,370 en vez de sólo escribir programas que se sientan allí con un mensaje parpadeando, 213 00:13:11,370 --> 00:13:13,580 esperando a que el usuario escriba algo pulg 214 00:13:13,580 --> 00:13:15,220 Usted recibirá sus entradas de otros lugares. 215 00:13:15,220 --> 00:13:18,720 Por ejemplo, usted los reciba de una serie de bits en el disco duro local. 216 00:13:18,720 --> 00:13:23,340 En su lugar, voy a conseguir en el futuro de una conexión de red, un sitio web en alguna parte. 217 00:13:23,340 --> 00:13:27,460 Así que vamos a pelar esta capa, por primera vez, y levante el aparato CS50 218 00:13:27,460 --> 00:13:32,300 y el archivo llamado CS50.h, que ha sido fuerte incluso durante semanas. 219 00:13:32,300 --> 00:13:34,380 >> Pero vamos a ver realmente lo que hay dentro de esto. 220 00:13:34,380 --> 00:13:38,250 Así que la parte superior del archivo en azul es sólo un montón de comentarios, 221 00:13:38,250 --> 00:13:41,340 información sobre la garantía y licencia. Esta es una especie de paradigma común 222 00:13:41,340 --> 00:13:44,600 en software, ya que una gran cantidad de software en estos días es lo que se llama "código abierto" 223 00:13:44,600 --> 00:13:46,940 lo que significa que alguien ha escrito el código 224 00:13:46,940 --> 00:13:50,060 y lo hizo libremente disponible, no sólo para ejecutar y utilizar, 225 00:13:50,060 --> 00:13:53,660 pero en realidad leer y modificar e integrar en su propio trabajo. 226 00:13:53,660 --> 00:13:55,790 Así que eso es lo que usted ha estado utilizando, el software de código abierto, 227 00:13:55,790 --> 00:13:58,030 aunque en una forma muy pequeña. 228 00:13:58,030 --> 00:14:01,860 Si me desplazo hacia abajo más allá de los comentarios, sin embargo, vamos a empezar a ver algunas cosas más familiares. 229 00:14:01,860 --> 00:14:08,090 Así que notar en la parte superior aquí, que el archivo CS50.h incluye una gran cantidad de archivos de cabecera. 230 00:14:08,090 --> 00:14:11,160 Ahora, la mayoría de ellos no hemos visto antes, pero es un 231 00:14:11,160 --> 00:14:15,640 familiar; cuál de estos hemos visto, aunque brevemente, hasta el momento? 232 00:14:15,640 --> 00:14:18,720 Sí, las bibliotecas estándar. Stdlib.h tiene malloc, 233 00:14:18,720 --> 00:14:21,590 así que una vez que empezamos a hablar acerca de la asignación de memoria dinámica, 234 00:14:21,590 --> 00:14:24,960 que vamos a volver a la semana siguiente, así, que comenzó a incluir ese archivo. 235 00:14:24,960 --> 00:14:29,660 Resulta que bool y verdadero y lo falso en realidad no existe en C, per se, 236 00:14:29,660 --> 00:14:32,460 a menos que incluya el archivo aquí. 237 00:14:32,460 --> 00:14:35,770 Así tenemos, por semanas, ha incluido estándar bool.h 238 00:14:35,770 --> 00:14:39,020 de modo que usted puede utilizar la noción de una. bool, verdadero o falso 239 00:14:39,020 --> 00:14:41,830 Sin esto, usted tendría que ordenar de fingir y utilizar un int 240 00:14:41,830 --> 00:14:45,920 y sólo arbitrariamente asumir que 0 es falso y 1 es verdadera. 241 00:14:45,920 --> 00:14:49,980 >> Ahora bien, si desplácese hacia abajo aún más, aquí es nuestra definición de una cadena. 242 00:14:49,980 --> 00:14:54,820 Resulta que, como hemos dicho antes, que cuando esto * es en realidad no importa. 243 00:14:54,820 --> 00:14:56,750 Usted puede incluso tener espacio a su alrededor. 244 00:14:56,750 --> 00:15:01,550 Nosotros, en este semestre, ha estado promoviendo como esto para dejar claro que la * tiene que ver con el tipo. 245 00:15:01,550 --> 00:15:05,370 Pero dese cuenta, al igual que común, si no un poco más común, es ponerlo allí 246 00:15:05,370 --> 00:15:07,480 pero funcionalmente es lo mismo. 247 00:15:07,480 --> 00:15:11,070 Pero ahora, si leemos más abajo, vamos a echar un vistazo a, digamos, getInt, 248 00:15:11,070 --> 00:15:15,350 porque hemos utilizado que, tal vez, antes que nada este semestre. 249 00:15:15,350 --> 00:15:19,620 Y aquí está getInt. Esto es lo que? 250 00:15:19,620 --> 00:15:24,650 Este es el prototipo. Muy a menudo, hemos puesto prototipos en la parte superior de nuestro. Archivos c, 251 00:15:24,650 --> 00:15:28,190 pero también se puede poner en prototipos archivos de cabecera, archivos. h, 252 00:15:28,190 --> 00:15:32,110 como esta aquí, así que cuando usted escribe algunas funciones 253 00:15:32,110 --> 00:15:36,790 que desea que otras personas puedan usar, que es exactamente el caso de la biblioteca CS50, 254 00:15:36,790 --> 00:15:40,900 no sólo poner en práctica sus funciones en algo así como CS50.c, 255 00:15:40,900 --> 00:15:46,720 también poner los prototipos no en la parte superior de ese archivo, pero en la parte superior de un archivo de cabecera, 256 00:15:46,720 --> 00:15:50,810 luego de que el archivo de cabecera es lo que los amigos y colegas incluyen, 257 00:15:50,810 --> 00:15:52,800 con fuerte incluir en su propio código. 258 00:15:52,800 --> 00:15:55,440 Así que todo este tiempo que has estado incluyendo todos estos prototipos 259 00:15:55,440 --> 00:15:59,870 eficazmente en la parte superior de su archivo, pero a través de este mecanismo incluyen agudo 260 00:15:59,870 --> 00:16:03,320 que, esencialmente, copia y pega este archivo en su cuenta. 261 00:16:03,320 --> 00:16:06,400 Ahora, aquí hay algo de documentación muy detallada. 262 00:16:06,400 --> 00:16:08,880 >> Hemos prácticamente por sentado que getInt recibe un int, 263 00:16:08,880 --> 00:16:10,740 pero resulta que hay algunos casos extremos, ¿no? 264 00:16:10,740 --> 00:16:14,320 ¿Qué pasa si el usuario escribe un número que es demasiado grande? 265 00:16:14,320 --> 00:16:17,350 Un trillón, que no puede caber dentro de un int? 266 00:16:17,350 --> 00:16:21,180 ¿Cuál es el comportamiento esperado? Bueno, lo ideal es predecible. 267 00:16:21,180 --> 00:16:23,460 Así que en este caso, si uno lee la letra pequeña, 268 00:16:23,460 --> 00:16:27,850 verás que si la línea no se puede leer, esta INT_MAX devoluciones. 269 00:16:27,850 --> 00:16:30,800 Nunca hemos hablado de esto, pero en base a su capitalización, 270 00:16:30,800 --> 00:16:33,030 lo que es, probablemente? 271 00:16:33,030 --> 00:16:36,610 Es una constante, por lo que es una constante especial que probablemente declarado 272 00:16:36,610 --> 00:16:39,460 en uno de esos archivos de cabecera que hay más arriba en el archivo, 273 00:16:39,460 --> 00:16:43,400 y INT_MAX es probablemente algo como, aproximadamente, 2 millones de dólares. 274 00:16:43,400 --> 00:16:48,160 La idea es que, porque tenemos que indicar de alguna manera que algo salió mal, 275 00:16:48,160 --> 00:16:51,090 nosotros, sí, tenemos 4 millones de números a nuestra disposición, 276 00:16:51,090 --> 00:16:53,980 negativo 2 millones de dólares en hasta 2 millones de dólares, más o menos. 277 00:16:53,980 --> 00:16:58,030 Bueno, lo que es común en la programación es que robar uno de esos números. 278 00:16:58,030 --> 00:17:02,250 Quizás 0, tal vez 2 millones de dólares, tal vez negativo 2 millones de dólares. 279 00:17:02,250 --> 00:17:06,720 Así que pasar uno de sus valores posibles para que pueda comprometerse con el mundo 280 00:17:06,720 --> 00:17:10,089 que si algo sale mal, yo me volveré este valor super-grande. 281 00:17:10,089 --> 00:17:13,329 Pero usted no desea que el usuario escriba algo críptica como "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 del número realmente grande, donde se generaliza en cambio como una constante. 283 00:17:17,079 --> 00:17:19,380 Así que en realidad, si se estaban anal en las últimas semanas, 284 00:17:19,380 --> 00:17:23,800 en cualquier momento que llame getInt, usted debe haber estado revisando con una condición if. 285 00:17:23,800 --> 00:17:27,109 ¿El tipo de usuario en INT_MAX, o más específicamente, 286 00:17:27,109 --> 00:17:29,900 hizo INT_MAX getInt cambio? Porque si lo hiciera, 287 00:17:29,900 --> 00:17:35,140 que en realidad quiere decir que no lo escriba, algo salió mal en este caso. 288 00:17:35,140 --> 00:17:38,970 Así que esto es lo que se conoce generalmente como un "centinela" de valor, lo cual significa especial. 289 00:17:38,970 --> 00:17:41,020 >> Bueno, pasemos ahora a los archivos. C. 290 00:17:41,020 --> 00:17:44,500 El archivo de C ha existido en el aparato durante algún tiempo, 291 00:17:44,500 --> 00:17:47,540 y, de hecho, el aparato tiene que precompilado para usted 292 00:17:47,540 --> 00:17:49,720 en esa cosa que llamamos "código objeto" 293 00:17:49,720 --> 00:17:52,940 pero eso no le importa a usted donde está porque el sistema sabe, 294 00:17:52,940 --> 00:17:54,780 en este caso, donde es, el aparato. 295 00:17:54,780 --> 00:18:00,620 Pero vayamos ahora a desplazarse hacia abajo getInt, y ver cómo getInt ha estado trabajando todo este tiempo. 296 00:18:00,620 --> 00:18:02,380 Así que aquí tenemos comentarios similares de antes. 297 00:18:02,380 --> 00:18:04,930 Permítanme hacer un zoom sobre sólo la parte del código, 298 00:18:04,930 --> 00:18:07,410 y lo que tenemos para getInt es la siguiente. 299 00:18:07,410 --> 00:18:12,770 No se necesita entrada y devuelve un int, mientras que (verdad), así que tenemos un bucle infinito deliberada 300 00:18:12,770 --> 00:18:16,560 pero, presumiblemente, vamos a salir de esto de alguna manera, o volver desde este. 301 00:18:16,560 --> 00:18:19,890 Así que vamos a ver cómo funciona esto. Bueno, parece que estamos usando GetString 302 00:18:19,890 --> 00:18:22,550 en esta línea primero dentro del bucle, 166. 303 00:18:22,550 --> 00:18:25,320 Esto ahora es una buena práctica porque bajo qué circunstancias 304 00:18:25,320 --> 00:18:30,820 GetString podría regresar esta palabra clave especial NULL,? 305 00:18:30,820 --> 00:18:38,460 Si algo sale mal. ¿Qué podría salir mal cuando se llama algo así como GetString? 306 00:18:38,460 --> 00:18:42,550 ¿Sí? [Respuesta Estudiantil, ininteligible] >> Si. Así que tal vez malloc falla. 307 00:18:42,550 --> 00:18:45,310 En algún lugar debajo de la campana llamando a GetString malloc, 308 00:18:45,310 --> 00:18:48,210 que asigna la memoria, que permite el almacenaje informático 309 00:18:48,210 --> 00:18:50,950 todos los caracteres que el usuario escribe en el teclado. 310 00:18:50,950 --> 00:18:53,270 Y supongamos que el usuario tenía un montón de tiempo libre 311 00:18:53,270 --> 00:18:56,470 y escrito más, por ejemplo, de 2 mil millones de caracteres. 312 00:18:56,470 --> 00:18:59,600 Más caracteres que el equipo aún tiene RAM. 313 00:18:59,600 --> 00:19:02,350 Bueno, GetString tiene que ser capaz de indicar que para que, 314 00:19:02,350 --> 00:19:05,650 incluso si se trata de un caso super, super esquina infrecuente. 315 00:19:05,650 --> 00:19:08,490 Tiene que ser de alguna manera capaz de manejar esto, GetString y así, 316 00:19:08,490 --> 00:19:11,850 si volver atrás y leer su documentación, lo hace, de hecho, devuelva NULL. 317 00:19:11,850 --> 00:19:16,150 Ahora bien, si GetString falla al devolver NULL, getInt va a fallar 318 00:19:16,150 --> 00:19:19,370 devolviendo INT_MAX, como un centinela. 319 00:19:19,370 --> 00:19:22,650 Estos son sólo convenciones humanas. La única manera de saber que este es el caso 320 00:19:22,650 --> 00:19:24,840 es mediante la lectura de la documentación. 321 00:19:24,840 --> 00:19:28,200 Así que desplazarse hacia abajo para que el int es realmente GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Así que si me desplazo un poco más lejos, en la línea 170 que tiene un comentario sobre estas líneas. 323 00:19:34,220 --> 00:19:38,470 Por lo tanto, declaramos, en 172, un int n y aire char, y entonces esta nueva función 324 00:19:38,470 --> 00:19:41,870 que algunos de ustedes han tropezado antes, pero sscanf. 325 00:19:41,870 --> 00:19:44,190 Esto significa cadena f exploración. 326 00:19:44,190 --> 00:19:48,580 En otras palabras, dame una cadena y lo voy a buscar los fragmentos de información de interés. 327 00:19:48,580 --> 00:19:53,820 Entonces, ¿qué significa eso? Bueno, supongo que escribir, literalmente, 1 2 3 en el teclado, 328 00:19:53,820 --> 00:19:59,730 y luego pulsa enter. ¿Cuál es el tipo de datos de 1 2 3 cuando son devueltos por GetString? 329 00:19:59,730 --> 00:20:05,010 Obviamente es una cadena, ¿no? Tengo una cadena, por lo que 1 2 3 es realmente "1 2 3" 330 00:20:05,010 --> 00:20:07,260 con el 0 \ al final de la misma. Eso no es un int. 331 00:20:07,260 --> 00:20:10,420 Eso no es un número. Parece un número, pero no es en realidad. 332 00:20:10,420 --> 00:20:14,680 Entonces, ¿qué getInt tengo que hacer? Se tiene que explorar esa cadena de izquierda a derecha, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, y de alguna manera convertir a un entero real. 334 00:20:19,010 --> 00:20:21,010 Ahora, usted podría encontrar la manera de hacer esto. 335 00:20:21,010 --> 00:20:24,240 Si piensas en pset 2, usted probablemente tiene un poco cómodo 336 00:20:24,240 --> 00:20:26,810 con César o Vigenére por lo que puede iterar sobre una secuencia, 337 00:20:26,810 --> 00:20:29,800 usted puede convertir caracteres a enteros con púa. Eso es un montón de trabajo. 338 00:20:29,800 --> 00:20:32,800 ¿Por qué no llamar a una función como sscanf que hace eso para usted? 339 00:20:32,800 --> 00:20:37,520 Así sscanf espera un argumento, en este caso llamado línea, que es una cadena. 340 00:20:37,520 --> 00:20:41,310 A continuación, especificar, entre comillas, muy similar a printf, 341 00:20:41,310 --> 00:20:44,960 ¿qué es lo que se espera ver en esta cadena? 342 00:20:44,960 --> 00:20:52,980 Lo que estoy diciendo aquí es que esperamos ver un número decimal y tal vez un personaje. 343 00:20:52,980 --> 00:20:54,990 Y vamos a ver por qué este es el caso en un momento. 344 00:20:54,990 --> 00:20:58,440 Resulta que esta notación es ahora una reminiscencia de cosas 345 00:20:58,440 --> 00:21:00,840 empezamos a hablar de algo más de una semana. 346 00:21:00,840 --> 00:21:05,430 >> ¿Cuál es & N y & c haciendo por nosotros aquí? [Respuestas de los estudiantes, ininteligible] 347 00:21:05,430 --> 00:21:07,610 Sí >>. Me está dando la dirección de n y la dirección de c. 348 00:21:07,610 --> 00:21:10,440 Ahora, ¿por qué es tan importante? Bueno, ya sabes que con las funciones en C 349 00:21:10,440 --> 00:21:13,440 siempre se puede devolver un valor o ningún valor en absoluto. 350 00:21:13,440 --> 00:21:16,630 Usted puede devolver un int, cadena, un flotador, char a, lo que sea. 351 00:21:16,630 --> 00:21:21,150 O bien, puede volver vacía, sino que sólo puede devolver una cosa al máximo. 352 00:21:21,150 --> 00:21:26,100 Pero aquí queremos sscanf para mí volver tal vez un entero, un número decimal, 353 00:21:26,100 --> 00:21:29,240 y también a. char, y voy a explicar por qué el char en un momento 354 00:21:29,240 --> 00:21:34,250 Así que efectivamente quieren f para volver dos cosas, eso no es posible en C. 355 00:21:34,250 --> 00:21:38,460 Así que usted puede evitar que al aprobar en 2 direcciones, 356 00:21:38,460 --> 00:21:43,710 porque en cuanto te entregan una función de dos direcciones, lo que puede que la función de hacer con ellos? 357 00:21:43,710 --> 00:21:49,880 Se puede escribir en esas direcciones. Usted puede utilizar la operación * e "ir allí" para cada una de esas direcciones. 358 00:21:49,880 --> 00:21:54,320 Es una especie de este mecanismo de puerta trasera, pero muy común para cambiar los valores de las variables 359 00:21:54,320 --> 00:21:58,020 en más de sólo 1 lugar, en este caso 2. 360 00:21:58,020 --> 00:22:04,590 Ahora, noten que estoy comprobando == a 1, y luego regresar n si eso es así, de hecho, se evalúan como true. 361 00:22:04,590 --> 00:22:09,340 Entonces, ¿qué está pasando? Bueno, técnicamente, todo lo que realmente queremos que suceda en getInt es esto. 362 00:22:09,340 --> 00:22:12,340 Queremos analizar, por decirlo así, queremos leer la cadena 363 00:22:12,340 --> 00:22:16,210 "1 2 3", y si parece que hay un número allí, 364 00:22:16,210 --> 00:22:21,360 lo que estamos diciendo sscanf que hacer es poner ese número, 1 2 3, en esta variable n para mí. 365 00:22:21,360 --> 00:22:26,060 ¿Por qué, entonces, tengo esto así? 366 00:22:26,060 --> 00:22:33,750 ¿Cuál es el papel de la también diciendo: sscanf, también puede ser que consiga un personaje aquí. 367 00:22:33,750 --> 00:22:36,890 [Habla el estudiante, ininteligible] >> No - un punto decimal podía trabajar. 368 00:22:36,890 --> 00:22:40,650 Vamos a celebrar que pensó por un momento. ¿Qué más? 369 00:22:40,650 --> 00:22:42,570 [Estudiante, ininteligible] >> Así que, buen pensamiento, podría ser el carácter NULL. 370 00:22:42,570 --> 00:22:44,970 En realidad no es, en este caso. ¿Sí? [Estudiante, ininteligible] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. O bien, permítanme generalizar aún más. 372 00:22:47,100 --> 00:22:49,670 El% c no es sólo para la comprobación de errores. 373 00:22:49,670 --> 00:22:52,510 No queremos que haya personaje después del número, 374 00:22:52,510 --> 00:22:54,980 pero lo que esto me permite hacer es lo siguiente: 375 00:22:54,980 --> 00:23:01,270 Resulta que sscanf, además de almacenar los valores de N y C, en este ejemplo aquí, 376 00:23:01,270 --> 00:23:08,170 lo que también hace es que devuelve el número de variables que poner los valores cm 377 00:23:08,170 --> 00:23:13,330 Así que si sólo escribes 1 2 3, entonces sólo el% d va a coincidir 378 00:23:13,330 --> 00:23:18,830 y sólo se almacena n con un valor como 1 2 3 y nada se pone en c; 379 00:23:18,830 --> 00:23:20,870 c sigue siendo un valor basura, por así decirlo. 380 00:23:20,870 --> 00:23:23,550 Basura, ya que nunca se ha inicializado como un valor. 381 00:23:23,550 --> 00:23:29,390 Así que en ese caso, sscanf devuelve 1, porque poblada uno de los punteros, 382 00:23:29,390 --> 00:23:33,650 en cuyo caso, genial. Tengo un int, por lo que liberar la línea para liberar la memoria 383 00:23:33,650 --> 00:23:37,150 GetString que realmente asignado, y luego vuelvo n. 384 00:23:37,150 --> 00:23:42,210 Si no, si te has preguntado donde reintento declaración que viene, viene de aquí. 385 00:23:42,210 --> 00:23:45,770 Si, por el contrario, de tipo I en 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 sólo alguna secuencia aleatoria de texto, sscanf va a ver, 387 00:23:48,640 --> 00:23:51,500 ooh, número, ooh, número, ooh, número, ooh - f. 388 00:23:51,500 --> 00:23:54,190 Y se va a poner la 1 2 3 n. 389 00:23:54,190 --> 00:23:59,970 Se va a poner la f en c, y luego volver 2. 390 00:23:59,970 --> 00:24:02,980 Así que tenemos, simplemente usando la definición básica de la conducta de scanf, 391 00:24:02,980 --> 00:24:06,170 una manera muy sencilla - bien, complejo a primera vista, pero al final de la día, 392 00:24:06,170 --> 00:24:11,460 mecanismo bastante simple de decir, ¿hay un int, y si lo es, que lo único que he encontrado? 393 00:24:11,460 --> 00:24:14,950 Y el espacio en blanco aquí es deliberada. Si usted lee la documentación de sscanf, 394 00:24:14,950 --> 00:24:18,690 ella le dice que si se incluye un pedazo de espacio en blanco al principio o al final, 395 00:24:18,690 --> 00:24:24,990 sscanf también permitirá al usuario, por cualquier razón, para golpear la barra espaciadora 1 2 3, y que será legítimo. 396 00:24:24,990 --> 00:24:28,310 No gritará en el usuario sólo porque pulsar la barra espaciadora al principio o al final, 397 00:24:28,310 --> 00:24:32,160 que es sólo un poco más fácil de usar. 398 00:24:32,160 --> 00:24:34,160 >> Cualquier pregunta, entonces, en GetInts? ¿Sí? 399 00:24:34,160 --> 00:24:36,820 [Pregunta Estudiante, ininteligible] 400 00:24:36,820 --> 00:24:40,740 >> Buena pregunta. ¿Qué pasa si usted acaba de escribir en un char, como f, y pulsa enter 401 00:24:40,740 --> 00:24:47,830 sin tener que teclear 1 2 3; ¿qué te parece el comportamiento de esta línea de código sería entonces? 402 00:24:47,830 --> 00:24:50,500 Así sscanf que puede cubrir también, porque en ese caso, 403 00:24:50,500 --> 00:24:56,280 que no va a llenar n oc, sino que va a volver en vez 0. 404 00:24:56,280 --> 00:25:01,540 En este caso, también estoy captura de ese escenario, ya que el valor esperado que quiero es 1. 405 00:25:01,540 --> 00:25:07,310 Sólo quiero una, y sólo una cosa para ser llenados. Buena pregunta. ¿Otros? 406 00:25:07,310 --> 00:25:09,610 >> Muy bien, así que no vamos a ir a través de todas las funciones de aquí, 407 00:25:09,610 --> 00:25:11,820 pero la que parece ser, tal vez, del interés restante 408 00:25:11,820 --> 00:25:14,530 se GetString porque resulta que GetFloat, getInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble GetLongLong todo punt gran parte de su funcionalidad a GetString. 410 00:25:19,490 --> 00:25:22,860 Así que echemos un vistazo a la forma en que se lleva a cabo aquí. 411 00:25:22,860 --> 00:25:27,040 Éste parece un poco complejo pero utiliza los mismos fundamentos 412 00:25:27,040 --> 00:25:29,680 que empezamos a hablar de la semana pasada. Así que en GetString, 413 00:25:29,680 --> 00:25:32,670 que no tiene en argumento como por el vacío hasta aquí, 414 00:25:32,670 --> 00:25:37,110 y devuelve una cadena, por lo que estoy declarando una cadena denominada buffer. 415 00:25:37,110 --> 00:25:39,670 Realmente no sé lo que va a ser utilizado para todavía, pero ya veremos. 416 00:25:39,670 --> 00:25:42,950 Looks like capacidad es, por defecto, 0; sin saber muy bien a dónde va esto. 417 00:25:42,950 --> 00:25:44,920 No estoy seguro que n va a ser utilizado para todavía. 418 00:25:44,920 --> 00:25:47,860 Pero ahora se está volviendo un poco más interesante, por lo que en la línea 243, 419 00:25:47,860 --> 00:25:51,760 declaramos un int c, esto es una especie de un detalle tonto. 420 00:25:51,760 --> 00:25:58,080 Un char es de 8 bits, y 8 bits puede almacenar cuántos valores diferentes? 421 00:25:58,080 --> 00:26:03,310 256. El problema es que si usted quiere tener 256 caracteres ASCII diferentes, 422 00:26:03,310 --> 00:26:06,210 que hay, si usted piensa de nuevo, y esto no es algo para memorizar. 423 00:26:06,210 --> 00:26:09,100 Pero si piensas en esa tabla ASCII grande que tuvimos semanas atrás, 424 00:26:09,100 --> 00:26:13,780 hubo, en ese caso, 128 o 256 caracteres ASCII. 425 00:26:13,780 --> 00:26:16,220 Utilizamos todos los patrones de 0 y 1 que pasa. 426 00:26:16,220 --> 00:26:19,410 Eso es un problema si usted quiere ser capaz de detectar un error. 427 00:26:19,410 --> 00:26:23,290 Porque si usted ya está usando 256 valores para sus personajes, 428 00:26:23,290 --> 00:26:26,390 que en realidad no planificar el futuro, porque ahora no hay manera de decir: 429 00:26:26,390 --> 00:26:29,750 "Esto no es un personaje de fiar, lo que es cierto mensaje erróneo". 430 00:26:29,750 --> 00:26:32,430 Entonces, ¿qué hace el mundo es, utilizar el valor más cercano; 431 00:26:32,430 --> 00:26:35,790 algo así como un int para que tenga un número loco de bits, 432 00:26:35,790 --> 00:26:39,610 32 por 4 billones de valores posibles, por lo que sólo tiene que terminan usando, 433 00:26:39,610 --> 00:26:44,800 esencialmente, 257 de ellos, 1 de los cuales tiene un significado especial como un error. 434 00:26:44,800 --> 00:26:49,190 >> Así que vamos a ver cómo funciona esto. En la línea 246, tengo este gran bucle while 435 00:26:49,190 --> 00:26:54,530 que está llamando fgetc, archivo f significado, getc, a continuación, stdin. 436 00:26:54,530 --> 00:26:59,030 Resulta que esta es sólo la forma más precisa de decir "leer la entrada desde el teclado." 437 00:26:59,030 --> 00:27:02,730 Teclado estándar medio de entrada, la salida estándar significa pantalla, 438 00:27:02,730 --> 00:27:06,920 y el error estándar, que veremos en pset 4, significa que la pantalla, 439 00:27:06,920 --> 00:27:09,670 pero una parte especial de la pantalla de modo que no está fusionado 440 00:27:09,670 --> 00:27:13,760 con una producción real que se pretende imprimir, pero más sobre esto en el futuro. 441 00:27:13,760 --> 00:27:19,430 Así fgetc sólo significa leer un carácter del teclado y almacenarlo donde? 442 00:27:19,430 --> 00:27:24,000 Guárdelo en c, y luego comprobar, así que estoy usando algunas conjunciones booleanos aquí, 443 00:27:24,000 --> 00:27:28,430 comprobar que no es igual a \ n, por lo que el usuario ha llegado a entrar. 444 00:27:28,430 --> 00:27:31,510 Queremos dejar en ese punto, al final del bucle, y también queremos comprobar 445 00:27:31,510 --> 00:27:36,170 para la constante especial, EOF, lo que si sabe o adivina - ¿qué significa? 446 00:27:36,170 --> 00:27:39,860 Final del archivo. Así que esto es algo sin sentido, porque si estoy escribiendo en el teclado, 447 00:27:39,860 --> 00:27:41,900 no hay realmente ningún archivo involucrados en esto, 448 00:27:41,900 --> 00:27:44,330 pero esto es sólo una especie del término genérico utilizado para referirse 449 00:27:44,330 --> 00:27:50,320 que nada más viene de los dedos del humano. EOF. Final del archivo. 450 00:27:50,320 --> 00:27:52,600 Como acotación al margen, si alguna vez te has golpeado el control d en el teclado, 451 00:27:52,600 --> 00:27:54,680 No es que usted tendría todavía, usted ha golpeado control c. 452 00:27:54,680 --> 00:27:57,920 Pero el control d envía este especial EOF constante llamada. 453 00:27:57,920 --> 00:28:03,100 >> Así que ahora sólo nos queda un poco de asignación de memoria dinámica. 454 00:28:03,100 --> 00:28:06,460 Así que si n + 1> la capacidad, ahora voy a explicar n. 455 00:28:06,460 --> 00:28:09,380 n es simplemente cuántos bytes se encuentran actualmente en el búfer, 456 00:28:09,380 --> 00:28:11,970 la cadena que se está construyendo en la actualidad por parte del usuario. 457 00:28:11,970 --> 00:28:16,240 Si usted tiene más personajes en el búfer de lo que tiene la capacidad de la memoria intermedia, 458 00:28:16,240 --> 00:28:20,760 intuitivamente, lo que tenemos que hacer entonces es asignar más capacidad. 459 00:28:20,760 --> 00:28:24,490 Voy a pasar rozando algunas de las operaciones aritméticas aquí 460 00:28:24,490 --> 00:28:26,900 y centrarse sólo en esta función aquí. 461 00:28:26,900 --> 00:28:29,170 ¿Sabes lo que malloc es, o por lo menos familiarizados general. 462 00:28:29,170 --> 00:28:32,380 Adivina lo que realloc hace. [Respuesta Estudiantil, ininteligible] 463 00:28:32,380 --> 00:28:35,690 Sí >>. Y no es bastante la adición de memoria, sino que reasigna la memoria de la siguiente manera: 464 00:28:35,690 --> 00:28:40,530 Si todavía hay espacio en el extremo de la cuerda para que dure más de que la memoria 465 00:28:40,530 --> 00:28:43,370 de lo que originalmente le da, entonces usted conseguirá que la memoria adicional. 466 00:28:43,370 --> 00:28:46,640 Así que usted puede poner las cadenas de caracteres espalda con espalda a espalda con espalda. 467 00:28:46,640 --> 00:28:49,290 Pero si ese no es el caso, ya que esperó demasiado tiempo 468 00:28:49,290 --> 00:28:51,700 y tiene algo aleatorio se dejó caer en memoria allí, pero no es extra 469 00:28:51,700 --> 00:28:56,480 memoria aquí, eso está bien. Realloc va a hacer todo el trabajo pesado para usted, 470 00:28:56,480 --> 00:28:58,810 mover la cadena ha leído hasta ahora de aquí, 471 00:28:58,810 --> 00:29:02,550 lo dejó allí, y luego le dan la pista un poco más en ese punto. 472 00:29:02,550 --> 00:29:05,610 Así que con un gesto de la mano, déjame decir que lo que está haciendo GetString 473 00:29:05,610 --> 00:29:09,540 se está comenzando con un buffer pequeño, tal vez un solo carácter, 474 00:29:09,540 --> 00:29:12,300 y si el usuario escribe en 2 caracteres, GetString termina 475 00:29:12,300 --> 00:29:15,210 llamando realloc y dice: "Oh, un personaje no era suficiente. 476 00:29:15,210 --> 00:29:18,480 Dame 2 caracteres. Entonces, si usted lee a través de la lógica del bucle, 477 00:29:18,480 --> 00:29:21,070 que va a decir, 'Oh, el usuario escribió en 3 caracteres. 478 00:29:21,070 --> 00:29:25,690 Dame ahora no 2, sino 4 caracteres, entonces dame 8, entonces dame 16 y 32. 479 00:29:25,690 --> 00:29:28,180 El hecho de que estoy doblando la capacidad cada vez 480 00:29:28,180 --> 00:29:30,320 significa que el buffer no va a crecer lentamente. 481 00:29:30,320 --> 00:29:35,870 Va a crecer muy rápido, y lo que podría ser la ventaja de eso? 482 00:29:35,870 --> 00:29:38,540 ¿Por qué estoy doblando el tamaño de la memoria intermedia, aunque el usuario 483 00:29:38,540 --> 00:29:41,450 sólo puede ser que necesite un personaje extra del teclado? 484 00:29:41,450 --> 00:29:44,830 [Estudiante respuesta ininteligible]. >> ¿Qué es eso? 485 00:29:44,830 --> 00:29:46,750 Exactamente. Usted no tiene que crecer con tanta frecuencia. 486 00:29:46,750 --> 00:29:48,870 Y esto es sólo una especie de - usted está de cobertura sus apuestas aquí. 487 00:29:48,870 --> 00:29:54,150 La idea es que usted no desea llamar realloc mucho, ya que tiende a ser lenta. 488 00:29:54,150 --> 00:29:56,840 Cada vez que usted le pide al sistema operativo para la memoria, como pronto veremos 489 00:29:56,840 --> 00:30:00,620 en un conjunto de problemas en el futuro, se tiende a tomar algún tiempo. 490 00:30:00,620 --> 00:30:04,980 Así que minimiza la cantidad de tiempo, incluso si usted está perdiendo un poco de espacio, tiende a ser una buena cosa. 491 00:30:04,980 --> 00:30:07,250 >> Pero si leemos a través de la parte final del GetString aquí, 492 00:30:07,250 --> 00:30:10,880 y de nuevo, la comprensión de cada línea aquí no es tan importante hoy en día. 493 00:30:10,880 --> 00:30:14,830 Pero nótese que finalmente llama a malloc nuevo, y la asigna a lo 494 00:30:14,830 --> 00:30:16,980 exactamente tantos bytes como necesita para la cadena 495 00:30:16,980 --> 00:30:21,620 y luego tira a la basura llamando libre, el búfer excesivamente grande, 496 00:30:21,620 --> 00:30:23,510 si de hecho he doblado varias veces. 497 00:30:23,510 --> 00:30:25,970 En fin, así es como GetString ha estado trabajando todo este tiempo. 498 00:30:25,970 --> 00:30:30,100 Todo lo que hace es leer un caracter a la vez una y otra vez y otra vez 499 00:30:30,100 --> 00:30:37,930 y cada vez que necesita algo de memoria adicional, le pide al sistema operativo para que al llamar realloc. 500 00:30:37,930 --> 00:30:41,660 ¿Alguna pregunta? Está bien. 501 00:30:41,660 --> 00:30:45,220 >> Un ataque. Ahora que entendemos los punteros, o por lo menos 502 00:30:45,220 --> 00:30:47,560 están cada vez más familiarizados con los punteros, 503 00:30:47,560 --> 00:30:50,020 vamos a considerar cómo el mundo entero comienza a derrumbarse 504 00:30:50,020 --> 00:30:53,160 si no alcanzas a defender contra los usuarios contradictorio, 505 00:30:53,160 --> 00:30:55,180 personas que están tratando de cortar en su sistema. 506 00:30:55,180 --> 00:31:00,260 Las personas que están tratando de robar su software eludiendo un código de registro 507 00:31:00,260 --> 00:31:02,150 que de lo contrario podría tener que escribir pulg 508 00:31:02,150 --> 00:31:04,860 Echa un vistazo a este ejemplo aquí, que es sólo el código C 509 00:31:04,860 --> 00:31:07,920 que tiene una función principal en la parte inferior, que llama a una función foo, 510 00:31:07,920 --> 00:31:12,100 y ¿qué es lo que pasa a foo? [Estudiante] Un solo argumento. 511 00:31:12,100 --> 00:31:15,660 Soltero >> argumento. Así que argv [1], lo que significa la primera palabra que el usuario escribió 512 00:31:15,660 --> 00:31:19,150 en la línea de comando después de a.out o lo que se denomina el programa. 513 00:31:19,150 --> 00:31:24,920 Así foo, en la parte superior, lleva en un char *, char *, pero es lo que? 514 00:31:24,920 --> 00:31:28,860 String. No hay nada nuevo aquí, y esa cadena es arbitrariamente ser llamado bar. 515 00:31:28,860 --> 00:31:36,090 En esta línea aquí, char c [12], en una especie de semi-Inglés técnico, lo que está haciendo esta línea? 516 00:31:36,090 --> 00:31:40,640 Matriz de -? Personajes. Dame una matriz de 12 caracteres. 517 00:31:40,640 --> 00:31:44,970 Así que podríamos llamar esto un buffer. Se denomina técnicamente c, pero en un tampón de programación 518 00:31:44,970 --> 00:31:47,890 sólo significa un montón de espacio que usted puede poner algunas cosas pulg 519 00:31:47,890 --> 00:31:49,940 >> A continuación, por último, memcpy, no hemos usado antes. 520 00:31:49,940 --> 00:31:52,380 Pero que es fácil adivinar lo que hace. Copia de la memoria. 521 00:31:52,380 --> 00:31:58,790 ¿Qué hacer? Bueno, al parecer copia bar, su entrada, en c, 522 00:31:58,790 --> 00:32:03,420 pero sólo hasta la longitud de la barra. 523 00:32:03,420 --> 00:32:07,440 Pero hay un error aquí. 524 00:32:07,440 --> 00:32:14,500 Bueno, por lo que técnicamente debería hacer strlen (bar) x sizeof (char), eso es correcto. 525 00:32:14,500 --> 00:32:17,920 Pero en el peor de los casos aquí, vamos a suponer que eso es - así, está bien. 526 00:32:17,920 --> 00:32:23,760 Entonces hay dos errores. Así sizeof (char), está bien, vamos a hacer esto un poco más. 527 00:32:23,760 --> 00:32:28,860 Así que ahora que todavía hay un error, que es lo que? 528 00:32:28,860 --> 00:32:31,630 [Respuesta Estudiantil, ininteligible] >> ver para qué? Bueno, por lo que debe comprobar 529 00:32:31,630 --> 00:32:35,010 NULL, porque las cosas malas suceden cuando el puntero es NULL, 530 00:32:35,010 --> 00:32:38,490 Debido a que usted puede ser que termine encima de ir allí, y no siempre se va a NULL 531 00:32:38,490 --> 00:32:40,890 por eliminación de referencias con el operador *. 532 00:32:40,890 --> 00:32:45,250 Así que eso es bueno, ¿y qué más vamos a hacer? Lógicamente hay un error aquí. 533 00:32:45,250 --> 00:32:47,650 [Respuesta Estudiantil, ininteligible] 534 00:32:47,650 --> 00:32:51,340 A fin de comprobar si >> argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Bueno, por lo que hay tres errores en este programa. 536 00:32:54,130 --> 00:33:00,080 No estamos comprobando si el usuario realmente escribió en nada en argv [1], bueno. 537 00:33:00,080 --> 00:33:02,240 ¿Cuál es el error tercera? ¿Sí? 538 00:33:02,240 --> 00:33:04,420 [Respuesta Estudiantil, ininteligible] >> Bien. 539 00:33:04,420 --> 00:33:09,590 Así que nos registramos un escenario. Hemos comprobado implícitamente no copiar más memoria 540 00:33:09,590 --> 00:33:12,800 que se exceda la longitud de la barra. 541 00:33:12,800 --> 00:33:15,720 Así que si la cadena que el usuario escribió en es de 10 caracteres de longitud, 542 00:33:15,720 --> 00:33:18,260 esto nos dice: "Sólo copiar 10 caracteres. 543 00:33:18,260 --> 00:33:21,140 Y eso está bien, pero ¿qué pasa si el usuario escribió en una palabra en el indicador 544 00:33:21,140 --> 00:33:29,360 como una palabra de 20 caracteres, lo que es, diciendo copia 20 caracteres de barra en qué? 545 00:33:29,360 --> 00:33:32,840 c, también conocido como nuestro buffer, lo que significa que acabas de escribir datos 546 00:33:32,840 --> 00:33:35,950 a 8 lugares byte que usted no es dueño, 547 00:33:35,950 --> 00:33:38,320 y no los poseen en el sentido de que nunca se les asignan. 548 00:33:38,320 --> 00:33:41,190 Así que esto es lo que se conoce generalmente como el ataque de desbordamiento de búfer, 549 00:33:41,190 --> 00:33:46,650 o buffer overrun ataque y ataque, en el sentido de que si el usuario 550 00:33:46,650 --> 00:33:50,650 o el programa que está llamando a su función está haciendo esto con malicia, 551 00:33:50,650 --> 00:33:53,780 lo que realmente sucede a continuación podría ser muy malo. 552 00:33:53,780 --> 00:33:55,690 >> Vamos a echar un vistazo a esta foto aquí. 553 00:33:55,690 --> 00:33:59,070 Este cuadro representa la pila de memoria. 554 00:33:59,070 --> 00:34:01,050 Y recordar que cada vez que se llama a una función, 555 00:34:01,050 --> 00:34:04,520 recibe este pequeño marco en la pila y luego otra y luego otra y luego otra. 556 00:34:04,520 --> 00:34:07,250 Y hasta ahora hemos sólo un poco abstraído estas lejos como rectángulos 557 00:34:07,250 --> 00:34:09,380 o bien hay en la pizarra o en la pantalla aquí. 558 00:34:09,380 --> 00:34:12,219 Pero si nos centramos en uno de esos rectángulos, 559 00:34:12,219 --> 00:34:16,460 cuando se llama a una función foo, resulta que hay más en la pila 560 00:34:16,460 --> 00:34:18,739 dentro de ese marco y rectángulo que 561 00:34:18,739 --> 00:34:23,370 que apenas x e y y a y b, como lo hicimos hablando de swap. 562 00:34:23,370 --> 00:34:25,949 Resulta que hay algunos detalles de nivel inferior, 563 00:34:25,949 --> 00:34:27,780 entre ellos la dirección de retorno. 564 00:34:27,780 --> 00:34:33,020 Así que resulta cuando principal llama foo, el principal tiene que informar foo 565 00:34:33,020 --> 00:34:36,760 cuál es la dirección principal está en la memoria de la computadora. 566 00:34:36,760 --> 00:34:40,659 Porque de lo contrario, tan pronto como foo se hace ejecutar, como en este caso aquí, 567 00:34:40,659 --> 00:34:43,790 una vez que llegue a este corchete cerca al final de foo, 568 00:34:43,790 --> 00:34:48,860 cómo diablos se sabe foo donde el control del programa se supone que debe ir? 569 00:34:48,860 --> 00:34:52,460 Resulta que la respuesta a esa pregunta es en ese rectángulo rojo aquí. 570 00:34:52,460 --> 00:34:56,130 Esto representa un puntero, y le toca a la computadora para almacenar, temporalmente, 571 00:34:56,130 --> 00:35:00,250 en la pila de llamada de la dirección principal, de modo que tan pronto como foo se hace ejecutar, 572 00:35:00,250 --> 00:35:04,110 el equipo sabe dónde y qué línea principal para volver. 573 00:35:04,110 --> 00:35:06,900 Guardado puntero marco relaciona de manera similar a esto. 574 00:35:06,900 --> 00:35:09,620 Bar Char * aquí representa qué? 575 00:35:09,620 --> 00:35:14,740 Bueno, ahora este segmento azul aquí es foo marco, ¿cuál es bar? 576 00:35:14,740 --> 00:35:18,300 Bueno, por lo bar es sólo el argumento de la función foo. 577 00:35:18,300 --> 00:35:20,720 >> Así que ahora estamos de vuelta en el cuadro familiar. 578 00:35:20,720 --> 00:35:22,960 Hay más cosas y más distracciones en la pantalla 579 00:35:22,960 --> 00:35:27,490 pero este segmento de color azul claro es lo que hemos estado dibujando en la pizarra para algo como swap. 580 00:35:27,490 --> 00:35:31,890 Ese es el marco para foo y lo único en que en este momento es bar, 581 00:35:31,890 --> 00:35:34,630 que es este parámetro. 582 00:35:34,630 --> 00:35:39,840 Pero lo que más debería estar en la pila, de acuerdo con este código aquí? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Así que también debemos ver 12 cuadros de la memoria, 584 00:35:44,280 --> 00:35:46,260 asignado a una variable llamada c. 585 00:35:46,260 --> 00:35:48,340 Y, de hecho tenemos que en la pantalla. 586 00:35:48,340 --> 00:35:51,650 La parte superior hay c [0], y entonces el autor de este diagrama 587 00:35:51,650 --> 00:35:55,130 no se molestó en dibujar todas las plazas pero en realidad hay 12 hay 588 00:35:55,130 --> 00:36:00,120 porque si nos fijamos en la parte inferior derecha, c [11], si contamos desde 0, es de 12 bytes mismas. 589 00:36:00,120 --> 00:36:06,190 Pero aquí está el problema: ¿En qué dirección se c creciendo? 590 00:36:06,190 --> 00:36:10,390 Ordenar de arriba hacia abajo, ¿no? Si se inicia en la parte superior y crece hacia el fondo, 591 00:36:10,390 --> 00:36:13,480 no parece que nos dejó la pista mucho aquí en absoluto. 592 00:36:13,480 --> 00:36:15,320 Hemos clase de nosotros mismos pintado en una esquina, 593 00:36:15,320 --> 00:36:20,210 y que c [11] es justo contra bar, que está justo en contra puntero del marco de pila, 594 00:36:20,210 --> 00:36:23,800 que es justo en contra la dirección del remitente, hay espacio más. 595 00:36:23,800 --> 00:36:26,100 Entonces, ¿cuál es la implicación, entonces, si metes la pata, 596 00:36:26,100 --> 00:36:30,460 y se intenta leer 20 bytes en un búfer de 12 bytes? 597 00:36:30,460 --> 00:36:33,460 ¿Dónde están esos 8 bytes adicionales va a ir? 598 00:36:33,460 --> 00:36:36,370 Dentro de todo lo demás, algunos de los cuales es súper importante. 599 00:36:36,370 --> 00:36:40,480 Y lo más importante, potencialmente, es el cuadro rojo ahí, la dirección del remitente. 600 00:36:40,480 --> 00:36:44,720 Porque supongo que usted es ya sea accidental o de contradicción 601 00:36:44,720 --> 00:36:48,040 sobrescribir esos 4 bytes, que se ocupan de puntero, 602 00:36:48,040 --> 00:36:53,190 no sólo con la basura, pero con un número que pasa a representar una dirección real en la memoria? 603 00:36:53,190 --> 00:36:55,930 ¿Cuál es la implicaiton, lógicamente? 604 00:36:55,930 --> 00:36:59,080 [Respuestas de los estudiantes, ininteligible] >> Exactamente. Cuando regresa foo 605 00:36:59,080 --> 00:37:03,560 y éxitos que corchete, el programa se va a proceder para no volver al menú principal, 606 00:37:03,560 --> 00:37:08,320 que va a volver a lo que la dirección está en esa caja roja. 607 00:37:08,320 --> 00:37:11,560 >> Ahora bien, en el caso del registro de software eludir, 608 00:37:11,560 --> 00:37:14,400 ¿cuál es la dirección que está siendo devuelto a la función se 609 00:37:14,400 --> 00:37:18,820 que normalmente se llama después de haber pagado por el software y los introduce tu código de registro? 610 00:37:18,820 --> 00:37:23,160 Usted puede ordenar truco de la computadora en no ir aquí, pero en su lugar, ir aquí. 611 00:37:23,160 --> 00:37:27,950 O, si eres realmente inteligente, un adversario realmente puede escribir en el teclado, 612 00:37:27,950 --> 00:37:32,500 por ejemplo, no es una palabra real, los personajes no 20, pero supongo que él o ella 613 00:37:32,500 --> 00:37:36,200 en algunos tipos de caracteres que representan el código? 614 00:37:36,200 --> 00:37:38,860 Y no va a ser el código C, que va a ser los personajes 615 00:37:38,860 --> 00:37:42,920 que representan los códigos binarios de máquinas, 0 y 1. 616 00:37:42,920 --> 00:37:46,740 Pero supongamos que eres lo suficientemente inteligente como para hacer eso, para pegar de alguna manera en el símbolo del sistema GetString 617 00:37:46,740 --> 00:37:49,460 algo que es esencialmente el código compilado, 618 00:37:49,460 --> 00:37:56,900 y los últimos 4 bytes que sobrescribir la dirección del remitente, y qué dirección lo hace de entrada? 619 00:37:56,900 --> 00:38:01,860 Se almacena en este rectángulo rojo la dirección del primer byte de la memoria intermedia. 620 00:38:01,860 --> 00:38:04,270 Así que hay que ser muy inteligente, y esto es un montón de prueba y error 621 00:38:04,270 --> 00:38:08,500 para la gente mala por ahí, pero, si se puede saber qué tan grande es este tampón 622 00:38:08,500 --> 00:38:12,170 de manera que los últimos bytes de la entrada que se proporcionan con el programa 623 00:38:12,170 --> 00:38:15,970 pasar a ser equivalente a la dirección de inicio de la memoria intermedia, 624 00:38:15,970 --> 00:38:22,270 usted puede hacer esto. Si decimos, por lo general, hola, y \ 0, eso es lo que termina en el búfer. 625 00:38:22,270 --> 00:38:27,860 Pero si eres más inteligente, y llenar el buffer con lo que genéricamente llamaremos código de ataque, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: Atacar, atacar, atacar y atacar, cuando esto es algo que hace algo malo. 627 00:38:31,920 --> 00:38:35,190 Bueno, ¿qué pasa si eres realmente inteligente, puede hacer lo siguiente: 628 00:38:35,190 --> 00:38:41,740 En el cuadro rojo aquí es una secuencia de números: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Tenga en cuenta que que coincide con el número que está aquí arriba. 630 00:38:44,890 --> 00:38:47,280 Está en orden inverso, pero más de eso en otro momento. 631 00:38:47,280 --> 00:38:51,430 Tenga en cuenta que esta dirección de retorno se hayan modificado 632 00:38:51,430 --> 00:38:54,970 para igualar la dirección de aquí, no la dirección de la principal. 633 00:38:54,970 --> 00:39:00,170 Así que si el malo de la película es súper inteligente, él o ella va a incluir en ese código de ataque 634 00:39:00,170 --> 00:39:02,890 algo así como, 'Eliminar todos los archivos del usuario. 635 00:39:02,890 --> 00:39:06,320 O 'Copiar las contraseñas ", o" Crear una cuenta de usuario que puede iniciar sesión en. 636 00:39:06,320 --> 00:39:10,130 Nada en absoluto, y esto es a la vez el peligro y el poder de la C. 637 00:39:10,130 --> 00:39:12,900 Debido a que tiene acceso a la memoria a través de punteros 638 00:39:12,900 --> 00:39:15,950 y por lo tanto se puede escribir lo que quiera en la memoria de una computadora. 639 00:39:15,950 --> 00:39:19,290 Usted puede hacer que un equipo hacer lo que quieras con sólo 640 00:39:19,290 --> 00:39:22,780 haberlo saltar dentro de su propio espacio de memoria. 641 00:39:22,780 --> 00:39:27,230 Y así, hasta la fecha, por lo que muchos programas y sitios web internacionales de tantos que están comprometidos 642 00:39:27,230 --> 00:39:29,730 se reducen a las personas que toman ventaja de esto. 643 00:39:29,730 --> 00:39:32,510 Y esto puede parecer un ataque super-sofisticada, 644 00:39:32,510 --> 00:39:34,220 pero no siempre comienza de esa manera. 645 00:39:34,220 --> 00:39:36,770 >> La realidad es que lo que la gente mala suele hacer es, 646 00:39:36,770 --> 00:39:41,470 si se trata de un programa en una línea de comandos o un programa de interfaz gráfica de usuario o una página web, 647 00:39:41,470 --> 00:39:43,290 Se acaba de empezar a proporcionar una tontería. 648 00:39:43,290 --> 00:39:46,940 Usted escribe en una palabra muy grande en el campo de búsqueda y pulsa enter, 649 00:39:46,940 --> 00:39:49,030 y esperar a ver si se bloquea el sitio web. 650 00:39:49,030 --> 00:39:53,270 O esperar a ver si el programa se manifiesta algún mensaje de error. 651 00:39:53,270 --> 00:39:55,480 Porque si tienes suerte, ya que el malo de la película, 652 00:39:55,480 --> 00:39:59,610 y proporcionar alguna entrada loco que bloquea el programa, 653 00:39:59,610 --> 00:40:02,280 eso significa que el programador no previó su mal comportamiento 654 00:40:02,280 --> 00:40:05,420 lo que significa que probablemente pueda, con el suficiente esfuerzo, 655 00:40:05,420 --> 00:40:09,870 suficiente juicio y error, encontrar la manera de librar un ataque más preciso. 656 00:40:09,870 --> 00:40:15,900 Así que una parte tan importante de la seguridad no es sólo evitar estos ataques por completo, pero su detección 657 00:40:15,900 --> 00:40:20,250 y en realidad mirando logs y ver lo que la gente loca entradas tecleadas en su sitio web. 658 00:40:20,250 --> 00:40:26,040 ¿Qué términos de búsqueda y la gente escribe en su página web con la esperanza de algún desbordamiento buffer? 659 00:40:26,040 --> 00:40:28,900 Y todo esto se reduce a lo básico sencillas de lo que es una matriz, 660 00:40:28,900 --> 00:40:32,510 y ¿qué significa para asignar y utilizar la memoria? 661 00:40:32,510 --> 00:40:34,920 Y relacionado con eso, también, es la siguiente. 662 00:40:34,920 --> 00:40:37,520 >> Así que vamos a echar un vistazo en el interior de un disco duro nuevo. 663 00:40:37,520 --> 00:40:40,190 Por lo que recuerdo de una o dos semanas atrás, que al arrastrar archivos 664 00:40:40,190 --> 00:40:45,470 a la papelera de reciclaje o bote de basura, ¿qué pasa? 665 00:40:45,470 --> 00:40:47,850 [Estudiante] Nada. >> Sí, absolutamente nada. Finalmente, si se ejecuta bajo 666 00:40:47,850 --> 00:40:51,370 espacio en disco, Windows o Mac OS comenzará a eliminar archivos por usted. 667 00:40:51,370 --> 00:40:53,670 Pero si arrastra algo allí, entonces no es en absoluto seguro. 668 00:40:53,670 --> 00:40:56,550 Todo miembro de su compañero de cuarto, un amigo o familiar tiene que hacer es doble clic, y listo. 669 00:40:56,550 --> 00:40:59,720 No todos los archivos incompletos que trataron de borrar. 670 00:40:59,720 --> 00:41:02,840 Así que la mayoría de nosotros por lo menos saber que usted tiene que hacer clic derecho o control clic 671 00:41:02,840 --> 00:41:05,320 y vaciar la basura, o algo por el estilo. 672 00:41:05,320 --> 00:41:07,900 Pero incluso entonces, que no acaba de hacer el truco. 673 00:41:07,900 --> 00:41:11,340 Porque lo que sucede cuando se tiene un archivo en el disco duro 674 00:41:11,340 --> 00:41:14,590 que representa algún procesador de texto o JPEG poco? 675 00:41:14,590 --> 00:41:18,820 Y esto representa el disco duro, y digamos que esta astilla aquí representa ese archivo, 676 00:41:18,820 --> 00:41:21,640 y se compone de un montón de 0 y 1. 677 00:41:21,640 --> 00:41:25,470 ¿Qué sucede cuando usted no sólo arrastrar el archivo a la papelera o papelera de reciclaje, 678 00:41:25,470 --> 00:41:30,390 pero también vaciarlo? 679 00:41:30,390 --> 00:41:32,820 Una especie de nada. No hay absolutamente nada ahora. 680 00:41:32,820 --> 00:41:37,630 Ahora es simplemente nada, porque un poco de algo que ocurre en la forma de esta mesa. 681 00:41:37,630 --> 00:41:41,170 Así que hay una especie de base de datos o tabla dentro de la memoria de una computadora 682 00:41:41,170 --> 00:41:44,470 que esencialmente tiene 1 columna para los nombres de archivos, 683 00:41:44,470 --> 00:41:50,550 y una columna para la ubicación del archivo, donde esto podría ser la ubicación 123, un número al azar. 684 00:41:50,550 --> 00:41:58,270 Así que podríamos tener algo como x.jpg y la ubicación 123. 685 00:41:58,270 --> 00:42:02,870 ¿Y qué pasa entonces, al vaciar la papelera? 686 00:42:02,870 --> 00:42:06,720 Que se vayan. Pero lo que no desaparece es del 0 y el 1. 687 00:42:06,720 --> 00:42:09,690 >> Entonces, ¿qué es, entonces, la conexión al conjunto de procesadores 4? 688 00:42:09,690 --> 00:42:13,460 Bueno, con el conjunto de procesadores 4, sólo porque hemos borrado accidentalmente 689 00:42:13,460 --> 00:42:15,890 la tarjeta flash compacta que tenía todas estas fotos, 690 00:42:15,890 --> 00:42:18,710 o simplemente porque la mala suerte se corrompió, 691 00:42:18,710 --> 00:42:21,170 no quiere decir que el 0 y el de 1 no están todavía allí. 692 00:42:21,170 --> 00:42:23,920 Tal vez algunos de ellos se han perdido porque algo se corrompe 693 00:42:23,920 --> 00:42:26,530 en el sentido de que algunos de 0 convirtió en 1 y la de 1 se convirtió en 0. 694 00:42:26,530 --> 00:42:30,460 Las cosas malas pueden suceder a causa de software defectuoso o hardware defectuoso. 695 00:42:30,460 --> 00:42:33,510 Pero muchos de esos bits, tal vez incluso el 100% de ellos todavía están allí, 696 00:42:33,510 --> 00:42:38,330 lo que pasa es que el ordenador o la cámara no sabe dónde comenzó JPEG 1 697 00:42:38,330 --> 00:42:41,660 y donde JPEG 2 comenzó, pero si usted, el programador, 698 00:42:41,660 --> 00:42:45,800 sabes, con un poco de sentido común, donde los archivos JPEG o lo que parecen, 699 00:42:45,800 --> 00:42:49,570 usted puede analizar los 0 y los 1 y decir, 'Ooh. JPEG. Ooh, JPEG. 700 00:42:49,570 --> 00:42:52,830 Usted puede escribir un programa con esencialmente un bucle for o while 701 00:42:52,830 --> 00:42:56,100 que recupera todos y cada uno de esos archivos. 702 00:42:56,100 --> 00:42:59,360 Así que la lección entonces, es comenzar "segura" borrando sus archivos 703 00:42:59,360 --> 00:43:01,720 si quieres evitar esto por completo. ¿Sí? 704 00:43:01,720 --> 00:43:06,940 [Pregunta Estudiante, ininteligible] 705 00:43:06,940 --> 00:43:11,150 >> Tener más memoria que antes - 706 00:43:11,150 --> 00:43:14,790 Oh! Buena pregunta. ¿Por qué, entonces, después de vaciar la basura, 707 00:43:14,790 --> 00:43:18,300 El ordenador le dirá que usted tiene más espacio libre que antes? 708 00:43:18,300 --> 00:43:22,450 En pocas palabras, porque está mintiendo. Más técnicamente, usted tiene más espacio. 709 00:43:22,450 --> 00:43:26,720 Porque ahora que has dicho, puedes poner otras cosas en ese archivo una vez fue, 710 00:43:26,720 --> 00:43:28,930 pero eso no significa que los bits van a desaparecer, 711 00:43:28,930 --> 00:43:33,070 y eso no significa que los bits se están cambiando todos los 0, por ejemplo, para su protección. 712 00:43:33,070 --> 00:43:37,520 Por el contrario, si "segura" borrar archivos, o destruir físicamente el dispositivo, 713 00:43:37,520 --> 00:43:40,810 que realmente es la única manera, a veces, alrededor de eso. 714 00:43:40,810 --> 00:43:45,300 Así que ¿por qué no nos vamos en esa nota semi-miedo, y nos vemos el lunes. 715 00:43:45,300 --> 00:43:52,810 CS50.TV