[MÚSICA DE JOGO] DAVID J. MALAN: Tudo bem. Este é CS50, e esta é o final da quarta semana. E um dos temas hoje é a de forense digital, técnica de recuperar a informação. E, de fato, muito embora você está no meio agora da Paz em Três e Breakout, na próxima semana, o foco será em precisamente neste domínio. Então, um dos trabalhos mais legais que eu já teve foi em pós-graduação, quando eu estava trabalhando para o local, Middlesex County District Attorney escritório, fazendo forense trabalhar. Então, basicamente, o Massachusetts Polícia do Estado, na ocasião, quando se trabalha em casos seria trazer coisas como discos rígidos e disquetes e cartões de memória e similares. E eles iriam entregá-los para mim e meu mentor, e nosso objetivo era encontrar provas, se havia algum, nestes meios. Vislumbres Agora, você pode ter visto deste mundo da ciência forense na mídia, TV e cinema. Mas o trabalho que eu tinha, e ouso dizer que o mundo, não é bem assim que você vê-lo. Vamos dar uma olhada no que você provavelmente já viu. [REPRODUÇÃO] -OK. Agora, vamos dar uma boa olhada em você. [MÚSICA DE JOGO] -Segure Ele. Correr de volta. Espere um minuto. Vá para a direita. -Há. Congelar isso. Tela -Full. -OK. Congelar isso. -Tighten-Se sobre isso, você vai? -vector Em em que cara pela roda traseira. -zoom Em direito aqui neste local. -Com O equipamento certo, o imagem pode ser ampliada e afiada. -Qual Que é isso? -É Um programa de melhoramento. -Consegue Claro que se for o caso? Năo sei. Vamos melhorá-lo. -Aprimore Seção A6. Eu aumentei o detalhe, e-- -Acho Há o suficiente para melhorar. Liberá-lo para a tela do computador. -I Reforçada a reflexão em seus olhos. -Vamos Executar este meio aprimoramento de vídeo. -Edgar, Você pode melhorar isso? -hang Em. -Eu Vindo a trabalhar sobre esta reflexão. Reflexo de alguém -Há. -Reflection. -Há Um reflexo do rosto do homem. Reflexão -The! -Há Uma reflexão. -zoom Em no espelho. Você pode ver um reflexo. Você-pode melhorar a imagem a partir daqui? Você-pode melhorá-lo? Você-pode melhorá-lo? -Podemos Melhorar isso? Você-pode melhorá-lo? -Segure Um segundo. Eu vou melhorar. -zoom Em na porta. -Times 10. -Zoom. -Mover Em. -Mais. Espere, pare. Pare. -PAUSE Ele. -Rotate Nos 75 graus em torno da vertical, por favor. Pare. Volte para a parte sobre a porta novamente. -Tem Um intensificador de imagem que pode bitmap? -Talvez Podemos usar o Pradeep Singh método para ver nas janelas. -The Software é o estado da arte. -The Autovalor está desligado. -Com Direita combinação de algorithms-- Iluminação tomadas -Ele algoritmos para o próximo nível, e eu posso usá-los para melhorar esta fotografia. -lock On e ampliar o eixo z. -Aprimore. Aprimorar. -Aprimore. -Freeze E melhorar. [FIM REPRODUÇÃO DE VÍDEO] DAVID J. MALAN: Então, essas são todas as palavras, mas não eram usado em frases corretamente. E, de fato, no futuro, a qualquer hora, por favor, você ouve alguém dizer a palavra, "Melhorar", rir um pouco. Porque quando você tenta melhorar, por exemplo, isso é o que acontece. Então aqui vai uma foto linda. Isto é próprio Daven de CS50. E suponha que queríamos focar na brilho nos olhos, ou a reflexão do bandido que estava claramente capturada pela câmera de segurança. Isto é o que acontece quando você aumentar o zoom em uma imagem que tem apenas um número finito de bits associados. Isso é o que você iria ficar. E, de fato, está no olho do Daven é, mas quatro, talvez seis pixels que compõem exatamente o que foi brilhando lá. Então Problem Set Quatro acabará por ter você explorar este mundo, especialmente pela natureza de algo que chamamos de arquivo I / O, onde i / o é apenas uma maneira elegante de dizendo entrada e saída. Então, até agora, todas as interações que tivemos com um computador ter sido em grande parte com o seu teclado e ecrã, mas não tanto com o disco rígido, ou gravar os ficheiros para além dos que você você mesmo escrever. Seus programas, até agora, tem não vindo a criar e salvar, e atualização de seus próprios arquivos. Bem, o que é um arquivo? Bem, algo como um JPEG. Esta é uma imagem que você pode ter ou fazer upload para o Facebook, ou ver em qualquer lugar na web. Na verdade, essa foto que acabamos de serra de Daven foi um JPEG. E o que é interessante sobre arquivos como JPEGs é que eles podem ser identificados, tipicamente, por certos padrões de bits. Em outras palavras, o que é que distingue um JPEG a partir de um GIF a partir de um PING a partir de uma palavra documento a partir de um arquivo do Excel? Bem, é apenas diferente padrões de bits. E esses padrões diferentes são geralmente no início desses ficheiros. De modo que quando o computador abre uma Palavra doc, ou quando um computador abre um JPEG, parece tipicamente na primeiro de vários bits no arquivo. E se reconhece um padrão, ele diz, oh, esta é uma imagem. Deixe-me apresentá-lo ao o usuário como um gráfico. Ou, oh, isso se parece com um documento do Word. Deixe-me mostrar para o usuário como um ensaio. Assim, por exemplo, JPEGs, ao que parece, são bastante sofisticado debaixo do capô. Mas os três primeiros bytes em quase todas as JPEG começar com estes três números. Assim byte zero, um, dois e são, em mais cada JPEG, 255, então o número 216, em seguida, o número 255. E o que você vai ser capaz para começar a fazer na próxima semana é, na verdade, cutucando por baixo a capa de arquivos como JPEGs e como arquivos de bitmap, e vendo o que sempre esteve lá por tanto tempo como você está usando um computador. Mas o que está lá não é tipicamente escrito como números decimais como este. Os cientistas da computação não tendem a falar em decimal. Eles realmente não falam em binário. Normalmente, quando queremos para expressar números, nós realmente usar hexadecimal, que você pode recordar de, digamos, Conjunto de Problemas Um deles, que desafiou você pensar em um sistema diferente. Nós, é claro, estão familiarizados com decimal, de zero a nove. Nós conversamos sobre binário. E nós realmente não têm usar muito aqui em diante, porque os computadores irão usar isso. Mas os programadores vão muito muitas vezes, mas não sempre, usar hexadecimal, o que significa apenas você tem 16 letras no alfabeto, em oposição a duas ou 10. Então, como você contar até maior de nove em hexadecimal? Você vai 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, apenas por convenção. Mas o que é fundamental é que cada destes é um único símbolo. Não há 10. Não existe 11, por si só, porque cada de seus dígitos, assim como em decimal e, assim como no sistema binário, deve apenas ser um personagem único, por convenção. Para que, então, é o alfabeto que temos à nossa disposição para hexadecimal. Então, o que um JPEG olhar como se você eram para escrever os três primeiros não bytes como decimal, mas, por exemplo, como hexadecimal? E por que é hex mesmo tão útil? Bem, uma rápida olhada em um exemplo. Então, se eu escrever os bits que representam estes Números de decimal isso pode ser um pouco enferrujado agora de algumas semanas atrás, mas o esquerdo e o um direito é muito fácil. 255 foi o maior que o número poderia representar com oito bits. Era todos os queridos. Então, a única que é ligeiramente interessante é o do meio. E se você tipo de fazer a matemática, você vai deduzir que, de fato, esse padrão de um e zeros representa 216. Então vamos estipular para agora que estes estão corretos. Mas por que isso é interessante? Bem, um byte, é claro, é de oito bits. E verifica-se que se você pensar de um byte de dois blocos de quatro bits, assim. Deixe-me apenas acrescentar um pouco de espaço. Então, antes, depois. Eu acabei de adicionar algum espaço em branco pelo amor de visualização aqui. Como podemos agora representar em, digamos, hexadecimal cada quad de bits, cada conjunto de quatro bits? Assim, por exemplo, no lado esquerdo agora, temos 1111 em binário. Qual é esse número em decimal, se você fizer a matemática? Você tem a casa das unidades, o local dois, o lugar de quatro, eo lugar oitos. AUDIÊNCIA: 15. DAVID J. MALAN: É 15. Então, se fizermos oito mais quatro mais dois mais um, temos 15. Então, eu poderia escrever 15 abaixo 1111, mas o ponto aqui é hexadecimal, não decimal. Então, ao invés de escrever 15, 1-5, Eu vou escrever isso em hexadecimal, que se você olhar para trás, se você tiver zero a f, o que é 15 vai ser? AUDIÊNCIA: f. DAVID J. MALAN: Então não é que a sua f. E você pode resolver isso, dizendo: assim, se um é 10, então OK, f é 15. Então, na verdade, poderíamos reescrever este mesmo conjunto de números como f f. E então, se fizermos um pouco de matemática, vamos deduzir que isso é d. Oito é muito fácil, porque nós ter um no lugar oitos. E então, temos um casal mais f f do. Então, o que os seres humanos tendem a fazer por convenção quando usam hexadecimal é que eles simplesmente escrever este um pouco mais sucinta, se livrar da maior parte desse espaço em branco. E só para ser super claro para leitores que este é hexadecimal, a simples convenção entre seres humanos é você escrever de zero x, que não tem outro significado do que um identificador visual, aqui vem um número hexadecimal. E então, você coloca os dois dígitos, f f neste caso, em seguida, d a, então f f. Então, longa história curta, hexadecimal só tende para ser útil porque cada um dos seus dígitos, de zero a f, perfeitamente linhas acima com um padrão de quatro bits. Então, se você tem dois dígitos hexadecimais, zero a F, uma e outra vez, que lhe dá perfeitamente oito bits ou um byte. Então é por isso que tende a convencionalmente ser útil. Não há intelectual conteúdo muito além disso, diferente da sua real utilidade. Agora JPEGs não são a única formatos de arquivo para gráficos. Você deve se lembrar que existem arquivos como este no mundo, pelo menos a partir de alguns anos atrás. Portanto, este foi realmente instalado no Windows XP em milhões de PCs em todo o mundo. E este era um arquivo bitmap, BMP. E um arquivo de bitmap, como você verá no próximo semana, apenas significa um padrão de pontos, pixels, como são chamados, Um mapa em pedaços, na verdade. Então, o que é interessante, porém, sobre o formato de arquivo, BMP, é que debaixo do capô, ele tem mais do que apenas três bytes que compor seu cabeçalho, assim dizer, as primeiras mordidas. Ele realmente parece um pouco complicado à primeira vista. E você vai ver isso no conjunto P. E recebendo algo especial deste agora não é tão importante, como apenas o facto que, no início de cada bitmap arquivo, um formato gráfico, há um monte de números. Agora, a Microsoft, a autor deste formato, tende a chamar aqueles As coisas não inteiros e caracteres e carros alegóricos, mas palavras e d palavras e anseia e bytes. Então, eles são apenas diferentes tipos de dados. Eles são nomes diferentes para a mesma coisa. Mas você vai ver que em P Set Four. Mas isso é só para dizer que se um ser humano clica duas vezes em algum arquivo bmp em seu ou seu disco rígido, e uma janela se abre up mostrando-lhe que a imagem, isso aconteceu porque a operação sistema presumivelmente notado não só a extensão do arquivo bmp no nome do arquivo, mas também o fato de que há alguns convenção para o padrão de bits no início desse arquivo bitmap. Mas vamos agora concentrar-se em um arquivo complicado tal, mas em algo como isso. Suponha que aqui em GEdit, I só tem o começo de um programa que é muito simples. Eu tenho algumas inclui em cima. Agora eu tenho "structs.h" # include mas Eu vou voltar a isso em um momento. Mas isto é útil para agora. Portanto, este é um programa que vai implementar como banco de dados do registrador. Assim, um banco de dados de alunos, e cada aluno no mundo tem um nome e uma casa e, provavelmente, alguns outras coisas, mas vamos mantê-lo simples. Cada estudante tem um nome e uma casa. Então, se eu queria escrever um programa cujo objetivo na vida foi apenas para fazer uma iteração do zerar em até três, se há três estudantes na Universidade de Harvard. E eu só quero pegar, usando GetString, O nome de cada aluno e da casa, e depois é só imprimir os para fora. Esta é uma espécie de Semana One, Two Week coisas agora, onde eu só quero uma para loop ou algo parecido. E eu quero chamar GetString alguns vezes, e em seguida, imprimir f algumas vezes. Então, como eu poderia fazer isso, porém, quando um nome e uma casa estão envolvidos para cada aluno? Então, meu primeiro instinto pode ser para fazer algo assim. Eu poderia dizer em primeiro lugar, bem, dê-me, dizer, uma matriz de strings chamados nomes. E eu não quero um hardcode três aqui. O que eu quero colocar lá? Para que os alunos, porque isso é apenas uma constante declarado na parte superior, apenas para que eu não tenho que codificar três em vários lugares. Desta forma, eu posso mudá-lo um lugar, e isso afeta uma mudança em todos os lugares. E então, eu poderia fazer cadeia abriga alunos. E agora, eu poderia fazer algo assim for (int i = 0; i