2015-10-03 153 views
-2

您好我有一个包含大量资源,并使用C#我要查找和分析在这个文件是在ASCII像下面如何从一个二进制文件

大量的文本对象二进制文件解析文本数据二进制垃圾后跟一个前

ONMAP 0 131072 “说明” 0 “名称”, “FLAG” “FLAG” 7900.000000 0.000000 1499.999268 2.000000 6.000000 8.000000 1.000000 1.000000 1.000000 0 0 0 -1 1 0 0 -1 0.101900 2 36 255 换行符

大量的二进制垃圾的这些对象后

每个对象都以标记ONMAP开头,这些值由空格分隔,字符串用双引号引起来,并且必须按照它们写入的顺序读取,我们不知道数据在文件中的位置,所以我想要通过二进制文件搜索,直到找到onmap,并将属性读入List,但一旦发现onmap,我不知道如何解析属性。

+0

如果您存储二进制数据,为什么不存储二进制序列化的对象?然后反序列化它并使用属性?为什么让生活艰难? –

回答

0

我强烈建议通过获取包含指向字符串开头的点的文件格式来定位字符串的开头。下面的代码将在大多数情况下工作,但不能保证。 Gnu公用事业公司基本上也是这样。像这样的工具只能用作快速解决方案。二进制数据是伪随机数,可能有5个字符匹配是可能的,但非常偏远。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     enum State 
     { 
      FIND_ONMAP, 
      FIND_RETURN, 
      DONE 
     } 

     const string FILENAME = @"c:\temp\test.txt"; 
     static void Main(string[] args) 
     { 
      List<byte> onmap = Encoding.UTF8.GetBytes("ONMAP").ToList(); 

      FileStream stream = File.OpenRead(FILENAME); 
      int data = 0; 
      State state = State.FIND_ONMAP; 
      List<byte> buffer = new List<byte>(); 
      while ((data = stream.ReadByte()) != -1) 
      { 
       switch (state) 
       { 
        case State.FIND_ONMAP: 
         if (buffer.Count < 5) 
         { 
          buffer.Add((byte)(data & 0xff)); 
         } 
         else 
         { 
          buffer.RemoveAt(0); 
          buffer.Add((byte)(data & 0xff)); 
         } 
         if (buffer.SequenceEqual(onmap)) 
         { 
          state = State.FIND_RETURN; 
         } 
         break; 
        case State.FIND_RETURN: 
         if (data == 10) 
         { 
          state = State.DONE; 
          break; 
         } 
         else 
         { 
          buffer.Add((byte)(data & 0xff)); 
         } 
         break; 

       } 
       if (state == State.DONE) break; 

      } 


      if (state == State.DONE) 
      { 
       string results = Encoding.UTF8.GetString(buffer.ToArray()); 
       Console.WriteLine(results); 
       Console.ReadLine(); 
      } 

     } 
    } 
} 
​ 
0

有一个标准的Unix程序完全符合你的要求:strings

您可以在GNU binutils的寻源:

http://www.gnu.org/software/binutils/

这个程序是小和相对简单。它使用的“算法”直接适用于C#(或等同于Java或C++)。

相关问题