/// <summary>
        /// Read a 24bit integer from the stream with a specified endian
        /// </summary>
        /// <param name="littleEndian">True for little endian, false for big endian</param>
        /// <returns>The 24bit integer</returns>
        public Int24 ReadInt24(bool littleEndian)
        {
            int ofs = littleEndian ? 0 : 1;

            byte[] data = new byte[4];

            for (int i = 0; i < 3; ++i)
            {
                data[i + ofs] = ReadByte();
            }

            // Sign the value
            if (littleEndian)
            {
                if ((data[2] & 0x80) != 0)
                {
                    data[3] = 0xFF;
                }
            }
            else
            {
                if ((data[1] & 0x80) != 0)
                {
                    data[0] = 0xFF;
                }
            }

            return((Int24)BitConverter.ToInt32(GeneralUtils.SwapBytes(data, littleEndian), 0));
        }
        /// <summary>
        /// Write a 24bit unsigned integer
        /// </summary>
        /// <param name="i">The integer to write</param>
        /// <param name="littleEndian">True for little endian, otherwise big endian</param>
        public void WriteUInt24(UInt24 i, bool littleEndian)
        {
            byte[] data = GeneralUtils.SwapBytes(BitConverter.GetBytes(i), littleEndian);

            if (littleEndian)
            {
                WriteBytes(data, 0, 3);
            }
            else
            {
                WriteBytes(data, 1, 3);
            }
        }
        /// <summary>
        /// Read a 24bit integer from the stream with a specified endian
        /// </summary>
        /// <param name="littleEndian">True for little endian, false for big endian</param>
        /// <returns>The 24bit unsigned integer</returns>
        public UInt24 ReadUInt24(bool littleEndian)
        {
            int ofs = littleEndian ? 0 : 1;

            byte[] data = new byte[4];

            for (int i = 0; i < 3; ++i)
            {
                data[i + ofs] = ReadByte();
            }

            return((UInt24)BitConverter.ToUInt32(GeneralUtils.SwapBytes(data, littleEndian), 0));
        }
 /// <summary>
 /// Write a double with a specified endian
 /// </summary>
 /// <param name="d">The double to write</param>
 /// <param name="littleEndian">True for little endian, otherwise big endian</param>
 public void WriteDouble(double d, bool littleEndian)
 {
     WriteBytes(GeneralUtils.SwapBytes(BitConverter.GetBytes(d), littleEndian));
 }
 /// <summary>
 /// Write a float with a specified endian
 /// </summary>
 /// <param name="f">The float to write</param>
 /// <param name="littleEndian">True for little endian, otherwise big endian</param>
 public void WriteFloat(float f, bool littleEndian)
 {
     WriteBytes(GeneralUtils.SwapBytes(BitConverter.GetBytes(f), littleEndian));
 }
 /// <summary>
 /// Write an unsigned 64bit integer with a specified endian
 /// </summary>
 /// <param name="l">The integer to write</param>
 /// <param name="littleEndian">True for little endian, otherwise big endian</param>
 public void WriteUInt64(ulong l, bool littleEndian)
 {
     WriteBytes(GeneralUtils.SwapBytes(BitConverter.GetBytes(l), littleEndian));
 }
 /// <summary>
 /// Write an unsigned 32bit integer with a specified endian
 /// </summary>
 /// <param name="i">The integer to write</param>
 /// <param name="littleEndian">True for little endian, otherwise big endian</param>
 public void WriteUInt32(uint i, bool littleEndian)
 {
     WriteBytes(GeneralUtils.SwapBytes(BitConverter.GetBytes(i), littleEndian));
 }
 /// <summary>
 /// Write a 16bit integer to the stream
 /// </summary>
 /// <param name="s">The integer to write</param>
 /// <param name="littleEndian">True for little endian, otherwise big endian</param>
 public void WriteUInt16(ushort s, bool littleEndian)
 {
     WriteBytes(GeneralUtils.SwapBytes(BitConverter.GetBytes(s), littleEndian));
 }
        /// <summary>
        /// Read a double from the stream with a specified endian
        /// </summary>
        /// <param name="littleEndian">True for little endian, false for big endian</param>
        /// <returns>The double</returns>
        public double ReadDouble(bool littleEndian)
        {
            byte[] data = ReadBytes(8);

            return(BitConverter.ToDouble(GeneralUtils.SwapBytes(data, littleEndian), 0));
        }
        /// <summary>
        /// Read a float from the stream with a specified endian
        /// </summary>
        /// <param name="littleEndian">True for little endian, false for big endian</param>
        /// <returns>The float</returns>
        public float ReadFloat(bool littleEndian)
        {
            byte[] data = ReadBytes(4);

            return(BitConverter.ToSingle(GeneralUtils.SwapBytes(data, littleEndian), 0));
        }
        /// <summary>
        /// Read a long from the stream with a specified endian
        /// </summary>
        /// <param name="littleEndian">True for little endian, false for big endian</param>
        /// <returns>The read value</returns>
        public long ReadInt64(bool littleEndian)
        {
            byte[] data = ReadBytes(8);

            return(BitConverter.ToInt64(GeneralUtils.SwapBytes(data, littleEndian), 0));
        }
        /// <summary>
        /// Read an unsigned integer from the stream with a specified endian
        /// </summary>
        /// <param name="littleEndian">True for little endian, false for big endian</param>
        /// <returns>The read value</returns>
        public uint ReadUInt32(bool littleEndian)
        {
            byte[] data = ReadBytes(4);

            return(BitConverter.ToUInt32(GeneralUtils.SwapBytes(data, littleEndian), 0));
        }
        /// <summary>
        /// Read an unsigned short from the stream with a specified endian
        /// </summary>
        /// <param name="littleEndian">True for little endian, false for big endian</param>
        /// <returns>The read value</returns>
        public ushort ReadUInt16(bool littleEndian)
        {
            byte[] data = ReadBytes(2);

            return(BitConverter.ToUInt16(GeneralUtils.SwapBytes(data, littleEndian), 0));
        }