数据可视化以进行模式分析(与语言无关,但首选R)


11

我想从磁盘映像中绘制字节,以便了解其中的模式。这主要是一项学术任务,因为我几乎可以确定这种模式是由磁盘测试程序创建的,但是无论如何我都希望对其进行反向工程。

我已经知道该模式是对齐的,具有256个字符的周期性。

我可以设想出两种可视化此信息的方式:通过时间查看的16x16平面(3个维度),其中每个像素的颜色是字符的ASCII码,或者每个周期256个像素行(2个维度)。

这是模式的快照(可以看到多个),通过xxd(32x16)可以看到:

模式分析

无论哪种方式,我都试图找到一种可视化此信息的方法。对于任何人来说,进行信号分析可能都不难,但是我似乎找不到使用开源软件的方法。

我想避免使用Matlab或Mathematica,并且我更喜欢R中的答案,因为我最近一直在学习它,但是无论如何,任何语言都是可以接受的。


更新,2014-07-25:鉴于以下Emre的答案,这是该模式的样子,鉴于该模式的前30MB,以512而不是256对齐(此对齐看起来更好):

图形图案

任何进一步的想法都欢迎!


数据的示例/摘录(可能只有几个MB)可能很有趣。
Marco13

如果您对数据的周期性感兴趣,那么可以看看数据的DFT。
mrmcgreg 2014年

@mrmcgreg:我将不得不重新学习DFT的工作原理。我应该更加关注信号和系统类:)
Valmiky Arquissandas 2014年

Answers:


5

我将使用视觉分析。由于您知道每256个字节有一个重复,因此创建一个256像素宽但深得多的图像,并使用亮度对数据进行编码。在(i)python中,它看起来像这样:

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);

这是PDF的样子:

可视化的PDF文件

256字节的周期性模式将以垂直线的形式出现。除了标题和尾部,它看起来很吵。


这看起来很像我在寻找什么。我现在正在为决赛做准备,无法花时间再考虑一下,但我会尽快通知您。“一个256字节的周期性模式将表现为垂直线。” -正是我的想法。我还可以显示一个图像,将所有256个字节放在同一行中,这在文本中已经很明显了。我很奇怪会发生什么:)
Valmiky Arquissandas 2014年

我似乎无法在Debian Linux上运行它。我安装了软件包python-scitoolsipython。错误消息是ValueError: invalid literal for int() with base 10: '#'。我会看看我是否仍能使它工作……
Valmiky Arquissandas 2014年

我成功(通过运行代码直接内ipython,并改变map(int, line)map(ord, line),并与新画面更新的问题。
Valmiky Arquissandas

我花了一年的时间,但我决定接受这个答案。我仍然不知道那个比特流是什么,但是我可能找不到。它确实有一个不错的模式!
Valmiky Arquissandas 2015年

1

我对信号分析几乎一无所知,但是使用R可以轻松实现二维可视化。特别是您需要reshape2ggplot2打包。假设您的数据很(例如[n X 256]大小),首先需要使用包中的函数将其转换为格式。然后使用中的几何。这里是一个很好的配方要点melt()reshape2geom_tileggplot2


2
超过4 GB的数据。我应该通过阅读stdin或类似的东西来绘制它。将所有内容都加载到RAM是一个坏主意。几天后,我将看看您所说的内容-希望还会出现其他想法-谢谢,我将告诉您它的进行情况!
Valmiky Arquissandas 2014年

不要将其加载并像对待数据帧一样对待,而不要像对待数据帧一样对待,而是将其视为字节流。
Spacedman 2014年

1

我将看一下raster用于此的程序包,它可以读取原始二进制数据并将其显示为NxM网格。它甚至可以提取大型二进制网格的子集,而无需读取整个文件(R光栅对象本身只是数据的代理,而不是数据本身)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.