C# BinaryReader.PeekChar()读取多少位?

C# BinaryReader.PeekChar()读取多少位?,c#,stream,binaryreader,C#,Stream,Binaryreader,我正在改进一个使用BinaryReader的流阅读器类。它由一个while循环组成,该循环使用.PeekChar()检查是否存在更多数据以继续处理 第一个操作是读取4字节的.ReadInt32()。如果PeekChar只“看到”一个字节(或一位),该怎么办?这似乎不是检查EOF的可靠方法 该函数是使用其默认参数构造的,据我所知,它使用UTF8作为默认编码。我假设.peek char()检查8位,但我真的不确定 .peek char()查找多少位?(检查EOF的其他方法有哪些?使您的读取*()调用

我正在改进一个使用
BinaryReader
的流阅读器类。它由一个while循环组成,该循环使用
.PeekChar()
检查是否存在更多数据以继续处理

第一个操作是读取4字节的
.ReadInt32()
。如果
PeekChar
只“看到”一个字节(或一位),该怎么办?这似乎不是检查EOF的可靠方法

该函数是使用其默认参数构造的,据我所知,它使用UTF8作为默认编码。我假设
.peek char()
检查8位,但我真的不确定

.peek char()
查找多少位?(检查EOF的其他方法有哪些?

使您的
读取*()
调用盲目进行,并处理抛出的任何异常是正常的方法。如果出现任何问题,我认为流位置不会移动。

这里

我读到:

ArgumentException:无法将当前字符解码为 内部字符缓冲区,使用为 小溪

这表明读取的内存量取决于应用于该流的编码

编辑

实际上,根据MSDN的定义是:

返回下一个可用的字符,不推进 字节字符位置。*

事实上,它取决于编码,如果这是一个字节或更多


希望这有帮助。

BinaryReader的PeekChar()方法有很多缺陷。即使尝试从带有UTF8编码数据的内存流中读取,PeekChar()也会在读取流的特定长度后引发异常。BCL团队已经承认了这个问题,但他们没有承诺解决这个问题。如果可以的话,他们唯一的反应就是避免使用PeekChar()。

如果流中还有1个字节,并执行一个
ReadInt32
,我会说您有一个错误条件,而不是EOF条件……如果返回类型是
System.Int32
,它不会读取32位吗?@Lucero我同意;在这种情况下,正在读取的文件格式不正确。我对这里的幕后活动很好奇。:)@spik:不,它读取一个字符,然后在INT32中返回一个(n个无符号)字符值或-1。似乎编码决定了读取的位数。我找不到有关UTF8(默认值)使用多少位的信息。@JYelton:UTF-8具有可变长度字符(1到4字节)。e、 g.“e”需要一个字节,但“e”需要两个字节。@Thomas这是否意味着它会首先尝试使用一个字节创建一个字符,并在必要时读取额外的字节(对于一个成功的字符)?@Thomas,只是确认一下你所说的。。不是很好的英语抱歉,现在将编辑它。事实上我把它拿走了:)