c# - 在 C# 中读取/写入结构化二进制数据的最佳方式是什么

标签 c#

就像在 C 中一样,我们可以使用结构指针来读取或写入文件头等结构化二进制数据,在 C# 中是否有类似的方法来执行此操作?

最佳答案

使用 BinaryReaderBinaryWriterMemoryStream在我看来,这往往是最好的方式。

解析二进制数据:

byte[] buf = f                     // some data from somewhere
using (var ms = new MemoryStream(buf, false)) {   // Read-only
    var br = new BinaryReader(ms);

    UInt32 len = br.ReadUInt32();
    // ...
}

生成二进制数据:

byte[] result;
using (var ms = new MemoryStream()) {   // Expandable
    var bw = new BinaryWriter(ms);

    UInt32 len = 0x1337;
    bw.Write(len);
    // ...

    result = ms.GetBuffer();   // Get the underlying byte array you've created.
}

它们允许您读取和写入大多数文件头等所需的所有原始类型,例如 (U)Int16, 32, 64, SingleDouble,以及 bytechar 和它们的数组。直接支持 string,但前提是

The string is prefixed with the length, encoded as an integer seven bits at a time.

如果您以这种方式从 BinaryWriter 以这种方式编写字符串,这对我来说似乎才有用。然而,这很简单,假设您的字符串以双字长度为前缀,后跟那么多 ASCII 字符:

int len = (int)br.ReadUInt32();
string s = Encoding.ASCII.GetString(br.ReadBytes(len));

请注意,我没有BinaryReaderBinaryWriter 对象包装在 using() block 中。这是因为,虽然它们是 IDisposable,但它们的所有 Dispose() 所做的只是在底层流上调用 Dispose()(在这些示例中, MemoryStream)。

因为所有的 BinaryReader/BinaryWriter 都是一组 Read()/Write() 包装器围绕底层流,我不明白为什么它们是IDisposable。当您尝试做正确的事情并在您所有的 IDisposable 上调用 Dispose() 时,您的流会突然被处理掉,这只会让人感到困惑。

关于c# - 在 C# 中读取/写入结构化二进制数据的最佳方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13963508/

相关文章:

c# - 理论上存储非常非常大的数字

c# - 留下下拉组合框会吞噬 WPF 中的焦点

c# Outlook 插件强行将光标移动到电子邮件正文的末尾

c# - 如何从强命名主机使用 ServiceStack?

c# - VS2010数据库单元测试继承自ResultSetCondition

c# - .NET 或 C++ 中的 Erlang 风格并发

c# - Windows应用程序SDK 1.2 : How to prevent the application from shutdown when the main window is closed?

c# - 如何将 VB.net 常量转换为 C#?

c# - 保存对用户帐户的更改导致 DbUpdateConcurrencyException

c# - WPF 列表框选择已更改