查看: 8726|回复: 0
打印 上一主题 下一主题

短信收发设备c#实现7bitPDU的解码

[复制链接]
跳转到指定楼层
楼主
发表于 2014-3-12 17:58:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前天发表的那篇c#实现API接口文章中实现的类库中有一个比较严重的问题,接收到ASCII码,7bit编码的短信读取到的短信内容是乱码,这样控件无法投入使用。原因是类库中没有对应的解码程序,全部按USC2的编码进行的解码。本文介绍的程序加入这部分代码解决这一问题,前面的工程项目文件同时更新这部分内容,需要的欢迎下载。

先看下PDU的7bit编码:
PDU编码详见:PDU格式短信解析

英文编码:7bit编码,依次将下一位的后几位移至前面形成新的8位编码
示例:Test
             T:01010100  e:01100101  s:01110011  t:01110100
      去最高位0,变为7位
             T:1010100  e:1100101  s:1110011  t:1110100
      后面低位移至前面形成8位编码
             Test:11010100111100101001110000001110
             UD: D4F29C0E   UDL:04

解码算法:使用循环;每次循环读取一个位组(已存入字节缓冲区);转化为二进制字符串,取低位和对应上个位组剩下的二进制位组成7bit ASCII码,加入结果数组。
  1.   private string PDU7bitDecoder(string userData)
  2.    {
  3.        string result = string.Empty;
  4.        byte[] b = new byte[100];
  5.        string temp = string.Empty;
  6.    
  7.        for (int i = 0; i < userData.Length; i += 2)
  8.        {
  9.            b[i / 2] = (byte)Convert.ToByte((userData[i].ToString() + userData[i + 1].ToString()),16);
  10.       }
  11.    
  12.       int j = 0;            //while计数
  13.       int tmp = 1;            //temp中二进制字符字符个数
  14.       while (j < userData.Length / 2 - 1)
  15.       {
  16.           string s = string.Empty;
  17.    
  18.           s = Convert.ToString(b[j], 2);
  19.    
  20.           while (s.Length < 8)            //s补满8位 byte转化来的 有的不足8位,直接解码将导致错误
  21.           {
  22.               s = "0" + s;
  23.           }
  24.    
  25.          result += (char)Convert.ToInt32(s.Substring(tmp) + temp, 2);        //加入一个字符 结果集 temp 上一位组剩余
  26.   
  27.           temp = s.Substring(0, tmp);             //前一位组多的部分
  28.   
  29.           if (tmp > 6)                            //多余的部分满7位,加入一个字符
  30.           {
  31.               result += (char)Convert.ToInt32(temp, 2);
  32.               temp = string.Empty;
  33.               tmp = 0;
  34.           }
  35.    
  36.           tmp++;
  37.           j++;
  38.    
  39.           if (j == userData.Length / 2 - 1)           //最后一个字符
  40.           {
  41.               result += (char)Convert.ToInt32(Convert.ToString(b[j], 2) + temp, 2);
  42.           }
  43.       }
  44.       return result;
  45.   }
复制代码

类库中的其他改动:
  • UserData get访问器:加入对这部分代码的调用:
          
    1.   get
    2.                {
    3.                    int len = Convert.ToInt32(userDataLenghth, 16) * 2;
    4.                    string result = string.Empty;
    5.    
    6.                    if (dataCodingScheme == "08" || dataCodingScheme == "18")   新加入判断          //USC2编码
    7.                    {
    8.                        //四个一组,每组译为一个USC2字符
    9.                        for (int i = 0; i < len; i += 4)
    10.                       {
    11.                           string temp = userData.Substring(i, 4);
    12.    
    13.                           int byte1 = Convert.ToInt16(temp, 16);
    14.    
    15.                          result += ((char)byte1).ToString();
    16.                       }
    17.                   }
    18.                   else  
    19.                   {
    20.                       result = PDU7bitDecoder(userData); 加入调用7bit
    21.                   }
    22.    
    23.                   return result;
    24.               }
    复制代码
    原来代码中未用DCS(解码时),现在需加入:
  • 解码函数:加入DCS写入
    1.   dataCodingScheme = strPDU.Substring(lenSCA + lenOA + 4, 2);             //DCS赋值,区分解码7bit
    复制代码

    另外还改动了
    1.   userData = strPDU.Substring(lenSCA + lenOA + 22);
    复制代码
    句。原来有子字符串长度,由于7bit编码和USC2编码长度计算不太一样,去掉此参数,直接取到字符串尾。
  • 现在,一个可用的类库完成了,虽然功能还不是很强。
    带改动的地方:7bit编码的加入等;现在ASCII码短信的发送使用的也是USC2编码,显然过于浪费空间(7bit编码一条短信可发160字符,USC2仅70个字符)。

    如果想让上篇实现的猫程序能够识别7bit编码(只是接收),把今天生成的DLL文件覆盖上一篇用的文件即可,其他地方不必改动。
    更新部分:解码函数while循环,改成do-while循环,解决只收到一个英文字符时,解码内容为空的问题

工程附件: GSMMODEM 已修改.rar (134.42 KB, 下载次数: 3038)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|未来时代科技 ( 粤ICP备12044031号-1

GMT+8, 2024-4-29 11:25 , Processed in 0.063066 second(s), 27 queries .

Powered by WLSD X3.1

© 2013-2014 WLSD Inc.

快速回复 返回顶部 返回列表
 
【电话】(15118131494)
【QQ】 未来时代科技01 售前咨询
【QQ】 未来时代科技02 售后技术
【旺旺】 请问有什么可以帮到您?不在线可留言.
【邮箱】
inextera@sina.com
【地址】 (深圳市龙岗坂田扬马小区)