Método mais rápido de trabalhar com bits de arquivos sem ser lendo byte por byte
4 respostas
mateusviccari
Olá, acabei de fazer um programinha que faz esteganografia(esconder uma mensagem secreta em um arquivo de imagem).
Ele está funcionando perfeitamente para os principais formatos de imagem, usando imagens pequenas o programa faz o processo rapidamente, porém algumas imagens grandes demora um pouco pra gravar o arquivo modificado, chegando a passar de 30 segundos pra imagens com 3 MB.
O programa funciona basicamente assim:
Olá, acabei de fazer um programinha que faz esteganografia(esconder uma mensagem secreta em um arquivo de imagem).
Ele está funcionando perfeitamente para os principais formatos de imagem, usando imagens pequenas o programa faz o processo rapidamente, porém algumas imagens grandes demora um pouco pra gravar o arquivo modificado, chegando a passar de 30 segundos pra imagens com 3 MB.
O programa funciona basicamente assim:
Gostaria de saber se é possivel trabalhar com os bits de arquivos de forma rápida mesmo com imagens grandes.
vc está lendo 1 byte por vez ? aí demora mesmo
rmendes08
Tanto o InputStream quanto o OutputStream tem métodos que te permitem ler/escrever blocos de bytes com arrays de bytes; Daí basta escolher um tamanho de array que equilibre E/S com processamento.
E
entanglement
Argh! Não faça isso.
Pra começar, converter para string em formato binário pode ser bom para você entender ou debugar seu programa, mas na prática é perda de tempo.
Em vez disso, você deve:
a) Trabalhar com blocos de bytes, lendo-os de uma vez (em vez de um byte de cada vez - argh ugh argh)
b) Usar operações que trabalham sobre bytes, como & , ^ ou |.
Por exemplo, digamos que eu quisesse setar o bit 7 (mais significativo) do byte 240 do array de bytes “by”.
Eu usaria:
by[240]|=(1<<7);
Para resetar o bit 0 (menos significativo) do byte 224:
by[224]&=~(1<<0);
Para inverter o bit 3 do byte 126:
by[126]^=(1<<3);
E
entanglement
Vou dar um exemplo de um programa que seta o bit 6 de cada byte do arquivo original.
Obviamente se você tentar fazer isso com um jpeg, vai acabar corrompendo o cabeçalho (ou seja, o arquivo vai ficar ilegível) e você não vai ter uma verdadeira estenografia.