如何解析二进制文件中的文本数据
本文关键字:文本 数据 何解析 二进制文件 | 更新日期: 2023-09-27 18:15:41
嗨,我有一个二进制文件,其中包含大量的资源和使用c#,我想找到并解析文本对象在这个文件中是在ASCII中,如下
前面有很多二进制垃圾ONMAP 0 131072 "description " 0 "name" "FLAG" "FLAG" 7900.000000 0.000000 1499.999268 2.000000 6.000000 8.000000 1.000000 1.000000 1.000000 000 -1 000 -1 0.101900 2 36 255后接换行符
这些对象后面有很多二进制垃圾
每个对象都以它的标签ONMAP开始,这些值由空格和双引号分隔,必须按照它们写入的顺序读取,我们不知道数据在文件中的位置,所以我想通过二进制搜索,直到找到ONMAP并将属性读取到列表中,但是一旦找到ONMAP,我不知道如何解析属性。
我强烈建议通过获取文件的格式来定位字符串的开头,该格式将包含指向字符串开头的点。下面的代码可以在大多数情况下工作,但不能保证。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();
}
}
}
}
有一个标准的Unix程序可以做您正在寻找的事情:字符串。
您可以在Gnu binutils下找到源代码:
http://www.gnu.org/software/binutils/程序很小,而且相对简单。它使用的"算法"直接适用于c#(或者,等价地,适用于Java或c++)。