using System; using System.Collections.Generic; using System.Text; using System.IO; namespace CSJ2K.Util { internal class EndianBinaryReader : BinaryReader { private bool _bigEndian = false; // Summary: // Initializes a new instance of the System.IO.BinaryReader class based on the // supplied stream and using System.Text.UTF8Encoding. // // Parameters: // input: // A stream. // // Exceptions: // System.ArgumentException: // The stream does not support reading, the stream is null, or the stream is // already closed. public EndianBinaryReader(Stream input) : base(input) { } // // Summary: // Initializes a new instance of the System.IO.BinaryReader class based on the // supplied stream and a specific character encoding. // // Parameters: // encoding: // The character encoding. // // input: // The supplied stream. // // Exceptions: // System.ArgumentNullException: // encoding is null. // // System.ArgumentException: // The stream does not support reading, the stream is null, or the stream is // already closed. public EndianBinaryReader(Stream input, Encoding encoding) : base(input, encoding) { } public EndianBinaryReader(Stream input, Encoding encoding, bool bigEndian) : base(input, encoding) { _bigEndian = bigEndian; } public EndianBinaryReader(Stream input, bool bigEndian) : base(input, bigEndian ? Encoding.BigEndianUnicode : Encoding.ASCII) { _bigEndian = bigEndian; } // Summary: // Exposes access to the underlying stream of the System.IO.BinaryReader. // // Returns: // The underlying stream associated with the BinaryReader. //public virtual Stream BaseStream { get; } // Summary: // Closes the current reader and the underlying stream. //public virtual void Close(); // // Summary: // Releases the unmanaged resources used by the System.IO.BinaryReader and optionally // releases the managed resources. // // Parameters: // disposing: // true to release both managed and unmanaged resources; false to release only // unmanaged resources. //protected virtual void Dispose(bool disposing); // // Summary: // Fills the internal buffer with the specified number of bytes read from the // stream. // // Parameters: // numBytes: // The number of bytes to be read. // // Exceptions: // System.IO.EndOfStreamException: // The end of the stream is reached before numBytes could be read. // // System.IO.IOException: // An I/O error occurs. //protected virtual void FillBuffer(int numBytes); // // Summary: // Returns the next available character and does not advance the byte or character // position. // // Returns: // The next available character, or -1 if no more characters are available or // the stream does not support seeking. // // Exceptions: // System.IO.IOException: // An I/O error occurs. //public virtual int PeekChar(); // // Summary: // Reads characters from the underlying stream and advances the current position // of the stream in accordance with the Encoding used and the specific character // being read from the stream. // // Returns: // The next character from the input stream, or -1 if no characters are currently // available. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. //public virtual int Read(); // // Summary: // Reads count bytes from the stream with index as the starting point in the // byte array. // // Parameters: // count: // The number of characters to read. // // buffer: // The buffer to read data into. // // index: // The starting point in the buffer at which to begin reading into the buffer. // // Returns: // The number of characters read into buffer. This might be less than the number // of bytes requested if that many bytes are not available, or it might be zero // if the end of the stream is reached. // // Exceptions: // System.ArgumentNullException: // buffer is null. // // System.IO.IOException: // An I/O error occurs. // // System.ObjectDisposedException: // The stream is closed. // // System.ArgumentOutOfRangeException: // index or count is negative. // // System.ArgumentException: // The buffer length minus index is less than count. //public virtual int Read(byte[] buffer, int index, int count); // // Summary: // Reads count characters from the stream with index as the starting point in // the character array. // // Parameters: // count: // The number of characters to read. // // buffer: // The buffer to read data into. // // index: // The starting point in the buffer at which to begin reading into the buffer. // // Returns: // The total number of characters read into the buffer. This might be less than // the number of characters requested if that many characters are not currently // available, or it might be zero if the end of the stream is reached. // // Exceptions: // System.ArgumentNullException: // buffer is null. // // System.IO.IOException: // An I/O error occurs. // // System.ObjectDisposedException: // The stream is closed. // // System.ArgumentOutOfRangeException: // index or count is negative. // // System.ArgumentException: // The buffer length minus index is less than count. //public virtual int Read(char[] buffer, int index, int count); // // Summary: // Reads in a 32-bit integer in compressed format. // // Returns: // A 32-bit integer in compressed format. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.FormatException: // The stream is corrupted. // // System.IO.EndOfStreamException: // The end of the stream is reached. //protected internal int Read7BitEncodedInt(); // // Summary: // Reads a Boolean value from the current stream and advances the current position // of the stream by one byte. // // Returns: // true if the byte is nonzero; otherwise, false. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. //public virtual bool ReadBoolean(); // // Summary: // Reads the next byte from the current stream and advances the current position // of the stream by one byte. // // Returns: // The next byte read from the current stream. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. //public virtual byte ReadByte(); // // Summary: // Reads count bytes from the current stream into a byte array and advances // the current position by count bytes. // // Parameters: // count: // The number of bytes to read. // // Returns: // A byte array containing data read from the underlying stream. This might // be less than the number of bytes requested if the end of the stream is reached. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.ArgumentOutOfRangeException: // count is negative. //public virtual byte[] ReadBytes(int count); // // Summary: // Reads the next character from the current stream and advances the current // position of the stream in accordance with the Encoding used and the specific // character being read from the stream. // // Returns: // A character read from the current stream. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. // // System.ArgumentException: // A surrogate character was read. //public virtual char ReadChar(); // // Summary: // Reads count characters from the current stream, returns the data in a character // array, and advances the current position in accordance with the Encoding // used and the specific character being read from the stream. // // Parameters: // count: // The number of characters to read. // // Returns: // A character array containing data read from the underlying stream. This might // be less than the number of characters requested if the end of the stream // is reached. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. // // System.ArgumentOutOfRangeException: // count is negative. //public virtual char[] ReadChars(int count); // // Summary: // Reads a decimal value from the current stream and advances the current position // of the stream by sixteen bytes. // // Returns: // A decimal value read from the current stream. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. public override decimal ReadDecimal() { if (_bigEndian) { // TODO: Is the whole thing reversed or just the individual ints? // Maybe we should just call ReadInt32 4 times? byte[] buf = this.ReadBytes(16); Array.Reverse(buf); int[] decimalints = new int[4]; decimalints[0]=BitConverter.ToInt32(buf, 0); decimalints[1]=BitConverter.ToInt32(buf, 4); decimalints[2]=BitConverter.ToInt32(buf, 8); decimalints[3]=BitConverter.ToInt32(buf, 12); return new decimal(decimalints); } else return base.ReadDecimal(); } // // Summary: // Reads an 8-byte floating point value from the current stream and advances // the current position of the stream by eight bytes. // // Returns: // An 8-byte floating point value read from the current stream. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. public override double ReadDouble() { if (_bigEndian) { byte[] buf = this.ReadBytes(8); Array.Reverse(buf); return BitConverter.ToDouble(buf, 0); } else return base.ReadDouble(); } // // Summary: // Reads a 2-byte signed integer from the current stream and advances the current // position of the stream by two bytes. // // Returns: // A 2-byte signed integer read from the current stream. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. public override short ReadInt16() { if (_bigEndian) { byte[] buf = this.ReadBytes(2); Array.Reverse(buf); return BitConverter.ToInt16(buf, 0); } else return base.ReadInt16(); } // // Summary: // Reads a 4-byte signed integer from the current stream and advances the current // position of the stream by four bytes. // // Returns: // A 4-byte signed integer read from the current stream. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. public override int ReadInt32() { if (_bigEndian) { byte[] buf = this.ReadBytes(4); Array.Reverse(buf); return BitConverter.ToInt32(buf, 0); } else return base.ReadInt32(); } // // Summary: // Reads an 8-byte signed integer from the current stream and advances the current // position of the stream by eight bytes. // // Returns: // An 8-byte signed integer read from the current stream. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. public override long ReadInt64() { if (_bigEndian) { byte[] buf = this.ReadBytes(8); Array.Reverse(buf); return BitConverter.ToInt64(buf, 0); } else return base.ReadInt64(); } // // Summary: // Reads a signed byte from this stream and advances the current position of // the stream by one byte. // // Returns: // A signed byte read from the current stream. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. //[CLSCompliant(false)] //public virtual byte Readbyte(); // // Summary: // Reads a 4-byte floating point value from the current stream and advances // the current position of the stream by four bytes. // // Returns: // A 4-byte floating point value read from the current stream. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. public override float ReadSingle() { if (_bigEndian) { byte[] buf = this.ReadBytes(4); Array.Reverse(buf); return BitConverter.ToSingle(buf, 0); } else return base.ReadSingle(); } // // Summary: // Reads a string from the current stream. The string is prefixed with the length, // encoded as an integer seven bits at a time. // // Returns: // The string being read. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. //public virtual string ReadString(); // // Summary: // Reads a 2-byte unsigned integer from the current stream using little-endian // encoding and advances the position of the stream by two bytes. // // Returns: // A 2-byte unsigned integer read from this stream. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. public override ushort ReadUInt16() { if (_bigEndian) { byte[] buf = this.ReadBytes(2); Array.Reverse(buf); return BitConverter.ToUInt16(buf, 0); } else return base.ReadUInt16(); } // // Summary: // Reads a 4-byte unsigned integer from the current stream and advances the // position of the stream by four bytes. // // Returns: // A 4-byte unsigned integer read from this stream. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. public override uint ReadUInt32() { if (_bigEndian) { byte[] buf = this.ReadBytes(4); Array.Reverse(buf); return BitConverter.ToUInt32(buf, 0); } else return base.ReadUInt32(); } // // Summary: // Reads an 8-byte unsigned integer from the current stream and advances the // position of the stream by eight bytes. // // Returns: // An 8-byte unsigned integer read from this stream. // // Exceptions: // System.ObjectDisposedException: // The stream is closed. // // System.IO.IOException: // An I/O error occurs. // // System.IO.EndOfStreamException: // The end of the stream is reached. public override ulong ReadUInt64() { if (_bigEndian) { byte[] buf = this.ReadBytes(8); Array.Reverse(buf); return BitConverter.ToUInt64(buf, 0); } else return base.ReadUInt64(); } } }