C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Note: Visual Studio can open binary files and you can look at the data. It won't be readable, but it gives you an idea what is happening.
Here: The file here is 48 bytes, because 12 integers of 4 bytes each are in it.
FileStream: We see that BinaryReader receives a FileStream. This is returned by File.Open.
File.OpenFileStreamVariables: It uses position and length variables. These 2 variables store the position in the binary file, and also the total size of the binary file.
ReadInt32: It calls ReadInt32. This method consumes 4 bytes in the binary file and turns it into an int.
Int, uintAlso: The method advances the file read. It increments our position. This line adds 4 bytes to our position.
C# program that uses BinaryReader
using System;
using System.IO;
class Program
{
static void Main()
{
R();
}
static void R()
{
// 1.
using (BinaryReader b = new BinaryReader(
File.Open("file.bin", FileMode.Open)))
{
// 2.
// Position and length variables.
int pos = 0;
// 2A.
// Use BaseStream.
int length = (int)b.BaseStream.Length;
while (pos < length)
{
// 3.
// Read integer.
int v = b.ReadInt32();
Console.WriteLine(v);
// 4.
// Advance our position variable.
pos += sizeof(int);
}
}
}
}
Output
1
4
6
7
11
55
777
23
266
44
82
93
ReadBoolean: Reads in a true or false value. I haven't used this one, and in many programs int would be used instead.
ReadByte: Reads in a single byte. This is useful for images and archives, but ReadBytes is faster.
ReadChar, ReadChars: These seem confusing, because they vary on the encoding used. Unicode chars are not the same as ASCII ones.
ReadDecimal: Reads in 16 bytes that are a decimal value. More information on the decimal type is available.
DecimalReadInt16, ReadInt32, ReadInt64: 2, 4 or 8 bytes are read. I had problems with ReadInt16. I think ReadInt32 is commonly useful.
ReadString: Microsoft says the string is "prefixed with the length, encoded as an integer seven bits at a time."
Tip: This can easily multiply the time required for the BinaryReader. PeekChar should thus be avoided.
Fragment that uses PeekChar: C#
using (BinaryReader b = new BinaryReader(File.Open("file.bin", FileMode.Open)))
{
// Do not do this.
while (b.PeekChar() != -1)
{
int v = b.ReadInt32();
}
}
Example that uses Encoding.ASCII: C#
//
// If all else fails, specify Encoding.ASCII to your File.Open call.
//
using (BinaryReader b = new BinaryReader(
File.Open("file.bin", FileMode.Open, Encoding.ASCII)))
{
// ...
}