Como essa pessoa codificou “Hello World” com o Microsoft Paint?

99

Acabei de ver isso nos últimos dias e não consigo descobrir como funciona. O vídeo de que falo está aqui :

É a resposta mais bem avaliada desta pergunta do Stack Overflow: Por que este programa foi rejeitado por três compiladores?

Como este bitmap consegue mostrar um programa C ++ para "Hello World"?

Eamonn O'Brien
fonte
7
valores de bitmap são apenas bits em um arquivo. Se você interpretar esses bits como ASCii, isso mostrará algo. Seleção cuidadosa de bits e você pode escrever uma carta, ou a constituição, em um bitmap (módulo o cabeçalho do arquivo). O que não é para entender? É apenas uma coisa boba, como o pior editor do mundo.
Thomas M. DuBuisson,
3
Por que vale a pena, não é , pelo menos, uma linguagem de programação onde o código fonte é expresso como uma imagem. Não que esta imagem em particular funcione com ele, mas ...
Michael Madsen,
1
O tópico que você estava procurando stackoverflow.com/questions/5508110/…
phwd
6
Esse GIF animado está matando meu navegador (IE e Chrome) - existem maneiras melhores de postar vídeos do que um GIF animado.
MusiGenesis de
3
@MusiGenesis Oh, como me lembro dos problemas de 2011.
Charles Clayton

Respostas:

56

Uma imagem BMP (DIB) é composta por um cabeçalho seguido por dados descompactados de 1 cor (para imagens de 24 bpp são 3 bytes por pixel, armazenados em ordem reversa de linha e com 4 bytes de avanço de linha).

Os bytes para dados de cores são usados ​​para representar cores (ou seja, nenhum deles é "obrigatório" pelo formato de arquivo 2 , todos eles vêm da cor de cada pixel), e há uma correspondência 1: 1 perfeita entre as cores dos pixels e os bytes escritos no arquivo; assim, usando cores perfeitamente escolhidas, você pode realmente escrever o que quiser no arquivo (com exceção do cabeçalho).

Ao abrir o arquivo gerado no bloco de notas, os dados de cores serão mostrados como texto; você ainda pode ver claramente do cabeçalho (a parte do BMinício do texto), que é exigido pelo formato do arquivo.

Na minha opinião, este vídeo foi feito da seguinte maneira: primeiro o autor calculou o tamanho necessário para o bitmap e criou um arquivo DIB do tamanho correto preenchido com uma cor que se expande para um padrão simples (por exemplo, todos os bytes 65 => 'A'); em seguida, substituiu esse padrão pelo código de "carga útil", conforme mostrado no vídeo.

Observe, no entanto, que não é impossível fazer tudo manualmente com o bloco de notas - com a caixa de diálogo do seletor de cores, uma tabela ASCII e um conhecimento básico do formato DIB, isso pode ser feito, mas seria muito mais lento e sujeito a erros.

Mais informações sobre o formato DIB


  1. Existem DIBs compactados RLE, mas, neste caso, bitmaps descompactados são usados ​​(e raramente são usados ​​de qualquer maneira).
  2. Com exceção do stride, isso foi evitado usando linhas múltiplas de 4 bytes.
Matteo Italia
fonte
19

Suponho que você esteja se referindo à resposta a uma das perguntas do Dia da Mentira.

Meu palpite é que cada pixel tem uma representação binária para ele. E que cada caractere no código-fonte tem uma representação binária para ele.

A pessoa que criou o programa deve ter calculado a cor de cada pixel que teria uma representação binária que corresponderia a cada personagem.

Andrew Grimm
fonte
7
+1: no final, bytes são bytes. O bloco de notas os interpreta como caracteres de texto, enquanto o mspaint os interpreta como pixels em um bitmap. O texto "lixo" inicial é a informação adicional da imagem (possivelmente coisas como resolução, versão, etc.).
Chris Schmich,
6

Do ponto de vista teórico da ciência da computação, seria interessante perguntar se todo programa pode ser escrito de forma que, visto como um bitmap, você realmente veja o código-fonte que faz a mesma coisa. Se você estiver seriamente interessado em tais resultados, leia, por exemplo, sobre o teorema do ponto fixo de Kleene .

O programa como imagem também pode ser visto como uma forma de ofuscação de código. Não que fosse particularmente prático ...

Osa
fonte