短信猫开发(2): 接收短信后的解码

at+cmgf=0 // 设置为PDU方式接收短信


接收到的信息:

+CMGR: 0,,25
08
91
683110903305F0
20
0D
91
683148625389F3
00
00  // 代表编码方式为7位编码方式  08:代表为16位编码方式
61803051525023
05
E8329BFD06

OK


对接收到的信息解码:

/// <summary>
        /// 解码由7位编码的字符串
        /// </summary>
        /// <param name="src"></param>
        /// <returns></returns>
        public String Decode7(String src)
        {
            StringBuilder sb = new StringBuilder();
            int[] cs = new int[src.Length / 2];

            //将字符串形式的十六进制数转换位整数
            int tmpout = 0;
            for (int i = 0; i < src.Length / 2; i++)
            {
                if (int.TryParse(src.Substring(i * 2, /*i * 2 +*/ 2), System.Globalization.NumberStyles.AllowHexSpecifier, null, out tmpout))
                {
                    cs[i] = tmpout;
                }
            }
            int iLeft = 0;//上一个字符剩余的部分
            int iChar = 0;//当前字符应处理位的个数
            int tmp = 0;//中间变量
            int j = 0;//循环变量

            while (j < cs.Length)
            {
                tmp = ((cs[j] << iChar) & 0x7f) | iLeft;
                sb.Append((char)tmp);
                iLeft = cs[j] >> (7 - iChar);
                j++;
                iChar++;

                if (iChar == 7)
                {
                    sb.Append((char)iLeft);
                    iLeft = 0;
                    iChar = 0;
                }
            }

            if (iLeft != 0)
                sb.Append((char)iLeft);
            return sb.ToString();
        }

/// <summary>
        /// 解码由16位编码的字符串
        /// </summary>
        /// <param name="src"></param>
        /// <returns></returns>
        public String Decode16(String src)
        {
            StringBuilder sb = new StringBuilder();
            int tmp = 0;
            for (int i = 0; i < src.Length / 4; i++)
            {
                if (int.TryParse(src.Substring(i * 4, /*(i + 1) * */ 4), System.Globalization.NumberStyles.AllowHexSpecifier, null, out tmp))
                    //tmp = Integer.parseInt(src.substring(i * 4, (i + 1) * 4), 16);
                    sb.Append((char)tmp);
            }
            return sb.ToString();
        }

其中,

System.Globalization.NumberStyles.AllowHexSpecifier
表示  指示数值字符串表示一个十六进制值。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值