Quero plotar os bytes de uma imagem de disco para entender um padrão neles. Isso é principalmente uma tarefa acadêmica, pois tenho quase certeza de que esse padrão foi criado por um programa de teste de disco, mas eu gostaria de fazer a engenharia reversa de qualquer maneira.
Eu já sei que o padrão está alinhado, com uma periodicidade de 256 caracteres.
Posso visualizar duas maneiras de visualizar essas informações: um plano de 16x16 visualizado no tempo (3 dimensões), em que a cor de cada pixel é o código ASCII do personagem ou uma linha de 256 pixels para cada período (2 dimensões).
Este é um instantâneo do padrão (você pode ver mais de um), visto através xxd
(32x16):
De qualquer forma, estou tentando encontrar uma maneira de visualizar essas informações. Provavelmente, isso não é difícil para ninguém na análise de sinais, mas não consigo encontrar uma maneira de usar software de código aberto.
Gostaria de evitar o Matlab ou o Mathematica e preferiria uma resposta em R, já que tenho aprendido isso recentemente, mas mesmo assim qualquer idioma é bem-vindo.
Atualização, 25/07/2014: dada a resposta de Emre abaixo, é assim que o padrão se parece, dados os primeiros 30 MB do padrão, alinhados em 512 em vez de 256 (esse alinhamento parece melhor):
Outras idéias são bem-vindas!
fonte
Respostas:
Eu usaria uma análise visual. Como você sabe que há uma repetição a cada 256 bytes, crie uma imagem com 256 pixels de largura por mais de profundidade e codifique os dados usando o brilho. Em (i) python, ficaria assim:
É assim que um PDF se parece:
Um padrão periódico de 256 bytes se manifestaria como linhas verticais. Exceto pelo cabeçalho e cauda, parece bastante barulhento.
fonte
python-scitools
eipython
. A mensagem de erro éValueError: invalid literal for int() with base 10: '#'
. Vou ver se eu posso fazê-lo funcionar de qualquer maneira ...ipython
, e mudarmap(int, line)
paramap(ord, line)
, e atualizei a questão com a nova imagem.Eu sei quase nada sobre análise de sinais, mas 2-dimensional visualização pode ser feito facilmente usando R. Particularmente você precisará
reshape2
eggplot2
pacotes. Supondo que seus dados sejam amplos (por exemplo, tamanho [n X 256]), primeiro você precisará transformá-los em formato longo usando amelt()
função doreshape2
pacote. Em seguida, use ageom_tile
geometria deggplot2
. Aqui está uma boa receita com essência .fonte
Eu examinaria o
raster
pacote para isso, que pode ler dados binários brutos e apresentá-lo como grades NxM. Pode até extrair subconjuntos de grandes grades binárias sem ter que ler o arquivo inteiro (o próprio objeto rasterizado R é apenas um proxy para os dados, não para os próprios dados).fonte