C++ 搜索日志文件

C++ 搜索日志文件,c++,excel,search,vim,C++,Excel,Search,Vim,可能重复: 我在一个600 Mb的大文件中搜索一个特殊的模式,它有7个十六进制值长。问题是 “模式”可能在下一行,并且 有几个地址行 通过消除所有回车符,我解决了问题1,但即使值在下一行,我仍然面临着一个问题,我不知道如何通过地址行进行搜索。下面是一个例子: 0x000001A0:36 5B 09 76 99 31 55 09 78 99 34 51 49 BF E0 03 0x000001B0:28 0B 0A 03 0B E0 07 28 0B 0A 03 0B 49 58 09 35 <

可能重复:

我在一个600 Mb的大文件中搜索一个特殊的模式,它有7个十六进制值长。问题是

  • “模式”可能在下一行,并且
  • 有几个地址行 通过消除所有回车符,我解决了问题1,但即使值在下一行,我仍然面临着一个问题,我不知道如何通过地址行进行搜索。下面是一个例子:
    0x000001A0:36 5B 09 76 99 31 55 09 78 99 34 51 49 BF E0 03

    0x000001B0:28 0B 0A 03 0B E0 07 28 0B 0A 03 0B 49 58 09 35


    < P> >:例如,我想找到模式>代码49 EF 03 0B 0B 0A<代码>,它跨越上面的行1和2,但是我不能只是定期搜索它,因为0x000 01B0:<代码>在开始的时候,任何建议或C++代码或Excel想法都会有帮助。目前我正在使用VIM打开这个大文件,而使用excel无法打开整个文件。

    Python,只需读取行,拆分,夹住第一部分,将十六进制转换为字符串,然后进行搜索。类似这样的方法会奏效:

    hex = ""
    for each line in lines:
        tmp = line.split() // split on whitespace
        hex += tmp[1:] // grab everything after address
    
    if hex.contains(pattern):
        # do something
    

    或者使用正则表达式,但您已经了解了基本概念。

    您可以使用循环缓冲区

  • 打开文件
  • 读一行
  • 读地址并把它分开
  • 读取第一个值并将其放入缓冲区
  • 读取下一个值,并抛出缓冲区的最后一个值(std::list可能适合这样做)
  • 检查缓冲区是否包含该模式
  • 循环通过5到线路的末端
  • 循环2到文件末尾

  • 你想用它做什么?如果您只是想查看它,我想任何开源的十六进制查看器都会有一个按十六进制搜索的函数。如果你想在C++脚本中做一些事情,那就是另一个问题。如果你正在运行Windows,或者只在C++上运行一个行,一次跳过一个行,然后搜索那个行,加上前面的行似乎不难写。你尝试了吗?@ AJG85做<代码> GRP有一种搜索方法,当文本可以在中间与其他任意文本交叉行边界时?我只想基本上查看它。从那里开始,直到我发现我也在考虑提供一个Python解决方案,但是这个问题特别地问C++。在执行搜索之前,我不会读取整个文件,它似乎效率低下,并且无法保留查找结果所需的地址。是否有人熟悉十六进制查看器?我基本上是想“查看”整个过程中的模式file@Tyler31-请看这里@Steve,谢谢你的链接。唯一的问题是,这是一个“文本”文件,而观众不知道它应该显示十六进制值,我该如何告诉它。嘿,有些是妖术?我在看XVI32,它甚至将文件中的某个地方的文本转换成hexYes,这些将与二进制数据一起工作,而二进制数据是您手中文本的来源。现在没有了吗?如果你仍然有原始的二进制数据,这个问题就更容易回答了。这不是我想要做的。sry