using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; namespace IBCNDecoder { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnOpenFile_Click(object sender, EventArgs e) { openFileDialog1.ShowDialog(); using (BinaryReader ibcnReader = new BinaryReader(File.Open(openFileDialog1.FileName, FileMode.Open))) { tbFileName.Text = openFileDialog1.FileName.ToString(); int length = (int)ibcnReader.BaseStream.Length; ibcnReader.BaseStream.Position = 0; ibcnReader.BaseStream.Position = 0; byte[] ibcnBytes = ibcnReader.ReadBytes(length); StringBuilder rawBytes = new StringBuilder(128); for (int i = 0; i < length; i++) { rawBytes.Append(ibcnBytes[i].ToString("X")); rawBytes.Append(" "); } rtbRawMessage.Text = rawBytes.ToString(); double byte1Mult = Math.Pow(2, 24); double byte2Mult = Math.Pow(2, 16); double byte3Mult = Math.Pow(2, 8); double latitude = (1e-6 * ((ibcnBytes[8] * byte1Mult) + (ibcnBytes[9] * byte2Mult) + (ibcnBytes[10] * byte3Mult) + ibcnBytes[11])) - 90.0; tbLatitude.Text = latitude.ToString(); double longitude = (1e-6 * ((ibcnBytes[12] * byte1Mult) + (ibcnBytes[13] * byte2Mult) + (ibcnBytes[14] * byte3Mult) + ibcnBytes[15])) - 180.0; tbLongitude.Text = longitude.ToString(); double gpsTime = (ibcnBytes[3] * byte1Mult) + (ibcnBytes[4] * byte2Mult) + (ibcnBytes[5] * byte3Mult) + ibcnBytes[6]; DateTime gpsReferenceTime = new DateTime(1980, 1, 6); DateTime gpsDateTime = gpsReferenceTime.AddSeconds(gpsTime); //Here's another way to convert taking care of the endian difference //byte[] tempBytes = new byte[4]; //Array.Copy(ibcnBytes, 3, tempBytes, 0, 4); //Array.Reverse(tempBytes); //int temp = BitConverter.ToInt32(tempBytes, 0); double hdop = 0.5 * (ibcnBytes[7] & 0X07); tbHDOP.Text = hdop.ToString(); double numSats = 3 + ((ibcnBytes[7] >> 3) & 0X07); tbNumSats.Text = numSats.ToString(); this.Refresh(); Application.DoEvents(); } } } }