我想从C#中的二进制文件中读取DWARF信息。我知道有C库可以做到这一点,但是对于我的练习,我正在用C#/ .NET完全读取文件。 DWARF有一个公共头,然后其余信息可以存储Little-endian或Big-endian,具体取决于头中指定的内容。我想支持这两种格式。 DWARF只是一个例子 - 这个问题一般是关于读取和写入二进制文件(使用现有格式)。我可以想出几种方法来解决这个问题:
自定义阅读器将二进制流作为输入,并将其输出显示为IEnumerable<DwarfTypeX>
或IList<DwarfTypeX>
。当用户从阅读器中的属性中读取时,它会使用状态机等逐字节地从二进制流中解析数据。如果机器体系结构与文件体系结构不匹配,则解析器将读取字节反向并将它们反向写入结构或数组元素以纠正字节顺序。
这类似于上面的方法,除了我们使用Marshal.StructureToPtr
从流中提取整块二进制数据并将其推入结构中。但是,字节顺序需要在单独的步骤中进行纠正。生成的对象上的每个属性都知道如何将其后备存储转换为机器的字节序,或者在封送后显式交换后备存储。
Formatter实现public object Deserialize(Stream serializationStream)
并返回一个对象。这排除了输入流的随机部分解析。我的理解是这个方法必须完全解析它的对象。
在C#/ .NET中是否有以最佳实践方式读取二进制文件(使用现有格式)?我已经看到很多二进制序列化的例子,格式尚未已定义。