zoukankan      html  css  js  c++  java
  • 短信猫软件的实现(C#)<八>7bitPDU的解码

    前几天实现的类库中有一个比较严重的问题,接收到ASCII码,7bit编码的短信读取到的短信内容是乱码,这样控件无法投入使用。原因是类库中没有对应的解码程序,全部按USC2的编码进行的解码。本文介绍的程序加入这部分代码解决这一问题,前面的工程项目文件同时更新这部分内容,需要的欢迎下载。

    先看下PDU的7bit编码:
    PDU编码详见:短信猫软件的实现(C#)<三>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循环,解决只收到一个英文字符时,解码内容为空的问题 2011-04-11  文件修改后内容在:

    短信猫软件的实现(C#)系列博客索引

    附件:工程项目文件

  • 相关阅读:
    数据绑定表达式语法(Eval,Bind区别)
    使用博客园的第一件事 自定义主题
    sql2000 跨服务器复制表数据
    使用UpdatePanel 局部刷新出现中文乱码的解决方法!!
    MMC不能打开文件MSC文件
    sql 日期 、时间相关
    loaded AS2 swf call function in AS3 holder
    Rewrite the master page form action attribute in asp.net 2.0
    100万个不重复的8位的随机数
    flash 中实现斜切变型
  • 原文地址:https://www.cnblogs.com/Engin/p/1871154.html
Copyright © 2011-2022 走看看