用UDP接收GPS终端发过来的数据乱码,而接收TCP发过来的数据能正常显示,GPS终端发过来的UDP数据应该是二进制数据,不知道怎么才能转换成字符串,困了好几天了?

解决方案 »

  1.   

    这跟TCP、UDP没关系,先搞清楚你的数据包格式
      

  2.   

    我看了通讯协议,没有看到哪对UDP数据包格式进行说明,只是说UDP采用二进制方式编码传送。
      

  3.   

    也许解码格式不对
    --reply by CSDN Study V1.0.0.3 (starts_2000)
      

  4.   

    编码格式的问题你看看你接收转换的时候是怎么转换的有什么不一样的地方你现在在做GPS开发?    可以加我,我一直在做,探讨下
      

  5.   

    问题补充一下,
    这是编码格式:
    七、 监控信息的获得
    有两种方式获得车载机的自动上传信息:
    1) TCP协议,发送D1命令设定间隔,车载机按照间隔自动回传记录。
    2) UDP协议,中心发送S17命令(注意:命令从TCP通道发送),车载机按照间隔自动回传记录。
    标准模式记录(二进制V1一般信息)编码格式:序号 00 01 02 03 04 05 06 07 08 09 0A 0B
    内容 $ 0x1030731001 0x050316 0x220902
    含义 记录头 车载机序列号 时间 日期
    序号 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18
    内容 0x22128745 0x00 0x113466574C 0x014028
    含义 纬度值 保留 经度值、N、E、AV 速度、方向
    序号 19 1A 1B 1C 1D 1E 1F
    内容 0Xfffffbff 0xff 0x00
    含义 vehicle_status Usr_alarm_flag 保留 记录号说明:“$”(0x24):记录头,用于中心识别记录起始位置;
    时间:0x050316,标准时间5点3分16秒,相当于北京时间13点3分16秒;
    日期:0x220902,2002年9月22日;
    纬度值:0x22128745,22度12.8745
    经度值:0x113466574C,113度46.6574,最后字节(序号0x15)含义:
    bit7654,经度最后一位
    bit3,1:东经,0:西经
    bit2,1:北纬,0:南纬
    bit1,1:A,0:V
    bit0,未定义
    速度、方向:0x014028:速度014节,方向028
    vehicle_status、 Usr_alarm_flag:以二进制表示的车辆状态和用户自定义报警状态。含义与短信(ASCII表示)相同。
    记录号:二进制表示的记录序号,每发送一条记录自动加1。
    以下是我用这方式接收并输出的
                   int recv = mUdpSocket.Receive(datat);
                    string re="";
                   for (int i = 0; i < recv; i++)
                    {
                        re = re+datat[i].ToString();
                    }
                  //输出re,查看接收的数据以下是接收的内容,
    36 50 0 98 32 22 9 81 72 4 7 17 52 72 38 23 0 17 51 149 54 78 0 49 71 239 255 223 255 255 0 106 
    36 50 0 98 32 32 9 81 66 4 7 17 52 69 153 34 0 17 52 9 85 110 0 1 98 255 255 223 255 255 0 112 
    36 50 0 98 33 69 9 81 81 4 7 17 52 70 51 131 0 17 52 71 51 156 0 99 55 255 255 223 255 255 0 1 
    36 50 0 98 50 8 9 81 83 4 7 17 52 69 149 132 0 17 52 9 134 158 0 2 40 255 255 251 255 255 0 161 
    36 50 0 98 32 101 9 81 85 4 7 17 52 67 118 84 0 17 51 120 7 14 0 1 87 239 255 223 255 255 0 106 
    36 50 0 98 49 144 9 81 86 4 7 17 51 40 68 21 0 17 34 89 8 126 0 2 102 255 255 251 255 255 0 82 
    36 50 0 98 49 52 9 82 0 4 7 17 52 70 6 57 0 17 52 16 133 12 0 19 1 255 255 251 255 255 0 197 
    36 50 0 98 48 70 9 82 1 4 7 17 52 70 49 102 0 17 52 71 39 28 0 65 134 255 255 223 255 255 0 50 
    36 50 0 98 49 53 9 82 1 4 7 17 52 69 151 71 0 17 52 9 0 78 0 3 53 255 255 251 255 255 0 32 
    36 50 0 98 33 120 9 82 1 4 7 17 52 69 148 40 0 17 52 9 114 62 0 2 119 255 255 251 255 255 0 58 
    36 50 0 98 33 24 9 82 2 4 7 17 52 69 146 50 0 17 52 9 38 126 0 3 70 255 255 251 255 255 0 244 
    36 50 0 98 33 35 9 82 5 4 7 17 52 69 146 40 0 17 52 9 153 158 0 2 49 239 231 223 255 255 0 127 
    36 50 0 98 33 137 9 82 7 4 7 17 52 70 70 71 0 17 52 5 146 46 0 2 56 239 231 223 255 255 0 82 
    36 50 0 98 33 51 9 82 17 4 7 17 52 70 34 64 0 17 52 19 38 62 0 3 52 239 231 223 255 255 0 127 
    36 50 0 98 48 51 9 82 18 4 7 17 52 70 49 1 0 17 52 25 69 78 0 1 145 255 255 223 255 255 0 111 
    36 50 0 98 32 50 9 82 19 4 7 17 53 4 53 152 0 17 67 84 151 62 0 3 68 255 255 223 255 255 0 38 
    36 50 0 98 33 22 9 82 20 4 7 17 52 72 98 86 0 17 51 114 23 78 0 130 150 239 255 223 255 255 0 99 
    36 50 0 98 33 8 9 82 21 4 7 17 52 70 4 132 0 17 52 17 32 14 0 3 19 255 255 223 255 255 0 14 
    36 50 0 98 32 34 9 82 22 4 7 17 52 69 147 51 0 17 52 9 7 30 0 2 129 255 255 223 255 255 0 96 
    36 50 0 98 48 97 9 82 23 4 7 17 52 69 149 39 0 17 52 9 35 110 0 0 71 255 255 251 255 255 0 51 
    36 50 0 98 49 128 9 82 25 4 7 17 52 68 104 115 0 17 52 33 18 78 0 1 150 255 255 223 255 255 0 117 
    36 50 0 98 50 53 9 82 25 4 7 17 52 69 151 0 0 17 52 9 39 14 0 0 99 239 231 223 255 255 0 87 
    36 50 0 98 50 18 9 82 33 4 7 17 52 69 145 17 0 17 52 9 101 78 0 1 135 255 255 223 255 255 0 40 
    36 50 0 98 48 73 9 82 34 4 7 17 52 55 102 131 0 17 52 134 18 78 6 147 52 255 255 223 255 255 0 171 
    36 50 0 98 33 52 9 82 1 4 7 17 52 69 146 102 0 17 52 9 52 158 0 3 8 239 255 223 255 255 0 255 
    36 50 0 98 33 145 9 82 38 4 7 17 52 72 70 149 0 17 66 2 145 158 0 2 7 255 255 251 255 255 0 250 
    36 50 0 98 33 149 9 82 40 4 7 17 52 70 0 52 0 17 52 17 83 126 0 3 52 255 255 223 255 255 0 247 怎么把它转换成字符串,谁知道帮个忙
    或加我QQ:125942687
      

  6.   

    “不知道怎么才能转换成字符串”?你贴的规则对于二进制位跟实际含义(属性值)之间的关系不是解释清楚了嘛。自己按照Byte(个别地按照bit)来逐一读出,写到一个对象里返回。
      

  7.   

    只作了部分解析,更细致的解析自己做吧
                string s = "";
                string str = "36 50 0 98 32 22 9 81 72 4 7 17 52 72 38 23 0 17 51 149 54 78 0 49 71 239 255 223 255 255 0 106";
                string[] ss = str.Split(' ');
                byte[] data = new byte[ss.Length];
                for (int i = 0; i < ss.Length; i++)
                    data[i] = byte.Parse(ss[i]);
                byte[] bb = new byte[5];
                Array.ConstrainedCopy(data, 1, bb, 0, 5);
                s += "车载机序列号: ";
                for (int i = 0; i < 5; i++)
                    s += bb[i].ToString("X2");
                s += "\r\n";            bb = new byte[3];
                Array.ConstrainedCopy(data, 6, bb, 0, 3);
                s += "时间: ";
                for (int i = 0; i < 3; i++)
                    s += bb[i].ToString("X2");
                s += "\r\n";            bb = new byte[3];
                Array.ConstrainedCopy(data, 9, bb, 0, 3);
                s += "日期: ";
                for (int i = 0; i < 3; i++)
                    s += bb[i].ToString("X2");
                s += "\r\n";            bb = new byte[4];
                Array.ConstrainedCopy(data, 12, bb, 0, 4);
                s += "纬度值: ";
                for (int i = 0; i < 4; i++)
                    s += bb[i].ToString("X2");
                s += "\r\n";            bb = new byte[5];
                Array.ConstrainedCopy(data, 17, bb, 0, 5);
                s += "经度值: ";
                for (int i = 0; i < 5; i++)
                    s += bb[i].ToString("X2");
                s += "\r\n";            MessageBox.Show(s);
      

  8.   

    你上面显示的数据可能不是最原始的数据,我是做gps监控的,不管是udp还是tcp,接的数据一般都是直接放在byte的数组中(用c++做的也可以是char的数组),然后经过处理(比如读成某种进制的字符串,或者编下码),才能得到你上面的那组数据,你上面给的数据可能是用测试工具直接收到的吧(比如egtest)。
    上面的那组数据应该是十进制的,只是显示的形式而己,你只需要关注的数据的真值就行了,按14楼的说法,直接读到byte数组中,然后再按你想用的显示形式读成字符串就行了。
      

  9.   


    我是用以下的方式接收显示的
     int recv = mUdpSocket.Receive(datat);
      string re="";
      for (int i = 0; i < recv; i++)
      {
      re = re+datat[i].ToString();
      }
      //输出re,查看接收的数据
      

  10.   

    我是用以下的方式接收显示的
     int recv = mUdpSocket.Receive(datat);
      string re="";
      for (int i = 0; i < recv; i++)
      {
      re = re+datat[i].ToString();
      }
      //输出re,查看接收的数据
      

  11.   

    关键的问题是,你接收到的数据是组合BCD码,不是可显示字符,必须做转换