using System.Globalization;
public static class HexConverter
public static byte[] ToBytes(string hexdata)
if ((hexdata.Length % 2) != 0) hexdata = "0" + hexdata;
byte[] bytedata = new byte[hexdata.Length / 2];
for (int i = 0; i < hexdata.Length / 2; i++)
bytedata[i] = byte.Parse(hexdata.Substring(i * 2, 2), System.Globalization.NumberStyles.AllowHexSpecifier);
public static string ToString(byte[] data)
foreach (byte var in data)
datastring += Convert.ToString(var, 16).PadLeft(2, '0');
public static string ToString(byte[] data, int offset, int count)
for (long i = offset; i < (offset + count); i++)
datastring += Convert.ToString(data[i], 16).PadLeft(2, '0');
private static byte[] GetConversionData(byte[] data, int offset, int count)
return data.Skip(offset).Take(count).Reverse().ToArray();
public static UInt32 ToUInt32(byte[] data, int offset, int count)
return BitConverter.ToUInt32(GetConversionData(data, offset, count), 0);
public static Int32 ToInt32(byte[] data, int offset, int count)
return BitConverter.ToInt32(GetConversionData(data, offset, count), 0);
public static UInt16 ToUInt16(byte[] data, int offset, int count)
return BitConverter.ToUInt16(GetConversionData(data, offset, count), 0);
public static Int16 ToInt16(byte[] data, int offset, int count)
return BitConverter.ToInt16(GetConversionData(data, offset, count), 0);
public static class DateConverter
public static DateTime GetDate(byte[] lineBytes)
if (lineBytes.Length < 8)
return DateTime.MinValue;
int date = (int)HexConverter.ToUInt32(lineBytes, 0, 4);
int time = (int)HexConverter.ToUInt32(lineBytes, 4, 4);
return GetDate(date, time);
public static DateTime GetDate(string line)
return DateTime.MinValue;
String dateStr = line.Substring(0, 8);
String timeStr = line.Substring(8, 8);
int date = Convert.ToInt32(dateStr, 16);
int time = Convert.ToInt32(timeStr, 16);
return GetDate(date, time);
private static DateTime GetDate(int date, int time)
return new DateTime(date / 10000, (date % 10000) / 100, (date % 100), time / 10000, (time % 10000) / 100, time % 100);
const string line = "013417990000842AFDFBB3F509009F710000001B00001D0166";
public static void Main()
String latStr = line.Substring(16, 8);
String lonStr = line.Substring(24, 8);
String satcountStr = null;
String qualityStr = null;
if (line.Length >= 50 && line.Substring(34, 8) != "FFFFFFFF")
speedStr = line.Substring(32, 4);
altStr = line.Substring(36, 4);
dirStr = line.Substring(40, 4);
satcountStr = line.Substring(44, 2);
qualityStr = line.Substring(46, 2);
speedStr = line.Substring(32, 2);
DateTime logDate = DateConverter.GetDate(line);
double latitude = ((double)Convert.ToInt32(latStr, 16)) / 1000000;
double longitude = ((double)Convert.ToInt32(lonStr, 16)) / 1000000;
int speed = Convert.ToInt32(speedStr, 16);
altitude = Convert.ToInt32(altStr, 16);
dir = Convert.ToInt32(dirStr, 16);
satCount = Convert.ToInt32(satcountStr, 16);
Console.WriteLine("Date: {0}", logDate);
Console.WriteLine("LatLong: {0}, {1}", longitude, latitude);
Console.WriteLine("Alt: {0}", altitude);
Console.WriteLine("Dir: {0}", dir);
Console.WriteLine("SatCount: {0}", satCount);
Console.WriteLine("Speed: {0}", speed);