编辑
2024-06-25
测试数据
0

目录

使用测试程序
经纬度转换
使用科学计算器转换
使用代码转换
附协议说明
测试程序的代码

以下为文章正文


使用测试程序


在最上面的数据框中输入需要检测的数据。只能输入一条数据。然后转换。

转换完成后,在左侧输出数据。

警告

如果输入数据错误,会提示长度不对。

经纬度转换

注意

数据采用大端传输方式,转换时注意数据的顺序。

经纬度数据为

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
序号字段类型字节数说明备注
1A8 13U162消息头0xA813
201U81帧号
328U81报文长度从消息头到校验位。0x28(40)个字节。
408 6E 82 39U324UTC总秒数从2020-01-01零时开始到现在的总秒数。
501 D3 B9 B6I324纬度范围:-90~+90°。比例:1E-6。无效值:91000000。
606 30 10 3DI324经度范围:-180~+180°。比例:1E-6。无效值:181 00000。
700 08 23 AEI324海拔高度单位:米。比例:1E-3。无效值:-10000000。
86B 4DU162航向角范围:0~+360°。比例:1E-2。无效值:36100。
904 A6I162俯仰角范围:-90-+90°。比例:1E-2。无效值:9100。
1000 00 00 1DU324地面速度单位:米/秒。比例:1E-3。无效值:-10000000。
1103 84U162基线长度单位:米。比例:1E-3。
1201U81工作状态00:定位定向无效。01:定位定向有效。
1314U81年高位UTC时间
1418U81年低位UTC时间
1506U81UTC时间
1619U81UTC时间
1706U81UTC时间
181BU81UTC时间
1905U81UTC时间
2010U81预留
2108U81校验除去校验字节的异或和

测试程序的代码

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 许可协议。转载请注明出处!