Search code examples
c#binarywriterfilestream.net

Why does BinaryWriter prepend gibberish to the start of a stream? How do you avoid it?


I'm debugging some issues with writing pieces of an object to a file and I've gotten down to the base case of just opening the file and writing "TEST" in it. I'm doing this by something like:

static FileStream fs;
static BinaryWriter w;
fs = new FileStream(filename, FileMode.Create);
w = new BinaryWriter(fs);

w.Write("test");

w.Close();
fs.Close();

Unfortunately, this ends up prepending a box to the front of the file and it looks like so:

TEST, with a fun box on the front. Why is this, and how can I avoid it?

Edit: It does not seem to be displaying the box here, but it's the unicode character that looks like gibberish.


Solution

  • They are not byte-order marks but a length-prefix, according to MSDN:

    public virtual void Write(string value);
    

    Writes a length-prefixed string to [the] stream

    And you will need that length-prefix if you ever want to read the string back from that point. See BinaryReader.ReadString().

    Additional

    Since it seems you actually want a File-Header checker

    1. Is it a problem? You read the length-prefix back so as a type-check on the File it works OK

    2. You can convert the string to a byte[] array, probably using Encoding.ASCII. But hen you have to either use a fixed (implied) length or... prefix it yourself. After reading the byte[] you can convert it to a string again.

    3. If you had a lot of text to write you could even attach a TextWriter to the same stream. But be careful, the Writers want to close their streams. I wouldn't advice this in general, but it is good to know. Here too you will have to mark a Point where the other reader can take over (fixed header works OK).