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
}