就像在 C 中一样,我们可以使用结构指针来读取或写入文件头等结构化二进制数据,在 C# 中是否有类似的方法来执行此操作?
最佳答案
使用 BinaryReader
和 BinaryWriter
在 MemoryStream
在我看来,这往往是最好的方式。
解析二进制数据:
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
, Single
、Double
,以及 byte
、char
和它们的数组。直接支持 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));
请注意,我没有将 BinaryReader
和 BinaryWriter
对象包装在 using()
block 中。这是因为,虽然它们是 IDisposable
,但它们的所有 Dispose()
所做的只是在底层流上调用 Dispose()
(在这些示例中, MemoryStream
)。
因为所有的 BinaryReader
/BinaryWriter
都是一组 Read()
/Write()
包装器围绕底层流,我不明白为什么它们是IDisposable
。当您尝试做正确的事情并在您所有的 IDisposable
上调用 Dispose()
时,您的流会突然被处理掉,这只会让人感到困惑。
关于c# - 在 C# 中读取/写入结构化二进制数据的最佳方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13963508/