GSM短信息部分代码!(转---个人收藏)

  1 #include "stdafx.h"
  2 #include "Sms.h"
  3 #include "Comm.h"
  4 
  5 // 可打印字符串转换为字节数据
  6 // 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
  7 // 输入: pSrc - 源字符串指针
  8 //       nSrcLength - 源字符串长度
  9 // 输出: pDst - 目标数据指针
 10 // 返回: 目标数据长度
 11 int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
 12 {
 13     for (int i = 0; i < nSrcLength; i += 2)
 14     {
 15         // 输出高4位
 16         if ((*pSrc >= '0') && (*pSrc <= '9'))
 17         {
 18             *pDst = (*pSrc - '0') << 4;
 19         }
 20         else
 21         {
 22             *pDst = (*pSrc - 'A' + 10) << 4;
 23         }
 24 
 25         pSrc++;
 26 
 27         // 输出低4位
 28         if ((*pSrc>='0') && (*pSrc<='9'))
 29         {
 30             *pDst |= *pSrc - '0';
 31         }
 32         else
 33         {
 34             *pDst |= *pSrc - 'A' + 10;
 35         }
 36 
 37         pSrc++;
 38         pDst++;
 39     }
 40 
 41     // 返回目标数据长度
 42     return (nSrcLength / 2);
 43 }
 44 
 45 // 字节数据转换为可打印字符串
 46 // 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01" 
 47 // 输入: pSrc - 源数据指针
 48 //       nSrcLength - 源数据长度
 49 // 输出: pDst - 目标字符串指针
 50 // 返回: 目标字符串长度
 51 int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
 52 {
 53     const char tab[]="0123456789ABCDEF";    // 0x0-0xf的字符查找表
 54 
 55     for (int i = 0; i < nSrcLength; i++)
 56     {
 57         *pDst++ = tab[*pSrc >> 4];        // 输出高4位
 58         *pDst++ = tab[*pSrc & 0x0f];    // 输出低4位
 59         pSrc++;
 60     }
 61 
 62     // 输出字符串加个结束符
 63     *pDst = '\0';
 64 
 65     // 返回目标字符串长度
 66     return (nSrcLength * 2);
 67 }
 68 
 69 // 7bit编码
 70 // 输入: pSrc - 源字符串指针
 71 //       nSrcLength - 源字符串长度
 72 // 输出: pDst - 目标编码串指针
 73 // 返回: 目标编码串长度
 74 int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength)
 75 {
 76     int nSrc;        // 源字符串的计数值
 77     int nDst;        // 目标编码串的计数值
 78     int nChar;        // 当前正在处理的组内字符字节的序号,范围是0-7
 79     unsigned char nLeft;    // 上一字节残余的数据
 80 
 81     // 计数值初始化
 82     nSrc = 0;
 83     nDst = 0;
 84 
 85     // 将源串每8个字节分为一组,压缩成7个字节
 86     // 循环该处理过程,直至源串被处理完
 87     // 如果分组不到8字节,也能正确处理
 88     while (nSrc < nSrcLength)
 89     {
 90         // 取源字符串的计数值的最低3位
 91         nChar = nSrc & 7;
 92 
 93         // 处理源串的每个字节
 94         if(nChar == 0)
 95         {
 96             // 组内第一个字节,只是保存起来,待处理下一个字节时使用
 97             nLeft = *pSrc;
 98         }
 99         else
100         {
101             // 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节
102             *pDst = (*pSrc << (8-nChar)) | nLeft;
103 
104             // 将该字节剩下的左边部分,作为残余数据保存起来
105             nLeft = *pSrc >> nChar;
106 
107             // 修改目标串的指针和计数值
108             pDst++;
109             nDst++;
110         }
111 
112         // 修改源串的指针和计数值
113         pSrc++;
114         nSrc++;
115     }
116 
117     // 返回目标串长度
118     return nDst;
119 }
120 
121 // 7bit解码
122 // 输入: pSrc - 源编码串指针
123 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值