`
xfbbsnet
  • 浏览: 93661 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

短信分割算法 转

阅读更多
  /**
     * 以给定的<code> LENGTH </code>分割短信内容,返回分割后的字符串数组<br>
     * 以下是返回内容示例:
     *
     * <pre>
     * sSMS = “abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz”;
     * 1. 分割后的短信个数 < 10
     * LENGTH = 10;
     * (1/6)abcdefghij
     * (2/6)klmnopqrst
     * (3/6)uvwxyzabcd
     * (4/6)efghijklmn
     * (5/6)opqrstuvwx
     * (6/6)yz = 7
     *
     * 2. 分割后的短信个数 >= 10
     * LENGTH = 5;
     * (1/15)abcd
     * (2/15)efgh
     * (3/15)ijkl
     * ......
     * (13/15)tuv
     * (14/15)wxy
     * (15/15)z
     * </pre>
     *
     * @param sSMS
     *            短信内容
     * @param LENGTH
     *            每条短信的长度
     * @return 一组短信内容
     */
    public static String[] smsSplit(String sSMS, final int LENGTH) {
       int iContentLength = sSMS.trim().length();
       if (LENGTH >= iContentLength) {
           // 短信内容的长度小于等于LENGTH,不用分割直接返回
           return new String[] { sSMS };
       }

       final int iSMS_Num_9 = 9; // 分割9条短信
       int iSum = LENGTH * iSMS_Num_9; // 短信条数等于9的总长度,
       int iLength = 0;
       if (iContentLength > iSum) {
           // 源短信的长度大于iSum,表示源短信可以被分割的数量超过10条
           iLength = LENGTH - 1;
           iSum = iLength * iSMS_Num_9;
       } else if (iContentLength < iSum) {
           // 源短信的长度小于iSum,表示源短信可以被分割的数量小于等于9条
           iLength = LENGTH;
           iSum = iContentLength;
       }

       // 短信个数小于10
       String sSMS9 = sSMS.trim().substring(0, iSum);
       String[] aSMS9 = smsSplitByLength(sSMS9, iLength);

       if (iContentLength == iSum) {
           List<String> oList = new ArrayList<String>();
           String sTemp;
           final int iSMSNum = aSMS9.length;
           for (int i = 0; i < aSMS9.length; i++) {
              sTemp = "(" + (i + 1) + "/" + iSMSNum + ")" + aSMS9[i];
              oList.add(sTemp);
           }
           String[] aSMS = oList.toArray(new String[0]);
           return aSMS;
       }

       String sTemp1 = aSMS9[aSMS9.length - 1];
       String sTemp2 = aSMS9[aSMS9.length - 2];

       String sSMS10 = null;
       String[] aSMS10 = null;
       if (sTemp1.length() != sTemp2.length()) {
           String[] aTemp = aSMS9;
           aSMS9 = new String[aTemp.length - 1];
           System.arraycopy(aTemp, 0, aSMS9, 0, aTemp.length - 1);
           sSMS10 = sTemp1 + sSMS.trim().substring(iSum);
           aSMS10 = smsSplitByLength(sSMS10, iLength - 1);
       } else {
           sSMS10 = sSMS.trim().substring(iSum);
           aSMS10 = smsSplitByLength(sSMS10, iLength - 1);
       }

       List<String> oList = new ArrayList<String>();
       String sTemp;
       final int iSMSNum = aSMS9.length + aSMS10.length;
       for (int i = 0; i < aSMS9.length; i++) {
           sTemp = "(" + (i + 1) + "/" + iSMSNum + ")" + aSMS9[i];
           oList.add(sTemp);
       }
       for (int i = 0; i < (aSMS10.length); i++) {
           sTemp = "(" + (i + 10) + "/" + iSMSNum + ")" + aSMS10[i];
           oList.add(sTemp);
       }
       String[] aSMS = oList.toArray(new String[0]);
       return aSMS;
    }

    /**
     * 以给定的<code> LENGTH </code>分割短信内容,返回分割后的字符串数组<br>
     * <b>注意:返回数组中的最后一个元素的字符串长度不一定等于<code> LENGTH </code>,<br>
     * 即不考虑<code> sSMS.length % LENGTH != 0 </code></b>
     *
     * @param sSMS
     *            短信内容
     * @param LENGTH
     *            每条短信的长度
     * @return 一组短信内容
     */
    private static String[] smsSplitByLength(String sSMS, final int LENGTH) {
       int iContentLength = sSMS.trim().length();
       String sTemp;
       int x = 0;
       int y = 0;
       List<String> l = new ArrayList<String>();
       while (true) {
           y = x + LENGTH;
           if (y > iContentLength)
              y = iContentLength;
           sTemp = sSMS.substring(x, y);
           l.add(sTemp);
           x = y;
           if (x == iContentLength)
              break;
       }
       return l.toArray(new String[0]);
    }
分享到:
评论

相关推荐

    手机短信编码解码Demo

    为了解决这个问题,短信被分割成多个部分,每个部分称为一个PDU(Protocol Data Unit)。 PDU编码是一种二进制表示方式,用于打包短信内容、地址信息、控制参数等。它包括了服务中心地址、短信中心号码、短信类型、...

    C/C++短信编解码

    5. **UDH(User Data Header)**:这是长短信分割后的每个片段前面的一段信息,指示了短信的总长度、片段数量以及当前片段的位置。在C/C++中,你需要理解和处理这个结构,以正确地解析和重组长短信。 6. **PDU模式...

    短信PDU工具

    2. **分段与重组**:如果一条短信内容过长,不能一次性发送,那么它会被自动分割成多个PDU段,每个段都包含一个顺序号,以便接收端能正确重组原始信息。 3. **地址信息**:PDU短信包含收件人和发件人的电话号码,...

    Android实现短信加密功能(发送加密短信、解密本地短信)

    如果短信过长,需要分割成多个部分发送。在示例代码中,可以通过设置每条短信不超过70个字来避免这个问题。 6. **监听短信发送状态**: 为了确保短信成功发送,可以创建一个BroadcastReceiver来监听发送状态。在...

    电子政务-借助流动无线电网的短信息业务发送基本字元构成的亚洲文字.zip

    3. **分段与重组**:当一条短信超过规定的字符数时,需要将其分割成多个部分(称为短信片段)进行发送,然后在接收端重新组合。这涉及到短信的分段算法和重组策略。 4. **多语言支持**:电子政务系统需要支持多种...

    sms_pdus.rar_sms

    这包括创建能够正确编码和解码PDU的算法,以及处理可能出现的错误,如无效的PDU格式、超长短信的分割与合并等。通过深入学习和理解这个资料,开发者能够更好地理解和操作GSM短信协议,从而构建更高效、更可靠的短信...

    pdu编码解码源码

    2. 分割UCS-2:根据短信的最大长度(通常为160个7位字符或70个16位字符)将UCS-2编码分割成多个部分。 3. 7位编码:将每个UCS-2字符转换为7位的编码,可能需要填充和奇偶校验。 4. 16进制表示:将7位编码的字节序列...

    PHP截取发动短信内容的方法

    使用`DAdmin_Utils::gbkStrSplit`方法将短信内容分割成多个不超过700字节的片段。如果内容过长,返回的是一个包含截取后内容的数组。在`foreach`循环中,将每个片段与序列号结合,并调用发送短信的函数。 4. **...

    1.12编程基础之函数与过程抽象(10题)--题目 有链接.pdf

    - **知识点**:字符串分割、匹配算法、位置查找。 - **应用示例**:统计给定文本中某个单词出现的次数以及第一次出现的位置,不区分大小写。 ##### 第6题:寻宝 - **知识点**:文本分析、模式匹配。 - **应用示例**...

    C语言编程题精选.pdf

    十进制转R进制 - **知识点**: - 数制转换 - 运算操作 - 数组或字符串用于存储结果 - **技术要点**: - 使用除基取余的方法实现转换 - 根据不同的R值使用不同的字符集表示(0-9, A-F) - 反向拼接结果以得到...

    网络游戏-实现CDMA和GSM网络长短信互通的系统及方法.zip

    2. **短信分割与重组**:长短信在GSM网络中需要被分割成多个短消息进行传输,而CDMA网络可能允许发送更大的数据块。系统必须能够智能地处理这种差异,确保短信在接收端能正确重组。 3. **网络接口**:系统需要有...

    基于Hadoop平台的通信数据分布式查询算法的设计与实现

    1. **数据预处理**:通信数据通常包含大量非结构化和半结构化信息,如通话记录、短信日志、用户位置等。预处理步骤包括数据清洗、转换和归一化,以便于后续的分析和查询。 2. **数据建模**:将通信数据转化为适合...

    人工智能-机器学习-手写识别算法研究及在移动平台上的应用.pdf

    通过精确提取重叠笔画的特征,并利用支持向量机或人工神经网络进行模式分类,准确地分割笔画,确保识别的准确性。 移动平台的计算资源限制也是一个不可忽视的问题。为了使手写识别算法能够更高效地在移动平台上运行...

    C# winform典型系统开发模板

     10.3.5 转到某天、某周、某月及某年的实现 243  10.3.6 节日管理 245  10.3.7 提醒管理 249 第11章 文件批量处理器   11.1 概述 256  11.2 关键技术 256  11.2.1 文件流技术 256  ...

    密码学SMS4

    2. **基本操作**:短信4算法的核心包括字节替换(S盒)、行位移(ShiftRows)、列混淆(MixColumns)以及密钥扩展。这些操作都是为了增加密码的复杂性和安全性。 **二、C语言实现** 1. **字节替换(S盒)**:S盒是...

    垃圾检测数据集,2000张

    在模型训练过程中,数据集会被分割成训练集和验证集。训练集用于教模型学习识别特征,而验证集则用来在训练过程中评估模型的性能,防止过拟合。在五类分类问题中,准确率、召回率、F1分数等指标将被用来衡量模型的...

    百度API生成短链代码

    - **短链接**:经过特定算法处理后的、较短形式的网络资源地址,通常用于替代长链接进行分享。 - **API**:应用程序编程接口(Application Programming Interface),一组定义软件组件如何交互的规则和协议。 #####...

    TC35 PDU编码助手 York

    1. **数据分割**:如果原始数据长度超过一个短信所能携带的最大长度,需要将其拆分成多个PDU。 2. **地址编码**:编码发送方和接收方的电话号码,通常是国际格式,转换成相应的二进制表示。 3. **数据编码**:将文本...

    机器学习在运营商用户流失预警中的运用.pdf

    3. 决策树是一种直观易懂的分类模型,通过一系列规则(节点和分支)对数据进行分割,最终形成决策路径。随机森林则是决策树的集成方法,通过构建多个决策树并取多数投票来提高预测准确性。 4. 随机森林是在决策树...

    基于FPGA的数字信号处理模块设计与实现.pdf

    使用VHDL可以实现对FPGA逻辑的精确控制,设计者可以将复杂的信号处理算法用VHDL语言描述出来,并在FPGA上进行实现。 文档中强调了模块化设计方法的重要性。模块化设计是指将系统分割为多个功能独立的模块,通过接口...

Global site tag (gtag.js) - Google Analytics