深圳市未来时代科技有限公司

标题: 短信收发设备c#实现7bitPDU的解码 [打印本页]

作者: admin    时间: 2014-3-12 17:58
标题: 短信收发设备c#实现7bitPDU的解码
前天发表的那篇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.   }
复制代码

类库中的其他改动:
工程附件: GSMMODEM 已修改.rar (134.42 KB, 下载次数: 3293)






欢迎光临 深圳市未来时代科技有限公司 (http://inextera.com/) Powered by Discuz! X3.1