以下为文章正文
警告
如果输入数据错误,会提示长度不对。
注意
数据采用大端传输方式,转换时注意数据的顺序。
经纬度数据为
01 D3 B9 B6 纬度 06 30 10 3D 经度
相关信息
由于中国境内经纬度均为正值,所以不需要考虑正负号问题。其他国家使用时,需要使用代码转换。
使用系统自带的科学计算器。切换至程序员模式,以16进制输入“01 D3 B9 B6”,然后点击十进制,即可完成转换。
转换完成后是30652854,转换比例是1E-6。则实际纬度为30.652854°。
代码使用BitConverter方法转换。
c#byte[] latArray = { 0xB6, 0xB9, 0xD3, 0x01 };
int latint = BitConverter.ToInt32(latArray, 0);
Console.WriteLine("latint:" + latint.ToString());
输出内容如下
latint:30652854
A8 13 01 28 08 6E B9 76 01 D3 B9 CC 06 30 10 3D 00 08 24 AD 66 17 FF AF 00 00 00 7D 03 83 01 14 18 06 19 0A 16 2E 10 EA
序号 | 字段 | 类型 | 字节数 | 说明 | 备注 |
---|---|---|---|---|---|
1 | A8 13 | U16 | 2 | 消息头 | 0xA813 |
2 | 01 | U8 | 1 | 帧号 | 无 |
3 | 28 | U8 | 1 | 报文长度 | 从消息头到校验位。0x28(40)个字节。 |
4 | 08 6E 82 39 | U32 | 4 | UTC总秒数 | 从2020-01-01零时开始到现在的总秒数。 |
5 | 01 D3 B9 B6 | I32 | 4 | 纬度 | 范围:-90~+90°。比例:1E-6。无效值:91000000。 |
6 | 06 30 10 3D | I32 | 4 | 经度 | 范围:-180~+180°。比例:1E-6。无效值:181 00000。 |
7 | 00 08 23 AE | I32 | 4 | 海拔高度 | 单位:米。比例:1E-3。无效值:-10000000。 |
8 | 6B 4D | U16 | 2 | 航向角 | 范围:0~+360°。比例:1E-2。无效值:36100。 |
9 | 04 A6 | I16 | 2 | 俯仰角 | 范围:-90-+90°。比例:1E-2。无效值:9100。 |
10 | 00 00 00 1D | U32 | 4 | 地面速度 | 单位:米/秒。比例:1E-3。无效值:-10000000。 |
11 | 03 84 | U16 | 2 | 基线长度 | 单位:米。比例:1E-3。 |
12 | 01 | U8 | 1 | 工作状态 | 00:定位定向无效。01:定位定向有效。 |
13 | 14 | U8 | 1 | 年高位 | UTC时间 |
14 | 18 | U8 | 1 | 年低位 | UTC时间 |
15 | 06 | U8 | 1 | 月 | UTC时间 |
16 | 19 | U8 | 1 | 日 | UTC时间 |
17 | 06 | U8 | 1 | 时 | UTC时间 |
18 | 1B | U8 | 1 | 分 | UTC时间 |
19 | 05 | U8 | 1 | 秒 | UTC时间 |
20 | 10 | U8 | 1 | 预留 | 无 |
21 | 08 | U8 | 1 | 校验 | 除去校验字节的异或和 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace bytetoI32 { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); /* // byte[] byteArray = { 0x01, 0xD3, 0xB9, 0xB6 }; byte[] byteArray = { 0xB6, 0xB9, 0xD3, 0x01 }; //232.8 int intnum = BitConverter.ToInt32(byteArray, 0);//232.8 Console.WriteLine("int:" + intnum.ToString()); */ byte[] latArray = { 0xB6, 0xB9, 0xD3, 0x01 }; int latint = BitConverter.ToInt32(latArray, 0); Console.WriteLine("latint:" + latint.ToString()); byte[] lonArray = { 0x3D, 0x10, 0x30, 0x06 }; int lonint = BitConverter.ToInt32(lonArray, 0); Console.WriteLine("lonint:" + lonint.ToString()); Console.ReadLine(); } private void startbutton_Click(object sender, RoutedEventArgs e) { string outstring = ""; if(!inputbox.Text.Equals("")) { string[] messagesp = inputbox.Text.Split(' '); if(messagesp.Length==40) { long UTC_Sec=Convert.ToInt64((messagesp[4] + messagesp[5] + messagesp[6] + messagesp[7]), 16); outstring += "UTC总秒数:" + UTC_Sec.ToString()+"\r\n"; double lat = Convert.ToInt32((messagesp[8] + messagesp[9] + messagesp[10] + messagesp[11]), 16); lat = lat*0.000001; outstring += "纬度:" + lat.ToString("0.000001" + "\r\n"); double lon = Convert.ToInt32((messagesp[12] + messagesp[13] + messagesp[14] + messagesp[15]), 16); lon = lon * 0.000001; outstring += "纬度:" + lon.ToString("0.000001" + "\r\n"); double HEI = Convert.ToInt32((messagesp[16] + messagesp[17] + messagesp[18] + messagesp[19]), 16); HEI = HEI * 0.000001; outstring += "高度:" + HEI.ToString("0.000001" + "\r\n"); double hangxiangjiao = Convert.ToInt64((messagesp[20] + messagesp[21] ), 16); hangxiangjiao = hangxiangjiao * 0.01; outstring += "航向角:" + hangxiangjiao.ToString() + "\r\n"; double fuyangjiao = Convert.ToInt16((messagesp[22] + messagesp[23]), 16); fuyangjiao = fuyangjiao * 0.01; outstring += "俯仰角:" + fuyangjiao.ToString() + "\r\n"; double speed = Convert.ToInt64((messagesp[24] + messagesp[25] + messagesp[26] + messagesp[27]), 16); speed = speed * 0.001; outstring += "地面速度:" + speed.ToString() + "\r\n"; double loc_len = Convert.ToInt64((messagesp[28] + messagesp[29] ), 16); loc_len = loc_len * 0.001; outstring += "基线长度:" + loc_len.ToString() + "\r\n"; if(messagesp[30].Equals("01")) { outstring += "工作状态:定位定向有效\r\n"; } else if(messagesp[30].Equals("00")) { outstring += "工作状态:定位定向无效\r\n"; } else { outstring += "工作状态:数据错误\r\n"; } int yearH = Convert.ToInt32(( messagesp[31]), 16); int yearL = Convert.ToInt32((messagesp[32]), 16); int MM = Convert.ToInt32((messagesp[33]), 16); int DD = Convert.ToInt32((messagesp[34]), 16); int HH = Convert.ToInt32((messagesp[35]), 16); int MS = Convert.ToInt32((messagesp[36]), 16); int SS = Convert.ToInt32((messagesp[37]), 16); outstring +="UTC时间:"+ yearH.ToString()+ yearL + "年" +MM+"月"+DD + "日\t" + HH + "时" + MS + "分" + SS + "秒" + "\r\n"; UInt64 utc_count_time_s = GetTimeStamp(yearH * 100 + yearL, MM, DD, HH, MS, SS); outstring += "输入字符串的时间戳是:" + utc_count_time_s + "\r\n"; outstring += "预留:" + messagesp[38]+ "\r\n"; outstring += "校验:" + messagesp[39] + "\r\n"; } else { outstring += "输入数据长度不对,此时长度是:"+ messagesp.Length+"\r\n"; } } outbox.Text = outstring; } public UInt64 GetTimeStamp(int year,int mm,int dd,int hh,int ms,int ss) { TimeSpan ts = new DateTime( year, mm, dd, hh, ms, ss) - new DateTime(2020, 1, 1, 0, 0, 0, 0); return Convert.ToUInt64(ts.TotalMilliseconds) / 1000; } } }
本文作者:Kellermen
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!