2016-02-22 122 views
2

好的,所以我基本上想读取具有特定扩展名的任何文件。遍历所有字节并读取文件基本上很容易,但获取下一个字节的类型又怎么样?例如: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? 
} 
+0

术语:写这样的文件称为序列化;阅读,反序列化。 –

回答

6

字节没有类型。当某些语言类型(如字符或字符串或Long)中的数据被转换为字节并写入文件时,没有严格的方式来说明类型是什么:所有字节看起来相似,数字从0到255。

为了了解,并从字节转换回结构的语言类型,你需要知道的是,文件格式书写的。

例如,你可能知道该文件被写成ascii文本文件,因此每个字节代表一个ASCII字符。

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

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

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

如果您知道文件存在的原因,您可以猜测文件中字节的类型。但不知何故,你必须知道,然后你根据文件格式描述来解释这些字节。

你可能会认为“我会用描述它们的标记写入字节,所以读取程序可以知道每个字节的含义”。例如,具有'1'的字节可能意味着接下来的2个字节表示一个uint,具有'2'的字节可能意味着下面的字节告诉字符串的长度,并且之后的字节是字符串,所以上。当然,你可以做到这一点。但是(a)阅读程序仍然需要了解这个约定,所以我上面所说的所有内容都是真实的(它始终是乌龟),(b)该方法使用大量空间来描述文件,以及(c)阅读程序需要知道如何解释动态描述的文件,该文件仅在某些情况下有用,并且可能意味着存在描述嵌入式元格式含义的元元数据格式。长话短说,所有字节看起来都是一样的,并且必须告诉阅读程序在这些字节能够有意义地使用它们之前所代表的内容。

+0

知道了,今天学到了新东西。谢谢。 :d – user4136548