1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [TUẦN 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Đại học Harvard] 3 00:00:04,760 --> 00:00:11,990 [Đây là CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Woman] Ông đang nói dối về những gì, tôi không biết. 5 00:00:17,780 --> 00:00:20,300 [Man] Vì vậy, chúng ta biết gì? 6 00:00:20,300 --> 00:00:24,120 [Woman] Đó at 9:15, Ray Santoya là tại máy ATM. 7 00:00:24,120 --> 00:00:27,420 [Man] Vì vậy, câu hỏi là, ông đã làm gì at 9:16? 8 00:00:27,420 --> 00:00:29,980 [Woman] Bắn súng mm 9 tại một cái gì đó. 9 00:00:29,980 --> 00:00:31,900 Có lẽ ông đã nhìn thấy bắn tỉa. 10 00:00:31,900 --> 00:00:34,000 [Man] Hoặc ông đang làm việc với anh ta. 11 00:00:34,000 --> 00:00:36,330 [Woman] Chờ. Trở lại một. 12 00:00:36,330 --> 00:00:38,330 [Man] Bạn thấy gì? 13 00:00:38,330 --> 00:00:44,520 [♫ hồi hộp âm nhạc ♫] 14 00:00:44,520 --> 00:00:48,320 [Woman] Mang theo khuôn mặt của mình lên. Toàn màn hình. 15 00:00:48,320 --> 00:00:51,230 [Man] kính của ông. >> Có một sự phản ánh. 16 00:00:51,230 --> 00:01:00,810 [♫ hồi hộp âm nhạc ♫] 17 00:01:00,810 --> 00:01:03,580 [Man] Đó là đội bóng chày của Nuevita. Đó là logo của họ. 18 00:01:03,580 --> 00:01:07,790 [Woman] Và anh ấy nói chuyện với bất cứ ai mặc chiếc áo khoác. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Vì vậy, đây là CS50 tuần 5, và hôm nay chúng tôi làm hỏng cả một chút của truyền hình và phim cho bạn. 20 00:01:13,730 --> 00:01:16,170 Vì vậy, bất cứ khi nào bạn đang xem một chương trình như thế này ở đây, 21 00:01:16,170 --> 00:01:19,910 và cảnh sát cho biết: "Bạn có thể làm sạch mà lên?" hoặc "Tăng cường," 22 00:01:19,910 --> 00:01:21,900 không có tăng cường trong thế giới thực. 23 00:01:21,900 --> 00:01:25,220 Trong thực tế, những gì bạn thực sự có được một chút gì đó như thế này. 24 00:01:25,220 --> 00:01:27,570 Tôi đã kéo lên một trong những hình ảnh nhân viên từ trang. 25 00:01:27,570 --> 00:01:30,980 Đây là một chương trình được gọi là Photoshop. Đây là 1 của 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 của 3 Bowdens trên thực tế, ngày hôm nay, bởi vì chúng tôi có bà Bowden ở đây là tốt, với Rob và Paul. 27 00:01:36,300 --> 00:01:41,950 Nhưng đây là Rob trên màn hình, và nếu chúng ta phóng to vào đó ánh nhìn ông luôn luôn có trong mắt ông, 28 00:01:41,950 --> 00:01:47,600 những gì bạn thực sự thấy là những gì bạn thấy là những gì bạn nhận được. 29 00:01:47,600 --> 00:01:51,690 Đây là "nâng cao", vì vậy "CSI" có nó một chút sai. 30 00:01:51,690 --> 00:01:55,190 Có một clip, nếu chúng ta có thể chọn "CSI" lâu hơn một chút. 31 00:01:55,190 --> 00:01:58,500 Điều này là một cụm từ tốt đẹp thốt ra từ nay trở đi nếu bạn muốn 32 00:01:58,500 --> 00:02:10,280 âm thanh kỹ thuật với bạn bè của bạn khi nào, thực sự, bạn đang nói hoàn toàn không có gì. 33 00:02:10,280 --> 00:02:12,970 >> [Man] tuần, tôi đã điều tra các vụ giết người killer cabby 34 00:02:12,970 --> 00:02:15,360 với một niềm đam mê bệnh hoạn nhất định. 35 00:02:15,360 --> 00:02:17,160 [Woman # 1] Đây là trong thời gian thực. 36 00:02:17,160 --> 00:02:22,930 [Woman # 2] Tôi sẽ tạo ra một giao diện GUI bằng cách sử dụng Visual Basic, xem nếu tôi có thể theo dõi một địa chỉ IP. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Vì vậy, âm thanh đồng bộ sang một bên, tạo ra một giao diện GUI bằng cách sử dụng Visual Basic 38 00:02:29,570 --> 00:02:31,820 để theo dõi một địa chỉ IP là hoàn toàn vô nghĩa. 39 00:02:31,820 --> 00:02:33,840 Những ngày này bạn sẽ không sử dụng Visual Basic, 40 00:02:33,840 --> 00:02:38,920 không có nhu cầu cho một giao diện, và địa chỉ IP là một thuật ngữ kỹ thuật chính xác. 41 00:02:38,920 --> 00:02:41,730 Vì vậy, giữ một mắt ra cho các, và một trong những mục yêu thích của tôi: 42 00:02:41,730 --> 00:02:45,070 Điều này là một chút phức tạp hơn, bởi vì bạn cần phải biết một ngôn ngữ khác nhau. 43 00:02:45,070 --> 00:02:47,860 Có một ngôn ngữ được gọi là Objective-C, mà là một superset của C. 44 00:02:47,860 --> 00:02:51,960 Điều đó có nghĩa là C nó cộng với một số tính năng bổ sung, trong đó lập trình hướng đối tượng. 45 00:02:51,960 --> 00:02:55,070 Và đây là ngôn ngữ mà Apple đã phổ biến rộng rãi cho iOS lập trình. 46 00:02:55,070 --> 00:02:58,760 Và vì vậy đây là một đoạn trích từ một chương trình hoàn toàn khác nhau, từ "số" 47 00:02:58,760 --> 00:03:02,450 rằng nếu bạn thực sự xem xét chặt chẽ trên TiVo của bạn và tạm dừng đúng lúc, 48 00:03:02,450 --> 00:03:07,700 bạn sẽ thấy rằng những gì họ đang nhìn vào không phải là khá những gì được mô tả. 49 00:03:07,700 --> 00:03:11,170 Và hãy để tôi thử một kết nối âm thanh khác nhau ở đây và xem nếu chúng ta không thể 50 00:03:11,170 --> 00:03:13,780 giữ cho âm thanh đồng bộ thời gian này. 51 00:03:13,780 --> 00:03:20,530 Tôi cung cấp cho bạn "Numbers." 52 00:03:20,530 --> 00:03:23,240 >> [Man # 1] Đó là một 32-bit địa chỉ IPv4. 53 00:03:23,240 --> 00:03:38,930 [Man # 2] IP, đó là Internet. >> Mạng riêng. Đó là mạng riêng của Anita. 54 00:03:38,930 --> 00:03:43,810 [Malan] Okay. Đây là Objective-C, và nó cho chương trình màu của một số đứa trẻ, 55 00:03:43,810 --> 00:03:51,140 như bạn có lẽ có thể suy ra từ tên của biến đó. 56 00:03:51,140 --> 00:03:54,410 Vì vậy mà, sau đó, là "số". Vì vậy, ngày hôm nay và trong tuần này chúng tôi giới thiệu 57 00:03:54,410 --> 00:03:57,740 một chút của thế giới pháp y và bối cảnh trong những vấn đề do đó. 58 00:03:57,740 --> 00:04:00,590 Hôm nay sẽ là một bài giảng được viết tắt bởi vì có một sự kiện đặc biệt ở đây 59 00:04:00,590 --> 00:04:05,530 sau đó, do đó, chúng tôi sẽ mất một peek, và trêu chọc cả hai sinh viên và phụ huynh cũng như hôm nay 60 00:04:05,530 --> 00:04:07,420 với một số trong những điều mà trên đường chân trời. 61 00:04:07,420 --> 00:04:12,240 Trong số đó, là thứ hai, bạn sẽ có thêm một vài người bạn cùng lớp. 62 00:04:12,240 --> 00:04:16,050 Edx, Harvard và sáng kiến ​​MITs trực tuyến mới để mở chương trình học 63 00:04:16,050 --> 00:04:19,120 và nhiều hơn nữa, được tung ra trong khuôn viên trường Đại học Harvard vào thứ hai. 64 00:04:19,120 --> 00:04:21,490 Có nghĩa là thứ hai, bạn sẽ phải là số gần đây nhất, 65 00:04:21,490 --> 00:04:26,210 86.000 bạn học bổ sung sẽ được sau đây cùng với các bài giảng CS50 66 00:04:26,210 --> 00:04:29,170 và các bộ phận và walkthroughs và bộ vấn đề. 67 00:04:29,170 --> 00:04:32,350 Và như là một phần của điều này, bạn sẽ trở thành thành viên của lớp khai mạc 68 00:04:32,350 --> 00:04:35,090 CS50 và bây giờ CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Là một phần của điều này, bây giờ, nhận ra rằng sẽ có một số mặt tích cực như. 70 00:04:39,310 --> 00:04:43,790 Để chuẩn bị sẵn sàng cho điều này, số lượng lớn các sinh viên, 71 00:04:43,790 --> 00:04:47,180 nó đủ để nói rằng mặc dù chúng ta có 108 TFs và CA, 72 00:04:47,180 --> 00:04:50,790 không hoàn toàn tỷ lệ học sinh / giáo viên tốt nhất một khi chúng ta đạt 80.000 học sinh khác. 73 00:04:50,790 --> 00:04:52,850 Vì vậy, chúng tôi sẽ không được phân loại vấn đề rất nhiều thiết lập bằng tay. 74 00:04:52,850 --> 00:04:55,920 Vì vậy, giới thiệu tuần này trong bộ vấn đề sẽ là CS50 tra, 75 00:04:55,920 --> 00:04:58,450 đó là sẽ là một tiện ích dòng lệnh trong thiết bị 76 00:04:58,450 --> 00:05:01,200 bạn sẽ nhận được khi bạn cập nhật nó sau này vào cuối tuần này, 77 00:05:01,200 --> 00:05:03,200 và bạn sẽ có thể chạy lệnh, kiểm tra 50, 78 00:05:03,200 --> 00:05:06,500 trên của riêng bạn pset, và bạn sẽ nhận được một số thông tin phản hồi để xem chương trình của bạn 79 00:05:06,500 --> 00:05:11,160 đúng hay sai theo thông số kỹ thuật thiết kế khác nhau mà chúng tôi đã cung cấp. 80 00:05:11,160 --> 00:05:13,580 Vì vậy, thêm vào đó và đặt vấn đề đặc điểm kỹ thuật và 81 00:05:13,580 --> 00:05:17,240 các bạn cùng lớp CS50x sẽ được sử dụng này là tốt. 82 00:05:17,240 --> 00:05:19,230 >> Vì vậy, vấn đề tập 4 là tất cả về pháp lý. 83 00:05:19,230 --> 00:05:21,940 Và tác phẩm này được lấy cảm hứng từ một số công cụ thực tế cuộc sống, 84 00:05:21,940 --> 00:05:24,620 , theo đó khi tôi học đại học, tôi thực tập trong một thời gian với 85 00:05:24,620 --> 00:05:28,650 Văn phòng Biện Lý Quận Middlesex làm công việc pháp y 86 00:05:28,650 --> 00:05:31,650 điều tra pháp y của họ chì, và những gì đạt 87 00:05:31,650 --> 00:05:35,260 , tôi nghĩ rằng tôi đã đề cập qua một vài tuần, cảnh sát nhà nước có Thánh Lễ hoặc những người khác 88 00:05:35,260 --> 00:05:39,000 sẽ đi vào, họ sẽ thả ra những thứ như ổ đĩa cứng và đĩa CD và đĩa mềm 89 00:05:39,000 --> 00:05:42,340 và như thế, và sau đó mục tiêu của cơ quan pháp y để xác định liệu 90 00:05:42,340 --> 00:05:44,600 có hoặc không phải là bằng chứng của một số loại. 91 00:05:44,600 --> 00:05:48,010 Đây là đơn vị điều tra đặc biệt, do đó, nó là tội phạm cổ trắng, 92 00:05:48,010 --> 00:05:52,350 đó là đáng lo ngại hơn loại tội phạm, 93 00:05:52,350 --> 00:05:55,990 bất cứ điều gì liên quan đến một số loại phương tiện truyền thông kỹ thuật số; chỉ ra rằng không có nhiều người 94 00:05:55,990 --> 00:05:59,370 viết một email nói rằng "tôi đã làm nó." 95 00:05:59,370 --> 00:06:03,290 Vì vậy, khá thường xuyên những tìm kiếm này pháp y không bật lên tất cả những gì nhiều hoa trái, 96 00:06:03,290 --> 00:06:05,850 nhưng đôi khi người viết email như vậy. 97 00:06:05,850 --> 00:06:08,490 Vì vậy, đôi khi những nỗ lực đã được khen thưởng. 98 00:06:08,490 --> 00:06:14,420 >> Nhưng dẫn đến pset pháp y này, chúng tôi sẽ được giới thiệu trong pset 4 một chút về đồ họa. 99 00:06:14,420 --> 00:06:18,260 Vì vậy, bạn có thể mất những điều này cho các cấp, JPEG, GIF và giống như những ngày này, 100 00:06:18,260 --> 00:06:21,640 nhưng nếu bạn thực sự nghĩ về nó, một hình ảnh, giống như khuôn mặt của Rob, 101 00:06:21,640 --> 00:06:24,430 có thể được mô hình hóa như một chuỗi các dấu chấm, hoặc điểm ảnh. 102 00:06:24,430 --> 00:06:26,680 Bây giờ, trong trường hợp của khuôn mặt của Rob, có tất cả các loại màu sắc, 103 00:06:26,680 --> 00:06:29,940 và chúng tôi bắt đầu nhìn thấy các dấu chấm cá nhân, otherwide được gọi là pixel, 104 00:06:29,940 --> 00:06:31,610 một khi chúng tôi bắt đầu để phóng to. 105 00:06:31,610 --> 00:06:35,590 Nhưng nếu chúng ta đơn giản hóa thế giới một chút, và chỉ nói rằng điều này ở đây là Rob 106 00:06:35,590 --> 00:06:40,560 màu đen và trắng, tốt, để đại diện cho màu đen và trắng, chúng tôi chỉ có thể sử dụng hệ nhị phân. 107 00:06:40,560 --> 00:06:44,960 Và nếu chúng ta sẽ sử dụng hệ nhị phân, 1 hoặc 0, chúng ta có thể bày tỏ cùng một hình ảnh này 108 00:06:44,960 --> 00:06:51,970 khuôn mặt tươi cười của Rob với mô hình này của các bit: 11000011 đại diện cho 109 00:06:51,970 --> 00:06:55,160 trắng, màu trắng, màu đen, màu đen, màu đen, màu đen, trắng trắng. 110 00:06:55,160 --> 00:06:59,290 Và vì vậy nó không phải là một bước nhảy vọt lớn, sau đó, để bắt đầu nói chuyện về hình ảnh đầy màu sắc. 111 00:06:59,290 --> 00:07:01,920 Những điều mà bạn sẽ thấy trên Facebook hoặc với một máy ảnh kỹ thuật số, 112 00:07:01,920 --> 00:07:04,730 , nhưng chắc chắn, khi nói đến màu sắc, bạn cần nhiều bit hơn. 113 00:07:04,730 --> 00:07:08,470 Và khá phổ biến trong thế giới của hình ảnh là sử dụng 1-bit màu, 114 00:07:08,470 --> 00:07:12,730 vì điều này cho thấy, nhưng màu 24-bit, mà bạn thực sự nhận được hàng triệu màu. 115 00:07:12,730 --> 00:07:15,430 Vì vậy, trong trường hợp khi chúng tôi thu nhỏ vào mắt của Rob, 116 00:07:15,430 --> 00:07:19,270 đó là bất kỳ số lượng hàng triệu khả năng khác nhau đầy màu sắc. 117 00:07:19,270 --> 00:07:22,260 >> Vì vậy, chúng tôi sẽ giới thiệu trong 4 bộ vấn đề cũng như trong quá trình thực hiện, 118 00:07:22,260 --> 00:07:27,050 mà sẽ được ngày hôm nay lúc 3:30 thay vì thông thường 2:30 vì bài giảng hôm thứ Sáu ở đây. 119 00:07:27,050 --> 00:07:29,930 Nhưng video sẽ được trực tuyến, như thường lệ, vào ngày mai. 120 00:07:29,930 --> 00:07:31,880 Chúng tôi cũng sẽ giới thiệu bạn đến một định dạng tập tin khác. 121 00:07:31,880 --> 00:07:34,150 Vì vậy, đây là cố ý có nghĩa là nhìn đáng sợ lúc đầu, 122 00:07:34,150 --> 00:07:38,980 nhưng điều này chỉ là một số tài liệu cho một cấu trúc C. 123 00:07:38,980 --> 00:07:42,280 Nó chỉ ra rằng Microsoft, năm trước, đã giúp phổ biến định dạng này, 124 00:07:42,280 --> 00:07:46,630 được gọi là định dạng tập tin bitmap, BMP, và đây là một siêu đơn giản, 125 00:07:46,630 --> 00:07:50,390 định dạng tập tin đồ họa đầy màu sắc đã được sử dụng trong một thời gian 126 00:07:50,390 --> 00:07:53,640 và đôi khi vẫn cho hình nền trên máy tính để bàn. 127 00:07:53,640 --> 00:07:57,410 Nếu bạn nghĩ rằng Windows XP và các ngọn đồi và bầu trời xanh, 128 00:07:57,410 --> 00:08:00,660 điển hình là BMP, hình ảnh bitmap, và bitmap 129 00:08:00,660 --> 00:08:03,340 là niềm vui đối với chúng tôi bởi vì họ có phức tạp hơn một chút. 130 00:08:03,340 --> 00:08:05,640 Nó không hoàn toàn đơn giản như lưới này của 0 và 1; 131 00:08:05,640 --> 00:08:10,680 thay vào đó, bạn có những thứ giống như một tiêu đề vào lúc bắt đầu của một tập tin. 132 00:08:10,680 --> 00:08:15,520 Vì vậy, nói cách khác, bên trong một file bmp. Là một bó toàn bộ của 0 và 1, 133 00:08:15,520 --> 00:08:18,070 nhưng có thêm một số 0 và 1 trong đó. 134 00:08:18,070 --> 00:08:21,450 Và nó chỉ ra rằng những gì chúng ta đã có thể dùng cho các cấp trong nhiều năm, 135 00:08:21,450 --> 00:08:27,040 định dạng file như doc hoặc. xls hoặc. mp3 hay mp4. 136 00:08:27,040 --> 00:08:29,910 bất cứ điều gì các định dạng tập tin mà bạn đã quen thuộc với. 137 00:08:29,910 --> 00:08:31,900 Vâng, nó những gì thậm chí có nghĩa là một định dạng tập tin? 138 00:08:31,900 --> 00:08:35,740 Bởi vì vào cuối ngày, tất cả những tập tin này, chúng tôi sử dụng có chỉ là 0 và 1 139 00:08:35,740 --> 00:08:39,950 và có thể những 0 và 1 của đại diện cho a, b, c, thông qua ASCII hoặc các loại tương tự, 140 00:08:39,950 --> 00:08:42,030 nhưng thông qua cuối ngày, nó chỉ là 0 và 1. 141 00:08:42,030 --> 00:08:45,300 >> Vì vậy, con người chỉ thỉnh thoảng quyết định để phát minh ra một định dạng tập tin mới 142 00:08:45,300 --> 00:08:49,420 nơi họ chuẩn hóa những gì các mẫu của các bit thực sự sẽ có nghĩa là. 143 00:08:49,420 --> 00:08:52,790 Và trong trường hợp này ở đây, các folks người đã thiết kế định dạng tập tin bitmap 144 00:08:52,790 --> 00:08:58,260 cho biết tại các byte đầu tiên trong một tập tin bitmap, biểu hiện bằng các bù đắp 0, ở đó, 145 00:08:58,260 --> 00:09:02,320 có sẽ có một số khó hiểu biến có tên gọi là bfType, 146 00:09:02,320 --> 00:09:06,510 mà chỉ là viết tắt của loại tập tin bitmap, loại tập tin bitmap này. 147 00:09:06,510 --> 00:09:10,780 Bạn có thể suy ra, có lẽ, từ hàng thứ hai mà bù đắp 2, byte số 2, 148 00:09:10,780 --> 00:09:15,980 có một mẫu của 0 và 1 đại diện cho những gì? 149 00:09:15,980 --> 00:09:18,320 Kích thước của một cái gì đó, và nó đi lên từ đó. 150 00:09:18,320 --> 00:09:20,660 Vì vậy, trong 4 bộ vấn đề, bạn sẽ được đi qua một số những điều này. 151 00:09:20,660 --> 00:09:24,480 >> Chúng tôi sẽ không kết thúc chăm sóc về tất cả chúng, nhưng nhận thấy nó bắt đầu trở nên thú vị 152 00:09:24,480 --> 00:09:30,780 xung quanh dòng hoặc 54 byte, rgbtBlue, xanh và đỏ. 153 00:09:30,780 --> 00:09:35,280 Nếu bạn đã từng nghe từ viết tắt RGB, màu đỏ màu xanh lá cây màu xanh, đây là một tài liệu tham khảo đó. 154 00:09:35,280 --> 00:09:37,840 Bởi vì nó chỉ ra bạn có thể vẽ tất cả các màu sắc của cầu vồng 155 00:09:37,840 --> 00:09:41,580 với một số sự kết hợp của màu đỏ và màu xanh và màu xanh lá cây. 156 00:09:41,580 --> 00:09:46,560 Và, trên thực tế, các bậc cha mẹ trong phòng có thể cho rằng một số các máy chiếu đầu tiên. 157 00:09:46,560 --> 00:09:49,360 Những ngày này, bạn chỉ nhìn thấy 1 ánh sáng chói của một ống kính. 158 00:09:49,360 --> 00:09:52,870 Tuy nhiên, trở lại trong ngày, bạn có ống kính màu đỏ, ống kính màu xanh, và ống kính màu xanh lá cây 159 00:09:52,870 --> 00:09:56,620 và họ cùng nhau nhằm vào màn hình và hình thành một bức tranh đầy màu sắc. 160 00:09:56,620 --> 00:09:59,590 Và khá thường xuyên các trường trung học và trường trung học sẽ có những thấu kính 161 00:09:59,590 --> 00:10:02,680 bao giờ-để-hơi lệch, vì vậy bạn sắp xếp nhìn thấy hình ảnh tăng gấp đôi hoặc gấp ba, 162 00:10:02,680 --> 00:10:07,500 nhưng đó là ý tưởng. Bạn đã có ánh sáng màu đỏ và màu xanh lá cây và màu xanh vẽ một bức tranh. 163 00:10:07,500 --> 00:10:09,570 Và đó là nguyên tắc tương tự được sử dụng trong máy tính. 164 00:10:09,570 --> 00:10:12,000 >> Vì vậy, sau đó, trong số những thách thức cho bạn trong vấn đề thiết lập 4 165 00:10:12,000 --> 00:10:16,080 sẽ có một vài điều, một là để thực sự thay đổi kích thước một hình ảnh. 166 00:10:16,080 --> 00:10:18,050 Để có trong một mô hình của 0 và 1, 167 00:10:18,050 --> 00:10:22,840 tìm ra khối của 0 và 1 đại diện cho những gì trong một cấu trúc như thế này, 168 00:10:22,840 --> 00:10:26,800 và sau đó tìm ra cách để tái tạo các điểm ảnh: các màu đỏ, xanh, màu xanh 169 00:10:26,800 --> 00:10:32,460 bên trong để khi hình ảnh trông như thế này ban đầu, có thể trông như thế này thay vì sau đó. 170 00:10:32,460 --> 00:10:35,590 Trong số những thách thức khác cũng vậy, là có được rằng bạn sẽ được giao cho 171 00:10:35,590 --> 00:10:38,900 một hình ảnh pháp y của một tập tin thực tế từ một máy ảnh kỹ thuật số 172 00:10:38,900 --> 00:10:42,410 và trên máy ảnh đó, một lần khi một thời gian, một bó toàn bộ hình ảnh. 173 00:10:42,410 --> 00:10:47,030 Vấn đề là, chúng tôi vô tình bị xóa hoặc có hình ảnh bị hỏng bằng cách nào đó. 174 00:10:47,030 --> 00:10:51,040 Điều xấu xảy ra với máy ảnh kỹ thuật số, và chúng tôi nhanh chóng sao chép tất cả của 0 và 1 175 00:10:51,040 --> 00:10:55,410 tắt của thẻ đó cho bạn, lưu chúng trong tập tin lớn 1, và sau đó chúng tôi sẽ giao cho bạn 176 00:10:55,410 --> 00:11:00,000 trong vấn đề thiết lập 4 để bạn có thể viết một chương trình trong C để phục hồi 177 00:11:00,000 --> 00:11:02,660 tất cả những hình ảnh JPEG, lý tưởng. 178 00:11:02,660 --> 00:11:06,280 Và nó chỉ ra rằng hình ảnh JPEG, mặc dù họ đang hơi của một định dạng tập tin phức tạp, 179 00:11:06,280 --> 00:11:09,580 họ phức tạp hơn nhiều so với khuôn mặt tươi cười này ở đây. 180 00:11:09,580 --> 00:11:14,320 Nó chỉ ra rằng JPEG đều bắt đầu với các mô hình tương tự của 0 và 1 của. 181 00:11:14,320 --> 00:11:18,820 Vì vậy, bằng cách sử dụng một vòng lặp while hoặc một cho vòng lặp hoặc tương tự, 182 00:11:18,820 --> 00:11:22,350 bạn có thể lặp qua tất cả các 0 và 1 trong hình ảnh này pháp y 183 00:11:22,350 --> 00:11:26,670 và mỗi khi bạn xem các mô hình đặc biệt được định nghĩa trong đặc điểm kỹ thuật bộ vấn đề, 184 00:11:26,670 --> 00:11:29,770 bạn có thể giả định, "Ồ, ở đây là, với xác suất rất cao, 185 00:11:29,770 --> 00:11:33,520 sự bắt đầu của một JPEG, và ngay sau khi bạn tìm thấy cùng một mô hình, 186 00:11:33,520 --> 00:11:36,050 một số số byte hoặc kilobytes hoặc MB sau, 187 00:11:36,050 --> 00:11:40,550 bạn có thể giả định, Ooh! Dưới đây là một JPEG thứ hai, các bức ảnh tôi mất sau khi một trong những người đầu tiên. 188 00:11:40,550 --> 00:11:44,720 Hãy để tôi ngừng đọc tập tin đó đầu tiên, bắt đầu viết mới này. 189 00:11:44,720 --> 00:11:49,980 Và đầu ra của chương trình của bạn cho pset 4 là có được như nhiều như 50 hình ảnh JPEG. 190 00:11:49,980 --> 00:11:52,400 Và nếu nó không phải là 50 hình ảnh JPEG, bạn có một chút của một vòng lặp. 191 00:11:52,400 --> 00:11:55,580 Nếu bạn có một số lượng vô hạn của hình ảnh JPEG, bạn có một vòng lặp vô hạn. 192 00:11:55,580 --> 00:11:58,280 Quá, do đó, sẽ là một trường hợp khá phổ biến. 193 00:11:58,280 --> 00:12:00,280 Đó là những gì trên đường chân trời. 194 00:12:00,280 --> 00:12:03,740 >> Quiz 0, phía sau chúng tôi. Nhận ra, mỗi email của tôi, lúc nào cũng có người 195 00:12:03,740 --> 00:12:06,820 cả hai, hạnh phúc loại trung lập, và buồn xung quanh bài kiểm tra thời gian 0. 196 00:12:06,820 --> 00:12:10,160 Và xin vui lòng không đến được với tôi, TFs đầu, Zamyla, TF của riêng bạn 197 00:12:10,160 --> 00:12:14,120 hoặc một trong các CA mà bạn biết nếu bạn muốn thảo luận về mọi thứ đã đi như thế nào. 198 00:12:14,120 --> 00:12:16,460 >> Vì vậy, để gây ấn tượng với phụ huynh ở đây trong phòng, 199 00:12:16,460 --> 00:12:23,990 thư viện CS50 là gì? Good job. 200 00:12:23,990 --> 00:12:32,280 Thư viện CS50 là gì? Yeah? [Câu trả lời của sinh viên, không thể hiểu] 201 00:12:32,280 --> 00:12:35,730 >> Được rồi, tốt. Vì vậy, nó là một tập hợp prewritten mã mà chúng ta, các nhân viên, đã viết, 202 00:12:35,730 --> 00:12:38,460 chúng tôi cung cấp cho bạn, để cung cấp một số chức năng thông thường. 203 00:12:38,460 --> 00:12:42,290 Những thứ có được cho tôi một chuỗi, một int, tất cả các chức năng được liệt kê ở đây. 204 00:12:42,290 --> 00:12:45,260 Bắt đầu từ bây giờ, chúng tôi bắt đầu để thực sự đi những bánh xe đào tạo. 205 00:12:45,260 --> 00:12:48,230 Vì vậy, chúng ta sẽ bắt đầu để lấy đi một "chuỗi" từ bạn, 206 00:12:48,230 --> 00:12:52,790 đó, thu hồi, chỉ là một từ đồng nghĩa cho những gì thực tế kiểu dữ liệu? char *. 207 00:12:52,790 --> 00:12:57,020 Vì vậy, đối với cha mẹ, có lẽ - đó là tốt, vì vậy char * chúng tôi sẽ bắt đầu để xem 208 00:12:57,020 --> 00:13:00,810 trên màn hình hơn khi chúng ta loại bỏ "chuỗi" từ những từ vựng của chúng tôi, 209 00:13:00,810 --> 00:13:02,760 ít nhất là khi nói đến thực sự viết code. 210 00:13:02,760 --> 00:13:06,240 Tương tự như vậy, chúng tôi sẽ ngừng sử dụng một số các chức năng này càng nhiều, 211 00:13:06,240 --> 00:13:08,390 bởi vì các chương trình của chúng tôi sẽ nhận được phức tạp hơn 212 00:13:08,390 --> 00:13:11,370 thay vì chỉ viết các chương trình mà ngồi đó với một nhấp nháy nhanh chóng, 213 00:13:11,370 --> 00:13:13,580 chờ đợi cho người sử dụng gõ một cái gì đó. 214 00:13:13,580 --> 00:13:15,220 Bạn sẽ nhận được đầu vào của bạn từ nơi khác. 215 00:13:15,220 --> 00:13:18,720 Ví dụ, bạn sẽ nhận được chúng từ một loạt các bit trên ổ đĩa cứng địa phương. 216 00:13:18,720 --> 00:13:23,340 Thay vào đó bạn sẽ nhận được trong tương lai từ một kết nối mạng, một số trang web một nơi nào đó. 217 00:13:23,340 --> 00:13:27,460 Vì vậy, hãy bóc lớp này trở lại cho lần đầu tiên, và kéo lên thiết bị CS50 218 00:13:27,460 --> 00:13:32,300 và tập tin này gọi là CS50.h, bạn đã được sắc nét kể cả trong nhiều tuần. 219 00:13:32,300 --> 00:13:34,380 >> Nhưng chúng ta hãy thực sự nhìn thấy những gì bên trong này. 220 00:13:34,380 --> 00:13:38,250 Vì vậy, trên cùng của tập tin trong màu xanh chỉ là một bó toàn bộ ý kiến, 221 00:13:38,250 --> 00:13:41,340 bảo hành thông tin và cấp giấy phép. Đây là sắp xếp của một mô hình phổ biến 222 00:13:41,340 --> 00:13:44,600 trong phần mềm, bởi vì rất nhiều phần mềm trong những ngày này là những gì được gọi là "mã nguồn mở" 223 00:13:44,600 --> 00:13:46,940 có nghĩa là ai đó đã viết mã 224 00:13:46,940 --> 00:13:50,060 và làm cho nó tự do có sẵn, không phải chỉ để chạy và sử dụng, 225 00:13:50,060 --> 00:13:53,660 nhưng thực sự đọc và thay đổi và tích hợp vào công việc của riêng bạn. 226 00:13:53,660 --> 00:13:55,790 Vì vậy, đó là những gì bạn đã sử dụng phần mềm nguồn mở, 227 00:13:55,790 --> 00:13:58,030 mặc dù trong một hình thức rất nhỏ. 228 00:13:58,030 --> 00:14:01,860 Nếu tôi di chuyển xuống qua các ý kiến, tuy nhiên, chúng tôi sẽ bắt đầu thấy một số điều quen thuộc hơn. 229 00:14:01,860 --> 00:14:08,090 Vì vậy, nhận thấy ở đầu ở đây, rằng các tập tin CS50.h bao gồm một bó toàn bộ các tập tin tiêu đề. 230 00:14:08,090 --> 00:14:11,160 Bây giờ, hầu hết trong số này chúng tôi đã không nhìn thấy trước, nhưng là một trong 231 00:14:11,160 --> 00:14:15,640 quen thuộc, mà trong số này chúng ta thấy, mặc dù một thời gian ngắn, do đó đến nay? 232 00:14:15,640 --> 00:14:18,720 Yeah, thư viện chuẩn. Stdlib.h có malloc, 233 00:14:18,720 --> 00:14:21,590 do đó, một khi chúng ta bắt đầu nói về cấp phát bộ nhớ động, 234 00:14:21,590 --> 00:14:24,960 mà chúng ta sẽ quay trở lại đến tuần sau, chúng tôi bắt đầu bao gồm các tập tin đó. 235 00:14:24,960 --> 00:14:29,660 Nó chỉ ra rằng bool và đúng và sai không thực sự tồn tại trong C, cho mỗi gia nhập, 236 00:14:29,660 --> 00:14:32,460 trừ khi bạn bao gồm tập tin này ở đây. 237 00:14:32,460 --> 00:14:35,770 Vì vậy, chúng tôi đã nhiều tuần, được bao gồm cả tiêu chuẩn bool.h 238 00:14:35,770 --> 00:14:39,020 để bạn có thể sử dụng các khái niệm của một bool, đúng hay sai 239 00:14:39,020 --> 00:14:41,830 Nếu không có điều này, bạn sẽ phải sắp xếp giả mạo nó và sử dụng một int 240 00:14:41,830 --> 00:14:45,920 và chỉ cần tùy tiện cho rằng 0 là sai và 1 là đúng. 241 00:14:45,920 --> 00:14:49,980 >> Bây giờ, nếu chúng ta di chuyển xuống thấp hơn nữa, đây là định nghĩa của chúng ta về một chuỗi. 242 00:14:49,980 --> 00:14:54,820 Hóa ra, như chúng tôi đã nói trước đây, rằng nơi * đây là không quan trọng. 243 00:14:54,820 --> 00:14:56,750 Bạn thậm chí có thể có không gian xung quanh. 244 00:14:56,750 --> 00:15:01,550 Chúng tôi, trong học kỳ này, đã được thúc đẩy như thế này để làm cho rõ ràng rằng * có để làm với các loại. 245 00:15:01,550 --> 00:15:05,370 Nhưng nhận ra, chỉ là phổ biến, nếu không phải là một ít phổ biến hơn, là đặt nó ở đó 246 00:15:05,370 --> 00:15:07,480 nhưng chức năng đó là điều tương tự. 247 00:15:07,480 --> 00:15:11,070 Nhưng bây giờ, nếu chúng ta đọc xuống hơn nữa, chúng ta hãy nhìn vào nói, getInt, 248 00:15:11,070 --> 00:15:15,350 bởi vì chúng tôi sử dụng đó, có lẽ, trước khi bất cứ điều gì khác trong học kỳ này. 249 00:15:15,350 --> 00:15:19,620 Và đây là getInt. Đây là những gì? 250 00:15:19,620 --> 00:15:24,650 Đây là nguyên mẫu. Vì vậy, thường xuyên, chúng tôi đã đưa nguyên mẫu tại các đỉnh của chúng tôi các tập tin c, 251 00:15:24,650 --> 00:15:28,190 nhưng bạn cũng có thể đặt nguyên mẫu trong các tập tin tiêu đề, h tập tin. 252 00:15:28,190 --> 00:15:32,110 như thế này ở đây, vì vậy khi bạn viết một số chức năng 253 00:15:32,110 --> 00:15:36,790 mà bạn muốn người khác có thể sử dụng, đó là chính là trường hợp với các thư viện CS50, 254 00:15:36,790 --> 00:15:40,900 bạn không chỉ thực hiện các chức năng của bạn trong một cái gì đó giống như CS50.c, 255 00:15:40,900 --> 00:15:46,720 bạn cũng đặt các nguyên mẫu không phải ở trên cùng của tập tin đó, nhưng ở phía trên cùng của một tập tin tiêu đề, 256 00:15:46,720 --> 00:15:50,810 sau đó là tập tin tiêu đề là những gì bạn bè và đồng nghiệp bao gồm, 257 00:15:50,810 --> 00:15:52,800 với sắc nét bao gồm mã riêng của họ. 258 00:15:52,800 --> 00:15:55,440 Vì vậy, thời gian này, bạn đã bao gồm tất cả các nguyên mẫu 259 00:15:55,440 --> 00:15:59,870 hiệu quả ở phía trên cùng của tập tin của bạn, nhưng bằng cách này sắc nét bao gồm cơ chế 260 00:15:59,870 --> 00:16:03,320 có bản chất là bản sao và dạng bột nhão file này vào của riêng bạn. 261 00:16:03,320 --> 00:16:06,400 Bây giờ, đây là một số tài liệu hướng dẫn khá chi tiết. 262 00:16:06,400 --> 00:16:08,880 >> Chúng tôi đã thực hiện khá nhiều cho rằng getInt được một int, 263 00:16:08,880 --> 00:16:10,740 nhưng nó quay ra có một số trường hợp góc, phải không? 264 00:16:10,740 --> 00:16:14,320 Điều gì sẽ xảy ra nếu người sử dụng các loại trong một số cách quá lớn? 265 00:16:14,320 --> 00:16:17,350 Một quintillion, chỉ có thể không phù hợp với bên trong của một int? 266 00:16:17,350 --> 00:16:21,180 Hành vi mong đợi là gì? Vâng, lý tưởng, đó là dự đoán được. 267 00:16:21,180 --> 00:16:23,460 Vì vậy, trong trường hợp này, nếu bạn thực sự đọc những dòng chữ nhỏ, 268 00:16:23,460 --> 00:16:27,850 bạn sẽ thấy rằng nếu không thể đọc được dòng này INT_MAX trở lại. 269 00:16:27,850 --> 00:16:30,800 Chúng tôi đã không bao giờ nói về điều này, nhưng dựa trên vốn của nó, 270 00:16:30,800 --> 00:16:33,030 nó là gì, có thể là không? 271 00:16:33,030 --> 00:16:36,610 Đó là một hằng số, vì vậy đó là một số hằng số đặc biệt có thể tuyên bố 272 00:16:36,610 --> 00:16:39,460 trong một trong các tập tin tiêu đề đó là lên cao hơn trong tập tin, 273 00:16:39,460 --> 00:16:43,400 INT_MAX có lẽ là một cái gì đó như thế, khoảng, 2 tỷ đồng. 274 00:16:43,400 --> 00:16:48,160 Ý tưởng được rằng bởi vì bằng cách nào đó chúng ta cần phải biểu hiện một điều gì đó đã đi sai, 275 00:16:48,160 --> 00:16:51,090 chúng tôi, có, có 4 tỷ số lúc xử lý của chúng tôi, 276 00:16:51,090 --> 00:16:53,980 âm 2 tỷ USD lên đến 2 tỷ đồng, cho hay phải mất. 277 00:16:53,980 --> 00:16:58,030 Vâng, những gì là phổ biến trong lập trình là bạn ăn cắp một trong những con số. 278 00:16:58,030 --> 00:17:02,250 Có lẽ 0, có thể 2 tỷ đồng, có thể tiêu cực 2 tỷ đồng. 279 00:17:02,250 --> 00:17:06,720 Vì vậy, bạn chi tiêu một trong những giá trị có thể của bạn để bạn có thể cam kết với thế giới 280 00:17:06,720 --> 00:17:10,089 rằng nếu có điều gì sai, tôi sẽ trở lại giá trị siêu lớn. 281 00:17:10,089 --> 00:17:13,329 Nhưng bạn không muốn người dùng gõ một cái gì đó khó hiểu như "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 số thực sự lớn, nơi bạn khái quát thay vì như là một hằng số. 283 00:17:17,079 --> 00:17:19,380 Vì vậy, thực sự, nếu bạn đã là hậu môn trong vài tuần qua, 284 00:17:19,380 --> 00:17:23,800 bất cứ lúc nào bạn gọi getInt, bạn nên đã được kiểm tra với một điều kiện nếu. 285 00:17:23,800 --> 00:17:27,109 Đã làm các loại người dùng trong INT_MAX, hoặc cụ thể hơn, 286 00:17:27,109 --> 00:17:29,900 đã trở lại getInt INT_MAX? Bởi vì nếu nó đã làm, 287 00:17:29,900 --> 00:17:35,140 mà thực sự có nghĩa là họ không gõ nó, một cái gì đó đã đi sai trong trường hợp này. 288 00:17:35,140 --> 00:17:38,970 Vì vậy, đây là những gì thường được gọi là một giá trị "trọng điểm", mà chỉ có nghĩa đặc biệt. 289 00:17:38,970 --> 00:17:41,020 >> Vâng, Bây giờ chúng ta hãy lần lượt vào các tập tin c. 290 00:17:41,020 --> 00:17:44,500 Các tập tin C đã tồn tại trong thiết bị một thời gian, 291 00:17:44,500 --> 00:17:47,540 và, trên thực tế, thiết bị có nó biên dịch sẵn cho bạn 292 00:17:47,540 --> 00:17:49,720 vào điều mà chúng tôi gọi là "mã đối tượng" 293 00:17:49,720 --> 00:17:52,940 nhưng nó chỉ không quan trọng với bạn đó là vì hệ thống biết, 294 00:17:52,940 --> 00:17:54,780 trong trường hợp này, nó ở đâu, thiết bị. 295 00:17:54,780 --> 00:18:00,620 Nhưng chúng ta hãy di chuyển xuống getInt, và xem như thế nào getInt đã được làm việc tất cả thời gian. 296 00:18:00,620 --> 00:18:02,380 Vì vậy, ở đây chúng tôi có ý kiến ​​tương tự từ trước. 297 00:18:02,380 --> 00:18:04,930 Hãy để tôi phóng to trên phần chỉ là mã, 298 00:18:04,930 --> 00:18:07,410 và những gì chúng tôi có cho getInt là sau đây. 299 00:18:07,410 --> 00:18:12,770 Nó không có đầu vào và nó sẽ trả về một int, trong khi (đúng), vì vậy chúng tôi có một vòng lặp cố ý vô hạn 300 00:18:12,770 --> 00:18:16,560 nhưng, có lẽ, chúng ta sẽ phá vỡ trong số này bằng cách nào đó, hoặc quay trở lại từ bên trong. 301 00:18:16,560 --> 00:18:19,890 Vì vậy, chúng ta hãy xem cách làm việc này. Vâng, chúng tôi dường như được sử dụng GetString 302 00:18:19,890 --> 00:18:22,550 trong dòng đầu tiên bên trong các vòng lặp, 166. 303 00:18:22,550 --> 00:18:25,320 Điều này bây giờ là thực hành tốt bởi vì trong hoàn cảnh nào 304 00:18:25,320 --> 00:18:30,820 GetString có thể trở lại từ khóa đặc biệt này, NULL? 305 00:18:30,820 --> 00:18:38,460 Nếu có điều gì sai. Những gì có thể đi sai khi bạn gọi một cái gì đó giống như GetString? 306 00:18:38,460 --> 00:18:42,550 Yeah? [Sinh viên câu trả lời, không thể hiểu] >> Yeah. Vì vậy, có thể malloc không thành công. 307 00:18:42,550 --> 00:18:45,310 Một nơi nào đó bên dưới GetString mui xe đang kêu gọi malloc, 308 00:18:45,310 --> 00:18:48,210 cấp phát bộ nhớ, cho phép các cửa hàng máy tính 309 00:18:48,210 --> 00:18:50,950 tất cả các ký tự mà người dùng gõ vào bàn phím. 310 00:18:50,950 --> 00:18:53,270 Và giả sử người dùng đã có một toàn bộ rất nhiều thời gian miễn phí 311 00:18:53,270 --> 00:18:56,470 và gõ nhiều, ví dụ, hơn 2 tỷ ký tự. 312 00:18:56,470 --> 00:18:59,600 Nhân vật nhiều hơn máy tính thậm chí còn có bộ nhớ RAM. 313 00:18:59,600 --> 00:19:02,350 Vâng, GetString để có thể để cho biết rằng đối với bạn, 314 00:19:02,350 --> 00:19:05,650 ngay cả nếu điều này là một trường hợp góc siêu siêu phổ biến. 315 00:19:05,650 --> 00:19:08,490 Nó có bằng cách nào đó có thể xử lý này, và GetString như vậy, 316 00:19:08,490 --> 00:19:11,850 nếu chúng ta quay trở lại và đọc tài liệu của nó, không, trên thực tế, trở về NULL. 317 00:19:11,850 --> 00:19:16,150 Bây giờ nếu GetString không thành công bằng cách trả về NULL, getInt là thất bại 318 00:19:16,150 --> 00:19:19,370 bằng cách quay trở lại INT_MAX, chỉ là một trọng điểm. 319 00:19:19,370 --> 00:19:22,650 Đây chỉ là quy ước của con người. Cách duy nhất bạn sẽ biết điều này là trường hợp 320 00:19:22,650 --> 00:19:24,840 là bằng cách đọc các tài liệu hướng dẫn. 321 00:19:24,840 --> 00:19:28,200 Vì vậy, hãy di chuyển xuống nơi int thực sự là GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Vì vậy, nếu tôi di chuyển xuống một chút nữa, trong dòng 170, chúng tôi có một bình luận trên những dòng này. 323 00:19:34,220 --> 00:19:38,470 Vì vậy, chúng ta khai báo, vào năm 172, một int n và c một char, và sau đó chức năng này mới 324 00:19:38,470 --> 00:19:41,870 một số bạn đã vấp qua trước, nhưng sscanf. 325 00:19:41,870 --> 00:19:44,190 Đây là viết tắt cho f chuỗi quét. 326 00:19:44,190 --> 00:19:48,580 Nói cách khác, cho tôi một chuỗi và tôi sẽ quét nó cho các mẩu thông tin quan tâm. 327 00:19:48,580 --> 00:19:53,820 Vì vậy, điều đó không có nghĩa là gì? Vâng, giả sử rằng tôi gõ vào, theo nghĩa đen, 1 2 3 vào bàn phím, 328 00:19:53,820 --> 00:19:59,730 và sau đó nhấn Enter. Kiểu dữ liệu của 1 2 3 khi trở về GetString là gì? 329 00:19:59,730 --> 00:20:05,010 Đó rõ ràng là một chuỗi, phải không? Tôi có một chuỗi, do đó 1 2 3 thực sự là "1 2 3" 330 00:20:05,010 --> 00:20:07,260 với 0 \ kết thúc của nó. Đó không phải là một int. 331 00:20:07,260 --> 00:20:10,420 Đó không phải là một số. Nó trông giống như một số nhưng nó không thực sự. 332 00:20:10,420 --> 00:20:14,680 Vì vậy, getInt những gì phải làm gì? Nó có để quét rằng chuỗi trái sang phải, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, và bằng cách nào đó chuyển đổi nó với một số nguyên thực tế. 334 00:20:19,010 --> 00:20:21,010 Bây giờ, bạn có thể tìm ra cách để làm điều này. 335 00:20:21,010 --> 00:20:24,240 Nếu bạn nghĩ rằng trở lại pset 2, bạn có lẽ có một chút thoải mái 336 00:20:24,240 --> 00:20:26,810 với Caesar hoặc vigenere để bạn có thể lặp qua một chuỗi, 337 00:20:26,810 --> 00:20:29,800 bạn có thể chuyển đổi các ký tự để ints với lựa chọn. Đó là một toàn bộ rất nhiều công việc. 338 00:20:29,800 --> 00:20:32,800 Tại sao không gọi một chức năng như sscanf nào đó cho bạn? 339 00:20:32,800 --> 00:20:37,520 Vì vậy, sscanf mong đợi một đối, trong trường hợp này dòng gọi, mà là một chuỗi. 340 00:20:37,520 --> 00:20:41,310 Sau đó, bạn chỉ định, trong dấu ngoặc kép, rất tương tự như printf, 341 00:20:41,310 --> 00:20:44,960 làm những gì bạn mong đợi để xem trong chuỗi này? 342 00:20:44,960 --> 00:20:52,980 Những gì tôi nói ở đây là, tôi mong đợi để xem một số thập phân và có thể một nhân vật. 343 00:20:52,980 --> 00:20:54,990 Và chúng ta sẽ thấy lý do tại sao điều này là trường hợp trong thời điểm này chỉ là một. 344 00:20:54,990 --> 00:20:58,440 Nó chỉ ra rằng ký hiệu này gợi nhớ thứ 345 00:20:58,440 --> 00:21:00,840 chúng tôi bắt đầu nói về chỉ hơn một tuần trước đây. 346 00:21:00,840 --> 00:21:05,430 >> Những gì là & n & c làm cho chúng ta ở đây? [Câu trả lời của sinh viên, không thể hiểu] 347 00:21:05,430 --> 00:21:07,610 >> Yeah. Nó đem lại cho tôi địa chỉ của n và địa chỉ của c. 348 00:21:07,610 --> 00:21:10,440 Bây giờ, tại sao là quan trọng? Vâng, bạn biết rằng với chức năng trong C 349 00:21:10,440 --> 00:21:13,440 bạn luôn có thể trả về một giá trị hoặc không có giá trị ở tất cả. 350 00:21:13,440 --> 00:21:16,630 Bạn có thể quay trở lại một int, một chuỗi, float, char, bất cứ điều gì. 351 00:21:16,630 --> 00:21:21,150 Hoặc bạn có thể quay trở lại bãi bỏ, nhưng bạn chỉ có thể trở về 1 điều tối đa. 352 00:21:21,150 --> 00:21:26,100 Nhưng ở đây chúng tôi muốn sscanf để trả lại cho tôi có thể là một int, một số thập phân, 353 00:21:26,100 --> 00:21:29,240 và cũng là một char, và tôi sẽ giải thích lý do tại sao các char trong một thời điểm. 354 00:21:29,240 --> 00:21:34,250 Vì vậy, bạn có hiệu quả f để trở lại 2 điều, đó là điều không có thể có trong C. 355 00:21:34,250 --> 00:21:38,460 Vì vậy, bạn có thể làm việc xung quanh bằng cách đi qua trong 2 địa chỉ, 356 00:21:38,460 --> 00:21:43,710 vì ngay sau khi bạn trao chức năng 2 địa chỉ, chức năng đó có thể làm gì với họ? 357 00:21:43,710 --> 00:21:49,880 Nó có thể viết thư đến những địa chỉ. Bạn có thể sử dụng * và hoạt động "đi" với nhau những địa chỉ. 358 00:21:49,880 --> 00:21:54,320 Đó là loại của cơ chế này backdoor, nhưng rất phổ biến để thay đổi giá trị của biến 359 00:21:54,320 --> 00:21:58,020 trong hơn 1 nơi, trong trường hợp này 2. 360 00:21:58,020 --> 00:22:04,590 Bây giờ, thông báo tôi đang kiểm tra == to1, và sau đó trở về n nếu điều đó không, trên thực tế, để đánh giá đúng. 361 00:22:04,590 --> 00:22:09,340 Vì vậy, những gì đang xảy ra? Vâng, về mặt kỹ thuật, tất cả những gì chúng ta thực sự muốn xảy ra trong getInt này. 362 00:22:09,340 --> 00:22:12,340 Chúng tôi muốn phân tích, có thể nói, chúng tôi muốn đọc những chuỗi 363 00:22:12,340 --> 00:22:16,210 "1 2 3" và nếu nó trông giống như có một số ở đó, 364 00:22:16,210 --> 00:22:21,360 những gì chúng ta đang nói sscanf làm là đặt con số đó, 1 2 3, trong biến n này cho tôi. 365 00:22:21,360 --> 00:22:26,060 Tại sao, sau đó, đã làm tôi có điều này là tốt? 366 00:22:26,060 --> 00:22:33,750 Vai trò của cũng nói rằng, sscanf, bạn cũng có thể nhận được một nhân vật ở đây là gì. 367 00:22:33,750 --> 00:22:36,890 [Sinh viên nói, không thể hiểu] >> Không - một điểm thập phân có thể làm việc. 368 00:22:36,890 --> 00:22:40,650 Chúng ta hãy nắm suy nghĩ một lát. Những gì khác? 369 00:22:40,650 --> 00:22:42,570 [Sinh viên, không thể hiểu] >> Vì vậy, tư tưởng tốt, nó có thể là ký tự NULL. 370 00:22:42,570 --> 00:22:44,970 Nó thực sự không, trong trường hợp này. Yeah? [Sinh viên, không thể hiểu] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Hoặc, cho tôi khái quát hơn nữa. 372 00:22:47,100 --> 00:22:49,670 C% có chỉ là để kiểm tra lỗi. 373 00:22:49,670 --> 00:22:52,510 Chúng tôi không muốn có được nhân vật sau khi số lượng, 374 00:22:52,510 --> 00:22:54,980 nhưng điều này cho phép tôi làm như sau: 375 00:22:54,980 --> 00:23:01,270 Nó chỉ ra rằng, bên cạnh việc lưu trữ các giá trị trong n và c, trong ví dụ này ở đây, sscanf 376 00:23:01,270 --> 00:23:08,170 những gì nó cũng là nó sẽ trả về số lượng các biến đặt các giá trị. 377 00:23:08,170 --> 00:23:13,330 Vì vậy, nếu bạn chỉ gõ 1 2 3, sau đó chỉ d% để phù hợp với 378 00:23:13,330 --> 00:23:18,830 và chỉ có n được lưu trữ với một giá trị như 1 2 3 và không có gì được đặt vào c; 379 00:23:18,830 --> 00:23:20,870 c vẫn còn là một giá trị rác, do đó, để nói chuyện. 380 00:23:20,870 --> 00:23:23,550 Rác bởi vì nó không bao giờ được khởi tạo như là một số giá trị. 381 00:23:23,550 --> 00:23:29,390 Vì vậy, trong trường hợp đó, sscanf trả về 1, bởi vì tôi dân cư là một trong những gợi ý, 382 00:23:29,390 --> 00:23:33,650 trong trường hợp đó, tuyệt vời. Tôi có một int, vì vậy tôi giải phóng đường để giải phóng bộ nhớ 383 00:23:33,650 --> 00:23:37,150 rằng GetString thực sự được phân bổ, và sau đó tôi trở về n. 384 00:23:37,150 --> 00:23:42,210 Khác, nếu bạn đã bao giờ tự hỏi nơi đó thử lại tuyên bố đến từ, đến từ ngay tại đây. 385 00:23:42,210 --> 00:23:45,770 Nếu, ngược lại, tôi gõ in 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 chỉ là một số chuỗi ngẫu nhiên của văn bản, sscanf sẽ thấy, 387 00:23:48,640 --> 00:23:51,500 ooh, số lượng, ooh, số lượng, ooh, số lượng, ooh - f. 388 00:23:51,500 --> 00:23:54,190 Và nó sẽ đặt 1 2 3 trong n. 389 00:23:54,190 --> 00:23:59,970 Nó sẽ đưa f trong c, và sau đó trở lại 2. 390 00:23:59,970 --> 00:24:02,980 Vì vậy, chúng tôi có, chỉ cần sử dụng các định nghĩa cơ bản của hành vi scanf, 391 00:24:02,980 --> 00:24:06,170 một cách rất đơn giản - cũng phức tạp ở cái nhìn đầu tiên, nhưng vào cuối ngày, 392 00:24:06,170 --> 00:24:11,460 cơ chế khá đơn giản nói, là có một int, và nếu có, là điều duy nhất mà tôi tìm thấy? 393 00:24:11,460 --> 00:24:14,950 Và không gian trắng ở đây là có chủ ý. Nếu bạn đọc những tài liệu hướng dẫn cho sscanf, 394 00:24:14,950 --> 00:24:18,690 nó nói với bạn rằng nếu bạn bao gồm một phần của khoảng trắng ở đầu hoặc cuối, 395 00:24:18,690 --> 00:24:24,990 sscanf cũng sẽ cho phép người sử dụng, vì lý do gì, để đạt spacebar 1 2 3, và điều đó sẽ là hợp pháp. 396 00:24:24,990 --> 00:24:28,310 Nó sẽ không la lên với người sử dụng chỉ vì họ nhấn spacebar ở đầu hoặc cuối cùng, 397 00:24:28,310 --> 00:24:32,160 mà chỉ là một chút thân thiện với người sử dụng. 398 00:24:32,160 --> 00:24:34,160 >> Mọi câu hỏi, sau đó, trên GetInts? Yeah? 399 00:24:34,160 --> 00:24:36,820 [Sinh viên câu hỏi, không thể hiểu] 400 00:24:36,820 --> 00:24:40,740 >> Câu hỏi hay. Nếu bạn chỉ cần gõ vào một char, giống như hit, e và nhập 401 00:24:40,740 --> 00:24:47,830 mà không bao giờ gõ 1 2 3, bạn nghĩ gì về hành vi của các dòng mã này sau đó sẽ là? 402 00:24:47,830 --> 00:24:50,500 Vì vậy, sscanf có thể nói về điều này, bởi vì trong trường hợp đó, 403 00:24:50,500 --> 00:24:56,280 nó không phải đi để điền vào n c, nó sẽ thay vào đó trở về 0. 404 00:24:56,280 --> 00:25:01,540 Trong trường hợp đó, tôi cũng bắt kịch bản đó, bởi vì giá trị kỳ vọng tôi muốn là 1. 405 00:25:01,540 --> 00:25:07,310 Tôi chỉ mong muốn 1, và chỉ có 1 điều để được làm đầy. Tốt câu hỏi. Những người khác? 406 00:25:07,310 --> 00:25:09,610 >> Được rồi, vì vậy hãy để không phải đi qua tất cả các chức năng ở đây, 407 00:25:09,610 --> 00:25:11,820 nhưng một trong đó có vẻ là, có lẽ, quan tâm còn lại 408 00:25:11,820 --> 00:25:14,530 GetString bởi vì nó chỉ ra rằng GetFloat, getInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong tất cả punt rất nhiều các chức năng của họ để GetString. 410 00:25:19,490 --> 00:25:22,860 Vì vậy, chúng ta hãy xem xét làm thế nào ông được thực hiện ở đây. 411 00:25:22,860 --> 00:25:27,040 Điều này có vẻ phức tạp chút nhưng nó sử dụng cùng một nguyên tắc cơ bản 412 00:25:27,040 --> 00:25:29,680 chúng tôi bắt đầu nói về tuần trước. Vì vậy, trong GetString, 413 00:25:29,680 --> 00:25:32,670 mà không có đối số theo khoảng trống ở đây, 414 00:25:32,670 --> 00:25:37,110 và nó trả về một chuỗi, do đó, tôi tuyên bố một chuỗi được gọi là bộ đệm. 415 00:25:37,110 --> 00:25:39,670 Tôi không thực sự biết đó là những gì sẽ được sử dụng cho nêu ra, nhưng chúng ta sẽ thấy. 416 00:25:39,670 --> 00:25:42,950 Hình như năng lực, theo mặc định, 0, không khá chắc chắn nơi này là đi. 417 00:25:42,950 --> 00:25:44,920 Không chắc chắn những gì n sẽ được sử dụng cho nêu ra. 418 00:25:44,920 --> 00:25:47,860 Nhưng bây giờ nó nhận được một chút thú vị hơn, do đó, trong dòng 243, 419 00:25:47,860 --> 00:25:51,760 chúng ta khai báo một int c, đây là sắp xếp của một chi tiết ngu ngốc. 420 00:25:51,760 --> 00:25:58,080 Char là 8 bit, và 8 bit có thể lưu trữ bao nhiêu giá trị khác nhau? 421 00:25:58,080 --> 00:26:03,310 256. Vấn đề là, nếu bạn muốn có 256 ký tự ASCII khác nhau, 422 00:26:03,310 --> 00:26:06,210 mà có, nếu bạn nghĩ lại, và điều này không phải là một cái gì đó để ghi nhớ. 423 00:26:06,210 --> 00:26:09,100 Nhưng nếu bạn nghĩ rằng biểu đồ ASCII lớn chúng tôi đã có tuần trước, 424 00:26:09,100 --> 00:26:13,780 có, trong trường hợp đó, 128 hoặc 256 ký tự ASCII. 425 00:26:13,780 --> 00:26:16,220 Chúng tôi sử dụng tất cả các mẫu của 0 và 1 của. 426 00:26:16,220 --> 00:26:19,410 Đó là một vấn đề nếu bạn muốn để có thể phát hiện một lỗi. 427 00:26:19,410 --> 00:26:23,290 Bởi vì nếu bạn đã sử dụng 256 giá trị cho nhân vật của bạn, 428 00:26:23,290 --> 00:26:26,390 bạn không thực sự có kế hoạch trước, bởi vì bây giờ bạn không có cách nói, 429 00:26:26,390 --> 00:26:29,750 "Đây không phải là một nhân vật VN, đây là một số thông báo sai lầm." 430 00:26:29,750 --> 00:26:32,430 Vì vậy, những gì thế giới, họ sử dụng giá trị lớn nhất tiếp theo, 431 00:26:32,430 --> 00:26:35,790 một cái gì đó giống như một int để bạn có một số điên của các bit, 432 00:26:35,790 --> 00:26:39,610 32 4 tỷ giá trị có thể, do đó bạn chỉ có thể kết thúc bằng cách sử dụng, 433 00:26:39,610 --> 00:26:44,800 về cơ bản, 257 trong số đó, 1 trong số đó có một số ý nghĩa đặc biệt như là một lỗi. 434 00:26:44,800 --> 00:26:49,190 >> Vì vậy, chúng ta hãy xem cách làm việc này. Trong dòng 246, tôi có vòng lặp trong khi lớn 435 00:26:49,190 --> 00:26:54,530 được gọi fgetc, f có nghĩa là tập tin, getc, và sau đó thiết bị nhập chuẩn. 436 00:26:54,530 --> 00:26:59,030 Hóa ra đây chỉ là cách nói "đọc dữ liệu vào từ bàn phím chính xác hơn." 437 00:26:59,030 --> 00:27:02,730 Phương tiện đầu vào bàn phím tiêu chuẩn, tiêu chuẩn đầu ra có nghĩa là màn hình, 438 00:27:02,730 --> 00:27:06,920 và lỗi tiêu chuẩn, chúng ta sẽ thấy trong pset 4, có nghĩa là màn hình, 439 00:27:06,920 --> 00:27:09,670 nhưng một phần đặc biệt của màn hình để nó không conflated 440 00:27:09,670 --> 00:27:13,760 với sản lượng thực tế mà bạn dự định in, nhưng thêm vào đó trong tương lai. 441 00:27:13,760 --> 00:27:19,430 Vì vậy, fgetc chỉ có nghĩa là đọc một ký tự từ bàn phím, và lưu trữ nó, nơi? 442 00:27:19,430 --> 00:27:24,000 Lưu trữ nó trong c, và sau đó kiểm tra, vì vậy tôi chỉ sử dụng một số liên từ boolean, 443 00:27:24,000 --> 00:27:28,430 kiểm tra rằng nó không bằng nhau \ n, do đó, người dùng đã nhấn Enter. 444 00:27:28,430 --> 00:27:31,510 Chúng tôi muốn dừng lại ở thời điểm đó, kết thúc vòng lặp, và chúng tôi cũng muốn kiểm tra 445 00:27:31,510 --> 00:27:36,170 cho hằng số đặc biệt, kết thúc tập tin, nếu bạn biết hoặc đoán - những gì đứng cho? 446 00:27:36,170 --> 00:27:39,860 Kết thúc của tập tin. Vì vậy, đây là loại vô nghĩa, bởi vì nếu tôi gõ vào bàn phím, 447 00:27:39,860 --> 00:27:41,900 có thực sự không có tập tin liên quan đến điều này, 448 00:27:41,900 --> 00:27:44,330 nhưng điều này chỉ là sắp xếp của thuật ngữ chung được sử dụng để có nghĩa là 449 00:27:44,330 --> 00:27:50,320 rằng không có gì khác là đến từ các ngón tay của con người. EOF. Kết thúc của tập tin. 450 00:27:50,320 --> 00:27:52,600 Một sang một bên, nếu bạn đã bao giờ đánh soát d vào bàn phím của bạn, 451 00:27:52,600 --> 00:27:54,680 không phải là bạn sẽ có được nêu ra, bạn đã đạt kiểm soát c. 452 00:27:54,680 --> 00:27:57,920 Tuy nhiên, kiểm soát d gửi EOF đặc biệt liên tục này được gọi là. 453 00:27:57,920 --> 00:28:03,100 >> Vì vậy, bây giờ chúng tôi chỉ có một số cấp phát bộ nhớ động. 454 00:28:03,100 --> 00:28:06,460 Vì vậy, nếu n + 1> công suất, bây giờ tôi sẽ giải thích n. 455 00:28:06,460 --> 00:28:09,380 n được bao nhiêu byte hiện trong bộ đệm, 456 00:28:09,380 --> 00:28:11,970 chuỗi mà bạn đang xây dựng từ người sử dụng. 457 00:28:11,970 --> 00:28:16,240 Nếu bạn có thêm nhiều nhân vật trong bộ đệm của bạn hơn bạn có năng lực trong bộ đệm, 458 00:28:16,240 --> 00:28:20,760 trực giác, những gì chúng tôi cần làm sau đó được phân bổ nhiều dung lượng hơn. 459 00:28:20,760 --> 00:28:24,490 Tôi sẽ đọc lướt qua một số số học ở đây 460 00:28:24,490 --> 00:28:26,900 và chỉ tập trung vào chức năng này ở đây. 461 00:28:26,900 --> 00:28:29,170 Bạn biết những gì malloc, hoặc ít nhất là nói chung quen thuộc. 462 00:28:29,170 --> 00:28:32,380 Hãy đoán những gì realloc không. [Sinh viên câu trả lời, không thể hiểu] 463 00:28:32,380 --> 00:28:35,690 >> Yeah. Và nó không phải là khá thêm bộ nhớ, nó reallocates bộ nhớ như sau: 464 00:28:35,690 --> 00:28:40,530 Nếu vẫn còn có phòng ở cuối của chuỗi cung cấp cho bạn nhiều hơn của bộ nhớ mà 465 00:28:40,530 --> 00:28:43,370 hơn so với ban đầu cung cấp cho bạn, sau đó bạn sẽ nhận được rằng bộ nhớ bổ sung. 466 00:28:43,370 --> 00:28:46,640 Vì vậy, bạn có thể chỉ cần đặt các ký tự chuỗi trở lại trở lại để sao lưu để sao lưu. 467 00:28:46,640 --> 00:28:49,290 Nhưng nếu đó không phải là trường hợp, bởi vì bạn chờ đợi quá lâu 468 00:28:49,290 --> 00:28:51,700 và một cái gì đó ngẫu nhiên ngồi phịch vào bộ nhớ, nhưng có thêm 469 00:28:51,700 --> 00:28:56,480 bộ nhớ xuống đây, đó là okay. Realloc sẽ làm tất cả những nâng nặng cho bạn, 470 00:28:56,480 --> 00:28:58,810 di chuyển chuỗi bạn đã đọc vậy, đến nay đây, 471 00:28:58,810 --> 00:29:02,550 đặt nó xuống, và sau đó cung cấp cho bạn đường băng một số chi tiết tại thời điểm đó. 472 00:29:02,550 --> 00:29:05,610 Vì vậy, với một làn sóng của bàn tay, cho tôi nói rằng những gì GetString đang làm 473 00:29:05,610 --> 00:29:09,540 là nó bắt đầu với một bộ đệm nhỏ, có thể 1 nhân vật duy nhất, 474 00:29:09,540 --> 00:29:12,300 và nếu người sử dụng các loại trong 2 ký tự, GetString kết thúc 475 00:29:12,300 --> 00:29:15,210 gọi realloc và nói, 'Ồ, 1 nhân vật là không đủ. 476 00:29:15,210 --> 00:29:18,480 Hãy cho tôi 2 ký tự. Sau đó, nếu bạn đọc thông qua logic của vòng lặp, 477 00:29:18,480 --> 00:29:21,070 nó sẽ nói, 'Ồ, người sử dụng gõ vào 3 ký tự. 478 00:29:21,070 --> 00:29:25,690 Cho tôi bây giờ không 2 nhưng 4 ký tự, sau đó đưa cho tôi 8, sau đó đưa cho tôi 16 và 32. 479 00:29:25,690 --> 00:29:28,180 Thực tế là tôi đang tăng gấp đôi công suất mỗi lần 480 00:29:28,180 --> 00:29:30,320 có nghĩa là các bộ đệm sẽ không tăng trưởng chậm chạp. 481 00:29:30,320 --> 00:29:35,870 Nó sẽ phát triển siêu nhanh, và những gì có thể lợi dụng điều đó? 482 00:29:35,870 --> 00:29:38,540 Tại sao tôi tăng gấp đôi kích thước của bộ đệm, cho dù người dùng 483 00:29:38,540 --> 00:29:41,450 chỉ có thể cần thêm 1 ký tự từ bàn phím? 484 00:29:41,450 --> 00:29:44,830 [Sinh viên câu trả lời, không thể hiểu]. >> Cái gì thế? 485 00:29:44,830 --> 00:29:46,750 Chính xác. Bạn không cần phải phát triển nó thường xuyên. 486 00:29:46,750 --> 00:29:48,870 Và đây chỉ là loại một - phổ cập như bảo hiểm rủi ro cược của bạn ở đây. 487 00:29:48,870 --> 00:29:54,150 Ý tưởng được rằng bạn không muốn gọi realloc rất nhiều, bởi vì nó có xu hướng được làm chậm. 488 00:29:54,150 --> 00:29:56,840 Bất cứ lúc nào bạn yêu cầu hệ điều hành cho bộ nhớ, như bạn sẽ sớm thấy 489 00:29:56,840 --> 00:30:00,620 trong một bộ vấn đề trong tương lai, nó có xu hướng mất một thời gian. 490 00:30:00,620 --> 00:30:04,980 Vì vậy, giảm thiểu số tiền đó của thời gian, ngay cả khi bạn đang lãng phí một số không gian, có xu hướng là một điều tốt. 491 00:30:04,980 --> 00:30:07,250 >> Nhưng nếu chúng ta đọc qua phần cuối cùng của GetString ở đây, 492 00:30:07,250 --> 00:30:10,880 và một lần nữa, sự hiểu biết tất cả các dòng duy nhất ở đây không phải là quan trọng như vậy ngày hôm nay. 493 00:30:10,880 --> 00:30:14,830 Nhưng nhận thấy rằng nó cuối cùng gọi malloc một lần nữa, và nó phân bổ 494 00:30:14,830 --> 00:30:16,980 chính xác như nhiều byte như nó cần cho chuỗi 495 00:30:16,980 --> 00:30:21,620 và sau đó ném đi bằng cách gọi điện thoại miễn phí, các bộ đệm quá lớn, 496 00:30:21,620 --> 00:30:23,510 nếu nó thực sự đã tăng gấp đôi quá nhiều lần. 497 00:30:23,510 --> 00:30:25,970 Trong ngắn hạn, đó là cách GetString đã được làm việc tất cả thời gian. 498 00:30:25,970 --> 00:30:30,100 Tất cả nó được đọc một ký tự tại một thời điểm một lần nữa và một lần nữa và một lần nữa 499 00:30:30,100 --> 00:30:37,930 và mỗi khi nó cần một số bộ nhớ bổ sung, nó yêu cầu hệ điều hành cho nó bằng cách gọi realloc. 500 00:30:37,930 --> 00:30:41,660 Bất kỳ câu hỏi nào? Được rồi. 501 00:30:41,660 --> 00:30:45,220 >> Một cuộc tấn công. Bây giờ chúng ta hiểu con trỏ, hoặc ít nhất 502 00:30:45,220 --> 00:30:47,560 đang ngày càng quen thuộc với con trỏ, 503 00:30:47,560 --> 00:30:50,020 chúng ta hãy xem xét làm thế nào trên toàn thế giới bắt đầu sụp đổ 504 00:30:50,020 --> 00:30:53,160 nếu bạn không hoàn toàn bảo vệ chống lại người dùng đối lập, 505 00:30:53,160 --> 00:30:55,180 những người đang cố gắng để hack vào hệ thống của bạn. 506 00:30:55,180 --> 00:31:00,260 Những người đang cố gắng để ăn cắp phần mềm của bạn bằng cách phá vỡ một số mã đăng ký 507 00:31:00,260 --> 00:31:02,150 rằng họ nếu không có thể phải gõ vào 508 00:31:02,150 --> 00:31:04,860 Hãy xem ví dụ này ở đây, mà chỉ là mã C 509 00:31:04,860 --> 00:31:07,920 mà có một chức năng chính ở phía dưới, mà các cuộc gọi một foo chức năng, 510 00:31:07,920 --> 00:31:12,100 và nó được đi qua để foo? [Sinh Viên] Một đối số duy nhất. 511 00:31:12,100 --> 00:31:15,660 >> Single đối số. Vì vậy, argv [1], có nghĩa là từ đầu tiên người dùng gõ 512 00:31:15,660 --> 00:31:19,150 chương trình dòng lệnh sau khi a.out hoặc bất cứ điều gì được gọi. 513 00:31:19,150 --> 00:31:24,920 Vì vậy, foo, ở phía trên, có trong một char *, char * chỉ là những gì? 514 00:31:24,920 --> 00:31:28,860 String. Không có gì mới ở đây, và chuỗi được tùy tiện được gọi là thanh. 515 00:31:28,860 --> 00:31:36,090 Trong dòng này ở đây, char c [12], loại bán kỹ thuật, dòng này là làm gì? 516 00:31:36,090 --> 00:31:40,640 Array of? Ký tự. Hãy cho tôi một mảng 12 ký tự. 517 00:31:40,640 --> 00:31:44,970 Vì vậy, chúng ta có thể gọi đây là một bộ đệm. Nó được gọi là kỹ thuật c, nhưng một bộ đệm trong chương trình 518 00:31:44,970 --> 00:31:47,890 chỉ có nghĩa là một loạt các không gian mà bạn có thể đặt một số công cụ. 519 00:31:47,890 --> 00:31:49,940 >> Memcpy, Sau đó, cuối cùng, chúng tôi đã không được sử dụng trước đây. 520 00:31:49,940 --> 00:31:52,380 Tuy nhiên, bạn có thể đoán những gì nó. Nó sao chép bộ nhớ. 521 00:31:52,380 --> 00:31:58,790 Làm gì? Vâng, nó dường như bản sao bar, đầu vào của nó, vào c, 522 00:31:58,790 --> 00:32:03,420 nhưng chỉ lên đến chiều dài của thanh. 523 00:32:03,420 --> 00:32:07,440 Nhưng có một lỗi ở đây. 524 00:32:07,440 --> 00:32:14,500 Được rồi, do đó, về mặt kỹ thuật chúng tôi thực sự nên làm strlen (bar) x sizeof (char), đó là chính xác. 525 00:32:14,500 --> 00:32:17,920 Nhưng trong trường hợp xấu nhất ở đây, chúng ta hãy giả định rằng Đó - vì vậy, okay. 526 00:32:17,920 --> 00:32:23,760 Sau đó có 2 lỗi. Vì vậy, sizeof (char), tất cả các quyền, cho phép thực hiện điều này rộng hơn một chút. 527 00:32:23,760 --> 00:32:28,860 Vì vậy, bây giờ vẫn còn một lỗi, đó là những gì? 528 00:32:28,860 --> 00:32:31,630 [Sinh viên câu trả lời, không thể hiểu] >> Kiểm tra những gì? Được rồi, vì vậy chúng tôi cần được kiểm tra 529 00:32:31,630 --> 00:32:35,010 NULL, bởi vì những điều xấu xảy ra khi con trỏ của bạn là NULL, 530 00:32:35,010 --> 00:32:38,490 Bởi vì bạn có thể kết thúc đến đó, và bạn sẽ không bao giờ được để NULL 531 00:32:38,490 --> 00:32:40,890 bởi dereferencing nó với các nhà điều hành *. 532 00:32:40,890 --> 00:32:45,250 Vì vậy, đó là tốt, và chúng ta làm những gì khác? Một cách hợp lý có một lỗ hổng ở đây quá. 533 00:32:45,250 --> 00:32:47,650 [Sinh viên câu trả lời, không thể hiểu] 534 00:32:47,650 --> 00:32:51,340 >> Vì vậy, kiểm tra xem argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Được rồi, do đó, có 3 lỗi trong chương trình này ở đây. 536 00:32:54,130 --> 00:33:00,080 Chúng tôi không kiểm tra nếu người sử dụng thực sự gõ vào bất cứ điều gì vào argv [1], tốt. 537 00:33:00,080 --> 00:33:02,240 Vì vậy, các lỗi thứ ba là những gì? Yeah? 538 00:33:02,240 --> 00:33:04,420 [Sinh viên câu trả lời, không thể hiểu] >> Tốt. 539 00:33:04,420 --> 00:33:09,590 Vì vậy, chúng tôi đã kiểm tra một kịch bản. Chúng tôi ngầm kiểm tra không sao chép bộ nhớ hơn 540 00:33:09,590 --> 00:33:12,800 hơn sẽ vượt quá chiều dài của thanh. 541 00:33:12,800 --> 00:33:15,720 Vì vậy, nếu các chuỗi người dùng gõ dài là 10 ký tự, 542 00:33:15,720 --> 00:33:18,260 này là nói, 'Chỉ sao chép 10 ký tự. 543 00:33:18,260 --> 00:33:21,140 Và đó là okay, nhưng những gì nếu người dùng gõ vào một từ tại dấu nhắc 544 00:33:21,140 --> 00:33:29,360 giống như một từ ký tự 20, điều này, nói rằng sao chép 20 ký tự từ thanh vào những gì? 545 00:33:29,360 --> 00:33:32,840 c, nếu không được biết đến như một bộ đệm của chúng tôi, có nghĩa là bạn chỉ cần viết dữ liệu 546 00:33:32,840 --> 00:33:35,950 8 địa điểm byte mà bạn không sở hữu, 547 00:33:35,950 --> 00:33:38,320 và bạn không sở hữu chúng trong ý nghĩa rằng bạn không bao giờ được giao cho họ. 548 00:33:38,320 --> 00:33:41,190 Vì vậy, đây là những gì thường được gọi là cuộc tấn công tràn bộ đệm, 549 00:33:41,190 --> 00:33:46,650 tràn bộ đệm tấn công, và tấn công nó theo ý nghĩa là nếu người sử dụng 550 00:33:46,650 --> 00:33:50,650 hoặc chương trình đó là chức năng gọi điện thoại của bạn đang làm việc này độc hại, 551 00:33:50,650 --> 00:33:53,780 những gì thực sự xảy ra tiếp theo có thể là khá xấu. 552 00:33:53,780 --> 00:33:55,690 >> Chúng ta hãy nhìn vào bức tranh này ở đây. 553 00:33:55,690 --> 00:33:59,070 Bức ảnh này đại diện cho ngăn xếp của bạn bộ nhớ. 554 00:33:59,070 --> 00:34:01,050 Và nhớ rằng mỗi khi bạn gọi một chức năng, 555 00:34:01,050 --> 00:34:04,520 bạn sẽ có được khung hình này trên stack và sau đó một và sau đó khác và sau đó một. 556 00:34:04,520 --> 00:34:07,250 Và như vậy, đến nay chúng tôi đã chỉ cần loại trừu tượng này đi như hình chữ nhật 557 00:34:07,250 --> 00:34:09,380 hoặc là có trên bảng hoặc trên màn hình ở đây. 558 00:34:09,380 --> 00:34:12,219 Nhưng nếu chúng ta phóng to vào một trong những hình chữ nhật, 559 00:34:12,219 --> 00:34:16,460 khi bạn gọi một foo chức năng, nó chỉ ra rằng có nhiều trên stack 560 00:34:16,460 --> 00:34:18,739 bên trong cái khung và hình chữ nhật đó 561 00:34:18,739 --> 00:34:23,370 hơn chỉ x và y và a và b, như chúng tôi đã nói về trao đổi. 562 00:34:23,370 --> 00:34:25,949 Nó chỉ ra rằng có một số chi tiết cấp thấp hơn, 563 00:34:25,949 --> 00:34:27,780 trong số đó trả lại địa chỉ. 564 00:34:27,780 --> 00:34:33,020 Vì vậy, nó quay ra khi chính gọi foo, chính có thông báo foo 565 00:34:33,020 --> 00:34:36,760 địa chỉ chính là trong bộ nhớ của máy tính. 566 00:34:36,760 --> 00:34:40,659 Bởi vì nếu không, ngay như foo được thực hiện thực hiện, như trong trường hợp này đây, 567 00:34:40,659 --> 00:34:43,790 một khi bạn đạt được cú đúp gần xoăn ở phần cuối của foo, 568 00:34:43,790 --> 00:34:48,860 làm thế nào heck foo biết nơi kiểm soát của chương trình là vụ phải đi? 569 00:34:48,860 --> 00:34:52,460 Nó chỉ ra rằng câu trả lời cho câu hỏi đó là trong hình chữ nhật màu đỏ ở đây. 570 00:34:52,460 --> 00:34:56,130 Điều này thể hiện một con trỏ, và nó vào máy tính để lưu trữ tạm thời, 571 00:34:56,130 --> 00:35:00,250 trên stack được gọi là địa chỉ của chính vì vậy mà ngay sau khi foo được thực hiện thực hiện, 572 00:35:00,250 --> 00:35:04,110 máy tính biết đâu và những gì dòng chính để trở lại. 573 00:35:04,110 --> 00:35:06,900 Con trỏ khung hình lưu liên quan tương tự như này. 574 00:35:06,900 --> 00:35:09,620 Char * bar ở đây đại diện cho những gì? 575 00:35:09,620 --> 00:35:14,740 Vâng, bây giờ phân khúc này màu xanh đây là của khung foo, bar là gì? 576 00:35:14,740 --> 00:35:18,300 Được rồi, do đó, thanh chỉ là đối số cho hàm foo. 577 00:35:18,300 --> 00:35:20,720 >> Vì vậy, bây giờ chúng tôi đang trở lại hình ảnh quen thuộc. 578 00:35:20,720 --> 00:35:22,960 Có nhiều công cụ và phiền nhiễu nhiều hơn trên màn hình 579 00:35:22,960 --> 00:35:27,490 nhưng phân khúc này màu xanh nhạt là những gì chúng tôi đã được vẽ lên bảng cho một cái gì đó như trao đổi. 580 00:35:27,490 --> 00:35:31,890 Đó là khung cho foo và điều duy nhất trong đó là thanh, 581 00:35:31,890 --> 00:35:34,630 đó là tham số này. 582 00:35:34,630 --> 00:35:39,840 Nhưng những gì khác nên trong ngăn xếp, theo mã này ở đây? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Vì vậy, chúng ta cũng nên xem 12 hình vuông của bộ nhớ, 584 00:35:44,280 --> 00:35:46,260 giao cho một biến được gọi là c. 585 00:35:46,260 --> 00:35:48,340 Và thực tế, chúng tôi có trên màn hình. 586 00:35:48,340 --> 00:35:51,650 Đầu rất có c [0], và sau đó là tác giả của sơ đồ này 587 00:35:51,650 --> 00:35:55,130 không bận tâm vẽ tất cả các hình vuông, nhưng có thực sự 12 có 588 00:35:55,130 --> 00:36:00,120 bởi vì nếu bạn nhìn vào góc dưới bên phải, c [11], nếu bạn đếm từ 0, 12 byte như vậy. 589 00:36:00,120 --> 00:36:06,190 Nhưng ở đây là vấn đề: Trong hướng c ngày càng tăng? 590 00:36:06,190 --> 00:36:10,390 Sắp xếp từ trên xuống, phải không? Nếu nó bắt đầu ở đầu trang và phát triển xuống dưới, 591 00:36:10,390 --> 00:36:13,480 không giống như chúng tôi rời mình đường băng nhiều ở đây cả. 592 00:36:13,480 --> 00:36:15,320 Chúng tôi đã loại sơn mình vào một góc, 593 00:36:15,320 --> 00:36:20,210 và c [11] là phải lên chống lại bar, mà là ngay lên chống lại con trỏ stack frame, 594 00:36:20,210 --> 00:36:23,800 mà là phải lên chống lại địa chỉ trở lại, có không nhiều phòng. 595 00:36:23,800 --> 00:36:26,100 Vì vậy, ngụ ý là những gì, sau đó, nếu bạn vít lên, 596 00:36:26,100 --> 00:36:30,460 và bạn cố gắng đọc 20 byte vào một bộ đệm 12-byte? 597 00:36:30,460 --> 00:36:33,460 Đâu những 8 byte bổ sung sẽ đi đâu? 598 00:36:33,460 --> 00:36:36,370 Bên trong mọi thứ khác, một số trong đó là siêu quan trọng. 599 00:36:36,370 --> 00:36:40,480 Và điều quan trọng nhất, có khả năng, là hộp màu đỏ ở đó, trở về địa chỉ. 600 00:36:40,480 --> 00:36:44,720 Bởi vì giả sử rằng bạn đang hoặc vô tình hoặc adversarially 601 00:36:44,720 --> 00:36:48,040 ghi đè lên những 4 byte, địa chỉ con trỏ, 602 00:36:48,040 --> 00:36:53,190 không chỉ với rác, nhưng với một số điều đó xảy ra để đại diện cho một địa chỉ thực trong bộ nhớ? 603 00:36:53,190 --> 00:36:55,930 Implicaiton là gì, một cách logic không? 604 00:36:55,930 --> 00:36:59,080 [Câu trả lời sinh viên, không thể hiểu] >> Chính xác. Khi foo trả về 605 00:36:59,080 --> 00:37:03,560 và số truy cập mà xoăn cú đúp, chương trình sẽ tiến hành không trở lại chính, 606 00:37:03,560 --> 00:37:08,320 nó sẽ quay trở lại bất cứ địa chỉ trong hộp màu đỏ. 607 00:37:08,320 --> 00:37:11,560 >> Bây giờ, trong trường hợp đăng ký phần mềm phá vỡ, 608 00:37:11,560 --> 00:37:14,400 địa chỉ đó là được trở lại là chức năng là những gì 609 00:37:14,400 --> 00:37:18,820 thường được gọi là sau khi bạn đã trả tiền cho phần mềm và inputted mã đăng ký của bạn? 610 00:37:18,820 --> 00:37:23,160 Bạn có thể sắp xếp lừa máy tính vào sẽ không ở đây, nhưng thay vào đó, xảy ra ở đây. 611 00:37:23,160 --> 00:37:27,950 Hoặc, nếu bạn thực sự thông minh, một đối thủ thực sự có thể gõ vào bàn phím, 612 00:37:27,950 --> 00:37:32,500 ví dụ, không phải là một từ thực tế, không phải là 20 ký tự, nhưng giả sử họ 613 00:37:32,500 --> 00:37:36,200 loại trong một số ký tự đại diện cho mã? 614 00:37:36,200 --> 00:37:38,860 Và nó sẽ không phải là mã C, nó sẽ là các nhân vật 615 00:37:38,860 --> 00:37:42,920 đại diện cho các mã máy nhị phân, 0 và 1. 616 00:37:42,920 --> 00:37:46,740 Nhưng giả sử họ đủ thông minh để làm điều đó, bằng cách nào đó dán vào dấu nhắc GetString 617 00:37:46,740 --> 00:37:49,460 một cái gì đó mà chủ yếu là mã biên dịch, 618 00:37:49,460 --> 00:37:56,900 và 4 byte cuối cùng ghi đè lên địa chỉ trả lại, và những gì địa chỉ nào mà đầu vào làm? 619 00:37:56,900 --> 00:38:01,860 Nó lưu trữ trong hình chữ nhật màu đỏ địa chỉ của byte đầu tiên của bộ đệm. 620 00:38:01,860 --> 00:38:04,270 Vì vậy, bạn phải thực sự thông minh, và điều này là rất nhiều thử và sai 621 00:38:04,270 --> 00:38:08,500 cho những người xấu ra khỏi đó, nhưng nếu bạn có thể tìm ra bộ đệm này lớn như thế nào, 622 00:38:08,500 --> 00:38:12,170 như vậy mà các byte cuối cùng trong đầu vào mà bạn cung cấp cho chương trình 623 00:38:12,170 --> 00:38:15,970 xảy ra được tương đương với địa chỉ bắt đầu của bộ đệm của bạn, 624 00:38:15,970 --> 00:38:22,270 bạn có thể làm điều này. Nếu chúng ta nói, bình thường, hello, và \ 0, đó là những gì kết thúc trong bộ đệm. 625 00:38:22,270 --> 00:38:27,860 Nhưng nếu chúng ta thông minh hơn, và chúng tôi điền vào đó bộ đệm với những gì chúng ta tổng quát sẽ gọi mã tấn công, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: Attack, tấn công, tấn công, tấn công, nơi này chỉ là một cái gì đó mà làm một cái gì đó xấu. 627 00:38:31,920 --> 00:38:35,190 Vâng, những gì sẽ xảy ra nếu bạn thực sự thông minh, bạn có thể làm điều này: 628 00:38:35,190 --> 00:38:41,740 Trong hộp màu đỏ ở đây là một dãy số: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Chú ý rằng đó phù hợp với số ở đây. 630 00:38:44,890 --> 00:38:47,280 Đó là theo thứ tự ngược, nhưng thêm vào một số thời gian mà các. 631 00:38:47,280 --> 00:38:51,430 Chú ý rằng địa chỉ này trở lại đã được cố tình thay đổi 632 00:38:51,430 --> 00:38:54,970 bằng địa chỉ lên đây, không phải là địa chỉ chính. 633 00:38:54,970 --> 00:39:00,170 Vì vậy, nếu kẻ xấu là siêu thông minh, anh ta hoặc cô ấy sẽ bao gồm trong đó mã tấn công 634 00:39:00,170 --> 00:39:02,890 một cái gì đó giống như, 'Xóa tất cả các tập tin của người dùng.' 635 00:39:02,890 --> 00:39:06,320 Hoặc 'Copy mật khẩu,' hoặc 'Tạo một tài khoản người dùng mà tôi có thể đăng nhập vào. 636 00:39:06,320 --> 00:39:10,130 Bất cứ điều gì ở tất cả, và điều này là nguy hiểm và quyền lực của C. 637 00:39:10,130 --> 00:39:12,900 Bởi vì bạn có thể truy cập vào bộ nhớ thông qua con trỏ 638 00:39:12,900 --> 00:39:15,950 và do đó bạn có thể viết bất cứ điều gì bạn muốn vào bộ nhớ của máy tính. 639 00:39:15,950 --> 00:39:19,290 Bạn có thể làm cho một máy tính làm bất cứ điều gì bạn muốn chỉ đơn giản bằng cách 640 00:39:19,290 --> 00:39:22,780 đã nhảy xung quanh trong không gian bộ nhớ riêng của mình. 641 00:39:22,780 --> 00:39:27,230 Và như vậy, cho đến ngày nay, do đó, nhiều chương trình và rất nhiều trang web đang bị tổn hại 642 00:39:27,230 --> 00:39:29,730 đun sôi xuống để những người lợi dụng điều này. 643 00:39:29,730 --> 00:39:32,510 Và điều này có vẻ giống như một cuộc tấn công siêu tinh vi, 644 00:39:32,510 --> 00:39:34,220 nhưng nó không luôn luôn bắt đầu theo cách đó. 645 00:39:34,220 --> 00:39:36,770 >> Thực tế là những gì người xấu thường sẽ làm, 646 00:39:36,770 --> 00:39:41,470 cho dù đó là một chương trình tại một dòng lệnh hoặc một chương trình GUI hoặc một trang web, 647 00:39:41,470 --> 00:39:43,290 bạn chỉ cần bắt đầu cung cấp vô nghĩa. 648 00:39:43,290 --> 00:39:46,940 Bạn gõ vào một từ thực sự lớn vào lĩnh vực tìm kiếm và nhấn Enter, 649 00:39:46,940 --> 00:39:49,030 và bạn chờ đợi để xem nếu các sự cố trang web. 650 00:39:49,030 --> 00:39:53,270 Hoặc bạn chờ đợi để xem chương trình thể hiện một số thông báo lỗi. 651 00:39:53,270 --> 00:39:55,480 Bởi vì nếu bạn nhận được may mắn, vì kẻ xấu, 652 00:39:55,480 --> 00:39:59,610 và bạn cung cấp một số đầu vào điên mà bị treo chương trình, 653 00:39:59,610 --> 00:40:02,280 điều đó có nghĩa là các lập trình viên đã không dự đoán hành vi xấu của bạn 654 00:40:02,280 --> 00:40:05,420 có nghĩa là bạn có thể có lẽ, với những nỗ lực đủ, 655 00:40:05,420 --> 00:40:09,870 đủ thử và sai, tìm ra cách để tiến hành một cuộc tấn công chính xác hơn. 656 00:40:09,870 --> 00:40:15,900 Vì vậy, nhiều một phần của an ninh không chỉ tránh các cuộc tấn công hoàn toàn, nhưng phát hiện thấy 657 00:40:15,900 --> 00:40:20,250 và thực sự nhìn vào các bản ghi và nhìn thấy những gì các yếu tố đầu vào điên có người gõ vào trang web của bạn. 658 00:40:20,250 --> 00:40:26,040 Thuật ngữ tìm kiếm có người gõ vào trang web của bạn với hy vọng tràn một số bộ đệm? 659 00:40:26,040 --> 00:40:28,900 Và tất cả điều này nắm những điều cơ bản đơn giản của một mảng là những gì, 660 00:40:28,900 --> 00:40:32,510 và nó có ý nghĩa gì để phân bổ và sử dụng bộ nhớ? 661 00:40:32,510 --> 00:40:34,920 Và liên quan đó, cũng là điều này. 662 00:40:34,920 --> 00:40:37,520 >> Vì vậy, chúng ta hãy chỉ lướt qua bên trong của một ổ đĩa cứng một lần nữa. 663 00:40:37,520 --> 00:40:40,190 Vì vậy, bạn nhớ lại từ một hoặc hai tuần trước khi bạn kéo file 664 00:40:40,190 --> 00:40:45,470 thùng rác, thùng rác, những gì sẽ xảy ra? 665 00:40:45,470 --> 00:40:47,850 [Sinh viên] Không có gì. >> Yeah, hoàn toàn không có gì. Cuối cùng, nếu bạn chạy thấp 666 00:40:47,850 --> 00:40:51,370 trên không gian đĩa, Windows hay Mac OS sẽ bắt đầu xóa các tập tin cho bạn. 667 00:40:51,370 --> 00:40:53,670 Nhưng nếu bạn kéo một cái gì đó trong đó, sau đó nó không phải ở tất cả an toàn. 668 00:40:53,670 --> 00:40:56,550 Tất cả thành viên cùng phòng, bạn bè hay gia đình của bạn đã làm là nhấn đúp chuột, và thì đấy. 669 00:40:56,550 --> 00:40:59,720 Có tất cả các tập tin sơ sài mà bạn cố gắng để xóa. 670 00:40:59,720 --> 00:41:02,840 Vì vậy, hầu hết chúng ta ít nhất biết rằng bạn phải click chuột phải hoặc kiểm soát nhấp chuột 671 00:41:02,840 --> 00:41:05,320 và trống rỗng thùng rác, hoặc một cái gì đó như thế. 672 00:41:05,320 --> 00:41:07,900 Nhưng thậm chí sau đó, điều đó không hoàn toàn làm các trick. 673 00:41:07,900 --> 00:41:11,340 Bởi vì những gì sẽ xảy ra khi bạn có một tập tin trên ổ cứng của bạn 674 00:41:11,340 --> 00:41:14,590 đại diện cho một số tài liệu từ hoặc một số JPEG? 675 00:41:14,590 --> 00:41:18,820 Và điều này đại diện cho ổ đĩa cứng của bạn, và chúng ta hãy nói này mảnh đại diện cho tập tin đó, 676 00:41:18,820 --> 00:41:21,640 và nó bao gồm một bó toàn bộ của 0 và 1. 677 00:41:21,640 --> 00:41:25,470 Điều gì sẽ xảy ra khi bạn không chỉ kéo tập tin này vào thùng rác hoặc thùng rác, 678 00:41:25,470 --> 00:41:30,390 nhưng cũng có sản phẩm nào đó? 679 00:41:30,390 --> 00:41:32,820 Sắp xếp không có gì. Nó không phải hoàn toàn không có gì. 680 00:41:32,820 --> 00:41:37,630 Bây giờ nó chỉ là không có gì, bởi vì một chút gì đó xảy ra trong các hình thức của bảng này. 681 00:41:37,630 --> 00:41:41,170 Vì vậy, có một số loại cơ sở dữ liệu hoặc bảng bên trong bộ nhớ của máy vi tính 682 00:41:41,170 --> 00:41:44,470 mà thực chất có 1 cột cho tên file, 683 00:41:44,470 --> 00:41:50,550 và 1 cột cho vị trí tập tin, nơi này có thể là vị trí 123, chỉ cần một số ngẫu nhiên. 684 00:41:50,550 --> 00:41:58,270 Vì vậy, chúng ta có thể có một cái gì đó như x.jpg, và vị trí 123. 685 00:41:58,270 --> 00:42:02,870 Và những gì xảy ra sau đó, khi đổ thùng rác của bạn? 686 00:42:02,870 --> 00:42:06,720 Mà đi xa. Nhưng những gì không đi là 0 và 1 của. 687 00:42:06,720 --> 00:42:09,690 >> Vì vậy, những gì, sau đó, các kết nối đến pset 4? 688 00:42:09,690 --> 00:42:13,460 , Với pset 4, chỉ vì chúng tôi đã vô tình bị xóa 689 00:42:13,460 --> 00:42:15,890 thẻ flash nhỏ gọn đã có tất cả các hình ảnh, 690 00:42:15,890 --> 00:42:18,710 hay vì họ may mắn đã trở thành bị hỏng, 691 00:42:18,710 --> 00:42:21,170 không có nghĩa là 0 và 1 của không phải là vẫn còn đó. 692 00:42:21,170 --> 00:42:23,920 Có lẽ một vài trong số họ bị mất vì một cái gì đó đã bị hỏng 693 00:42:23,920 --> 00:42:26,530 trong ý nghĩa rằng một số 0 trở thành 1 và 1 trở thành số 0. 694 00:42:26,530 --> 00:42:30,460 Những điều xấu có thể xảy ra do lỗi của phần mềm hay phần cứng bị lỗi. 695 00:42:30,460 --> 00:42:33,510 Nhưng nhiều người trong số những bit, có thể thậm chí 100% trong số họ vẫn còn ở đó, 696 00:42:33,510 --> 00:42:38,330 nó chỉ là máy tính hoặc máy ảnh không biết nơi JPEG 1 bắt đầu 697 00:42:38,330 --> 00:42:41,660 và nơi JPEG 2 bắt đầu, nhưng nếu bạn, các lập trình viên, 698 00:42:41,660 --> 00:42:45,800 biết, với một chút hiểu biết, nơi mà những hình ảnh JPEG hoặc những gì họ trông như thế, 699 00:42:45,800 --> 00:42:49,570 bạn có thể phân 0 và 1 và nói, 'Ồ. JPEG. Ooh, JPEG. 700 00:42:49,570 --> 00:42:52,830 Bạn có thể viết một chương trình với thực chất chỉ là một vòng lặp trong khi 701 00:42:52,830 --> 00:42:56,100 phục hồi mỗi và mỗi một trong những tập tin. 702 00:42:56,100 --> 00:42:59,360 Vì vậy, bài học sau đó, là bắt đầu "an toàn" xóa bỏ các tập tin của bạn 703 00:42:59,360 --> 00:43:01,720 nếu bạn muốn tránh hiện tượng này. Vâng? 704 00:43:01,720 --> 00:43:06,940 [Sinh viên câu hỏi, không thể hiểu] 705 00:43:06,940 --> 00:43:11,150 >> Có nhiều bộ nhớ hơn so với trước khi 706 00:43:11,150 --> 00:43:14,790 Oh! Tốt câu hỏi. Vậy tại sao, sau đó, sau khi dọn sạch thùng rác, 707 00:43:14,790 --> 00:43:18,300 sao máy tính của bạn cho bạn biết rằng bạn có nhiều không gian miễn phí so với trước khi? 708 00:43:18,300 --> 00:43:22,450 Tóm lại, bởi vì nó nói dối. Về mặt kỹ thuật, bạn không có nhiều không gian hơn. 709 00:43:22,450 --> 00:43:26,720 Bởi vì bây giờ bạn đã nói, bạn có thể đặt các công cụ khác, nơi mà tập tin một lần, 710 00:43:26,720 --> 00:43:28,930 nhưng điều đó không có nghĩa là các bit được đi xa, 711 00:43:28,930 --> 00:43:33,070 và điều đó không có nghĩa là các bit được thay đổi tất cả 0, ví dụ, để bảo vệ bạn. 712 00:43:33,070 --> 00:43:37,520 Ngược lại, nếu bạn "an toàn" các tập tin xóa, hoặc thể chất phá hủy các thiết bị, 713 00:43:37,520 --> 00:43:40,810 đó thực sự là cách duy nhất, đôi khi, xung quanh đó. 714 00:43:40,810 --> 00:43:45,300 Vì vậy, tại sao chúng ta không để lại lưu ý rằng bán đáng sợ, và chúng ta sẽ thấy bạn vào hôm thứ Hai. 715 00:43:45,300 --> 00:43:52,810 CS50.TV