2015-10-03 188 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++)。

相關問題