Mega Code Archive

 
Categories / C# / Development Class
 

Rational Class

using System; namespace Grinder.Exif {     #region Rational Class     internal sealed class Rational     {         private readonly Int32 _num;         private readonly Int32 _denom;         public Rational(byte[] bytes)         {             var n = new byte[4];             var d = new byte[4];             Array.Copy(bytes, 0, n, 0, 4);             Array.Copy(bytes, 4, d, 0, 4);             _num = BitConverter.ToInt32(n, 0);             _denom = BitConverter.ToInt32(d, 0);         }         public double ToDouble()         {             return Math.Round(Convert.ToDouble(_num) / Convert.ToDouble(_denom), 2);         }         public string ToString(string separator)         {             return _num + separator + _denom;         }         public override string ToString()         {             return ToString("/");         }     }     #endregion     #region Rational Class     internal sealed class URational     {         private readonly UInt32 _num;         private readonly UInt32 _denom;         public URational(byte[] bytes)         {             var n = new byte[4];             var d = new byte[4];             Array.Copy(bytes, 0, n, 0, 4);             Array.Copy(bytes, 4, d, 0, 4);             _num = BitConverter.ToUInt32(n, 0);             _denom = BitConverter.ToUInt32(d, 0);         }         public double ToDouble()         {             return Math.Round(Convert.ToDouble(_num) / Convert.ToDouble(_denom), 2);         }         public override string ToString()         {             return ToString("/");         }         public string ToString(string separator)         {             return _num + separator + _denom;         }     }     #endregion     #region Rational Class     internal sealed class GPSCoordinate     {         private readonly Rational _hours;         private readonly Rational _minutes;         private readonly Rational _seconds;         public double Hours         {             get             {                 return _hours.ToDouble();             }                     }         public double Minutes         {             get             {                 return _minutes.ToDouble();             }                     }         public double Seconds         {             get             {                 return _seconds.ToDouble();             }                     }         public GPSCoordinate(byte[] bytes)         {             var h = new byte[8];             var m = new byte[8];             var s = new byte[8];             Array.Copy(bytes, 0, h, 0, 8); Array.Copy(bytes, 8, m, 0, 8); Array.Copy(bytes, 16, s, 0, 8);             _hours = new Rational(h);             _minutes = new Rational(m);             _seconds = new Rational(s);         }         public TimeSpan ToTimeSpan()         {             return new TimeSpan((int)Hours, (int)Minutes, (int)Seconds);         }         public override string ToString()         {             return _hours.ToDouble() + "° "                 + _minutes.ToDouble() + "\' "                 + _seconds.ToDouble() + "\"";         }         public string ToString(string separator)         {             return _hours.ToDouble() + separator                 + _minutes.ToDouble() + separator +                 _seconds.ToDouble();         }     }     #endregion }