C# WPF 二进制读取

标签 c# wpf

好吧,我基本上想读取任何具有特定扩展名的文件。遍历所有字节并读取文件基本上很容易,但是如何获取下一个字节的类型呢?例如:

while ((int)reader.BaseStream.Position != RecordSize * RecordsCount)
{
// How do I check what type is the next byte gonna be?
// Example:
// In every file, the first byte is always a uint:
uint id = reader.GetUInt32();
// However, now I need to check for the next byte's type:
// How do I check the next byte's type?
}

最佳答案

字节没有类型。当某种语言类型的数据(例如 char 或 string 或 Long)被转换为字节并写入文件时,没有严格的方法来判断类型是什么:所有字节看起来都很相似,都是 0-255 之间的数字。

为了知道并从字节转换回结构化语言类型,您需要知道文件的写入格式。

例如,您可能知道该文件是作为 ascii 文本文件编写的,因此每个字节代表一个 ascii 字符。

或者您可能知道您的文件是以 {uint}{50 byte string}{linefeed} 格式编写的,其中前 2 个字节代表一个 uint,接下来的 50 个字节代表一个字符串,后跟一个换行符。

因为所有字节看起来都一样,如果您不知道文件格式,就无法以语义正确的方式读取文件。例如,我可能会向您发送一个我通过写出一些 ascii 文本创建的文件,但我可能会告诉您该文件充满了 2 字节的 uint。您可以编写一个程序来将这些字节读取为 2 字节 uint,它会起作用:任何 2 个字节都可以解释为 uint。我可以告诉其他人同一个文件由 4 字节 long 组成,他们可以将其读取为 4 字节 long:任何 4 字节都可以解释为 long。我可以告诉其他人该文件是一个 2 字节 uint 后跟 6 个 ascii 字符。等等。

许多类型的文件都有定义的格式:例如,Windows 可执行文件或 Linux ELF 二进制文件。

如果您对文件存在的原因有所了解,您也许能够猜出文件中字节的类型。但是不知何故你必须知道,然后你根据文件格式描述解释那些字节。

您可能会想“我会用描述它们的标记来写入字节,这样读取程序就可以知道每个字节的含义”。例如,带有“1”的字节可能意味着接下来的 2 个字节代表一个 uint,带有“2”的字节可能意味着后面的字节告诉字符串的长度,后面的字节是字符串,等等在。当然,你可以这样做。但是 (a) 读取程序仍然需要理解该约定,所以我上面所说的一切都是正确的(它一直都是海龟),(b) 该方法使用大量空间来描述文件,以及 (c)阅读程序需要知道如何解释动态描述的文件,这仅在某些情况下有用,并且可能意味着存在描述嵌入式元格式含义的元元格式。

长话短说,所有字节看起来都一样,读取程序必须先被告知这些字节代表什么,然后才能有意义地使用它们。

关于C# WPF 二进制读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35565584/

相关文章:

c# - 为什么转换为一个字节然后立即返回一个 int?

C#:如何在不公开字典的情况下浏览字典项目?

c# - Visual Studio 解决方案中的 Markdown 文档

c# - 由于 System.Windows.EffectiveValueEntry 而未处理对象

wpf - 将数据集/数据表绑定(bind)到 xaml 数据网格

wpf - 将网格列向右对齐

wpf - 如何将嵌套在类中的枚举分配给 XAML 属性?

c# - 使用 TempData 从 MVC 操作向 ViewBag 添加字符串值时出现问题

c# - Twilio 语音转录替换

c# - 将 Windows 窗体单元测试迁移到 WPF