如何解析二进制文件中的文本数据

本文关键字:文本 数据 何解析 二进制文件 | 更新日期: 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++)。