如何编写文件格式处理程序

时间:2009-09-24 21:06:58

标签: c# .net

今天我在工作中剪切视频(是的我!),我遇到了一种奇怪的视频格式,一种带有伴随MOI文件的MOD文件格式。

我在wiki上发现了这个article,我想写一个文件格式处理程序,但我不知道如何开始。

我想写一个文件格式处理程序来读取信息文件,有没有人这样做过,我将如何开始?

编辑:

感谢所有的建议,我今晚要尝试这个,我会告诉你的。 MOI文件不是很大,最多可能是5KB(我没有在我面前)。

2 个答案:

答案 0 :(得分:3)

你很幸运,MOI格式至少说明了文件定义。您需要做的就是读入文件并根据文件定义解释结果。

根据定义,您应该能够创建一个可以读取和解释文件的类,该文件将所有文件格式定义作为各自类型的属性返回。

读取文件需要打开文件,通常以逐字节的方式读取文件,例如:

        using(FileStream fs = File.OpenRead(path-to-your-file)) {
            while(true) {
                int b = fs.ReadByte();
                if(b == -1) {
                    break;
                }
                //Interpret byte or bytes here....
            }
        }

根据wiki文章的引用PDF,看起来某人已经对该格式进行了逆向工程。从PDF中,这是格式中的第一个条目:

Hex-Address: 0x00
Data Type: 2 Byte ASCII
Value (Hex): "V6"
Meaning: Version

因此,一个简单的实现可以从文件流中提取前2个字节的数据并转换为ASCII,这将为Version提供属性值。

格式定义中的下一个条目:

Hex-Address: 0x02
Data Type: 4 Byte Unsigned Integer
Value (Hex): 
Meaning: Total size of MOI-file

解释接下来的4个字节并转换为unsigned int将为MOI文件大小提供属性值。

希望这有帮助。

答案 1 :(得分:0)

如果文件非常大并且只需要流式传输,我会创建一个新的阅读器对象,它使用非托管内存流来读取信息。

我已经完成了很多不同的文件格式处理。最近,我已经开始使我的读者更多功能,其中阅读倾向于使用'yield return'来从文件中返回只读对象。

然而,这一切都取决于你想做什么。如果您尝试创建用于其他应用程序或创建API的通用格式,则可能需要符合现有标准。但是,如果您只想将数据存入您自己的应用程序,那么您可以随意使用它。您可以在流上使用二进制读取器并在应用程序中构建所需的信息,或让读者返回表示文件内容的对象。

我会推荐一件事。确保它实现了IDisposable并将其包装在using!