• 短信猫软件的实现(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#)系列博客索引

    附件:工程项目文件

  • 相关阅读:
    图像特征工程
    神经网络在多分类上的应用——数据预处理
    Robotics Lab3 ——图像特征匹配、跟踪与相机运动估计
    Robotics Lab2——相机模型,点云图拼接与深度测量
    Robotics Lab1 —— 基于颜色特征的目标识别与追踪实验
    【Ubuntu16.04】解决Qt安装包(.run文件)不能用./命令执行的问题
    【ROS系统】创建消息(msg)后使用rosmsg命令报错的解决办法
    【ROS系统】执行roslaunch命令启动launch文件提示Invalid roslaunch XML syntax错误的解决办法
    【ROS系统】解决找不到用户工作空间下的程序包的问题——E:No such package
    【UEFI+GPT/BIOS+MBR】两种模式在Windows系统下安装Ubuntu系统
  • 原文地址:https://www.cnblogs.com/Engin/p/1871154.html
Copyright © 2020-2023  润新知