Visualización de datos para análisis de patrones (independiente del lenguaje, pero se prefiere R)

11

Quiero trazar los bytes de una imagen de disco para comprender un patrón en ellos. Esto es principalmente una tarea académica, ya que estoy casi seguro de que este patrón fue creado por un programa de prueba de disco, pero me gustaría realizar ingeniería inversa de todos modos.

Ya sé que el patrón está alineado, con una periodicidad de 256 caracteres.

Puedo imaginar dos formas de visualizar esta información: un plano de 16x16 visto a través del tiempo (3 dimensiones), donde el color de cada píxel es el código ASCII para el personaje, o una línea de 256 píxeles para cada período (2 dimensiones).

Esta es una instantánea del patrón (puede ver más de uno), visto a través de xxd(32x16):

Patrón para analizar

De cualquier manera, estoy tratando de encontrar una manera de visualizar esta información. Probablemente esto no sea difícil para nadie en el análisis de señales, pero parece que no puedo encontrar una manera de usar software de código abierto.

Me gustaría evitar Matlab o Mathematica y preferiría una respuesta en R, ya que la he estado aprendiendo recientemente, pero no obstante, cualquier idioma es bienvenido.


Actualización, 25/07/2014: dada la respuesta de Emre a continuación, así es como se ve el patrón, dados los primeros 30 MB del patrón, alineados en 512 en lugar de 256 (esta alineación se ve mejor):

Patrón gráfico

Cualquier otra idea es bienvenida!

Valmiky Arquissandas
fuente
Un ejemplo / extracto de los datos (quizás solo unos pocos MB) podría ser interesante.
Marco13
Si está interesado en la naturaleza periódica de los datos, echar un vistazo a la DFT de los datos podría ser revelador.
mrmcgreg
@mrmcgreg: tendré que volver a aprender cómo funciona el DFT. Debería haber prestado más atención a las clases de señales y sistemas :)
Valmiky Arquissandas

Respuestas:

5

Yo usaría un análisis visual. Como sabe que hay una repetición cada 256 bytes, cree una imagen de 256 píxeles de ancho por la profundidad que sea y codifique los datos con brillo. En (i) python se vería así:

import os, numpy, matplotlib.pyplot as plt

%matplotlib inline

def read_in_chunks(infile, chunk_size=256):
    while True:
        chunk = infile.read(chunk_size)
        if chunk:
            yield chunk
        else:
            # The chunk was empty, which means we're at the end
            # of the file
            return

fname = 'enter something here'
srcfile = open(fname, 'rb')
height = 1 + os.path.getsize(fname)/256
data = numpy.zeros((height, 256), dtype=numpy.uint8)    

for i, line in enumerate(read_in_chunks(srcfile)):
    vals = list(map(int, line))
    data[i,:len(vals)] = vals

plt.imshow(data, aspect=1e-2);

Así es como se ve un PDF:

Un archivo PDF visualizado

Un patrón periódico de 256 bytes se habría manifestado como líneas verticales. Excepto por el encabezado y la cola, parece bastante ruidoso.

Emre
fuente
Esto se parece bastante a lo que estoy buscando. Estoy estudiando para la final ahora y no puedo tomar el tiempo para pensar en esto nuevamente, pero tan pronto como pueda, te lo haré saber. "Un patrón periódico de 256 bytes se habría manifestado como líneas verticales". - exactamente en lo que estaba pensando. También puedo mostrar una imagen donde pongo los 256 bytes en la misma línea, y eso ya es obvio en el texto. Tengo mucha curiosidad sobre lo que saldrá de ella :)
Valmiky Arquissandas
Parece que no puedo ejecutar esto en Debian Linux. Instalé los paquetes python-scitoolsy ipython. El mensaje de error es ValueError: invalid literal for int() with base 10: '#'.
Veré
Tuve éxito (ejecutando el código directamente en el interior ipython, y cambiando map(int, line)a map(ord, line), y actualicé la pregunta con la nueva imagen.
Valmiky Arquissandas
Me llevó un año, pero decidí aceptar esta respuesta. Todavía no sé qué es ese flujo de bits, pero probablemente no lo descubra. ¡Sin embargo, tiene un bonito patrón!
Valmiky Arquissandas
1

No sé casi nada sobre el análisis de señales, pero la visualización de 2 dimensiones se podía hacer fácilmente usando R. Particularmente necesitará reshape2y ggplot2paquetes. Suponiendo que sus datos son anchos (por ejemplo, tamaño [n X 256]), primero debe transformarlos a formato largo utilizando la melt()función del reshape2paquete. Luego usa geom_tilegeometría de ggplot2. Aquí hay una buena receta con esencia .

Sobach
fuente
2
Son más de 4 GB de datos. Debería trazarlo leyendo desde stdin o algo similar. Es una mala idea cargar todo en la RAM. Echaré un vistazo a lo que dijiste en un par de días, y con suerte, cualquier otra idea que pueda surgir, y te contaré cómo fue, ¡gracias!
Valmiky Arquissandas
No lo cargue y trátelo como un marco de datos, no es un marco de datos, es un flujo de bytes.
Spacedman
1

Vería el rasterpaquete para esto, que puede leer datos binarios sin procesar y presentarlo como cuadrículas NxM. Incluso puede extraer subconjuntos de grandes cuadrículas binarias sin tener que leer todo el archivo (el objeto R raster en sí mismo es solo un proxy de los datos, no los datos en sí).

Hombre espacial
fuente