Question

I am working on improving a stream reader class that uses a BinaryReader. It consists of a while loop that uses .PeekChar() to check if more data exists to continue processing.

The very first operation is a .ReadInt32() which reads 4 bytes. What if PeekChar only "saw" one byte (or one bit)? This doesn't seem like a reliable way of checking for EOF.

The BinaryReader is constructed using its default parameters, which as I understand it, uses UTF8 as the default encoding. I assume that .PeekChar() checks for 8 bits but I really am not sure.

How many bits does .PeekChar() look for? (and what are some alternate methods to checking for EOF?)

Was it helpful?

Solution

Here BinaryReader.PeekChar

I read:

ArgumentException: The current character cannot be decoded into the internal character buffer by using the Encoding selected for the stream.

This makes clear that amount of memory read depends on Encoding applied to that stream.

EDIT

Actually definition according to MSDN is:

Returns the next available character and does not advance the byte or character position.*

Infact, it depends on encoding if this is a byte or more...

Hope this helps.

OTHER TIPS

Making your Read*() calls blindly and handling any exceptions that are thrown is the normal method. I don't believe that the stream position is moved if anything goes wrong.

The PeekChar() method of BinaryReader is very buggy. Even when trying to read a from a memory stream with UTF8 encoded data, PeekChar() throws an exception after reading a particular length of the stream. The BCL team has acknowledged the issue, but they have not committed to resolving the issue. Their only response is to avoid using PeekChar() if you can.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top