`
yuky1327
  • 浏览: 125075 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

短信内容根据字节分拆

    博客分类:
  • Java
阅读更多
最近做个项目,把长短信内容分拆为多条短信,按字节160个分拆,由于汉字和全角的符号截取不当造成乱码,参考了网上一篇文章,但是那文章考虑得不是很周全,所以我修改了局部代码,最后终于完成我要的效果了,一开始有考虑过正则表达式,JAVA是有支持的,只是我觉得效率可能还不如我这样写,各位朋友也可以尝试一下别的方法来实现,以下代码是适用C++。
package cn.gzjp.crbt.common.util;

import java.io.UnsupportedEncodingException;

/**
 * 
* 功能描述:字符串根据字节分拆,用于短信内容分拆
* <p>版权所有:金鹏科技
* <p>未经本公司许可,不得以任何方式复制或使用本程序任何部分
*
* @author zhangjh 新增日期:2010-12-22
* @author 你的姓名 修改日期:2010-12-22
* @since zte_crbt_bi
 */
public class SplitString {
	private String str;
	private int bytes;
	private byte[] strBytes;
	private byte[] result;
	private byte[] another;
	// 字节大于127,值是负数
	private byte border = 0;

	public SplitString(String str, int bytes) {
		try {
			this.str = str;
			byte[] s = str.getBytes("GBK");
			if(s.length<bytes)
				this.bytes = s.length;
			else
				this.bytes = bytes;
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		//System.out.println("The String is: " + str + " ; Bytes is : " + bytes);
	}

	public String split() {
		try {
			strBytes = str.getBytes("GBK");
			//System.out.println("strBytes.length:"+strBytes.length+",bytes:"+bytes);
			result = new byte[bytes];
			another = new byte[bytes - 1];
			boolean flag = false;
			int icount =0;
			for (int i = 0; i < result.length; i++) {
				if (strBytes[i] < 0) {
					if (icount % 2 == 0) {
						flag = true;
					} else {
						flag = false;
					}
					icount++;
				}
				result[i] = strBytes[i];
			}
			//System.out.println("flag:"+flag);
			// 判断是否汉字第一个字符(无符号值>127;带符号则<0,为负数!)
			if (flag && result[result.length - 1] < border) {
				if (!flag &&result[result.length - 2] < border) {
					//System.out.println("1."+new String(result,"GBK"));
					return new String(result,"GBK");
				}
				for (int i = 0; i < another.length; i++) {
					another[i] = result[i];
				}
				//System.out.println("2."+new String(another,"GBK"));
				return new String(another,"GBK");
			} else {
				//System.out.println("3."+new String(result,"GBK"));
				return new String(result,"GBK");
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		 return null;
	}

	public static void main(String[] args) throws UnsupportedEncodingException {
		long startTime =System.currentTimeMillis();
		SplitString amao;
		String str = "¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds";
		int start=0,end=0;
		int index=0;
		while(str.length()>0){
			amao = new SplitString(str, 160);
			String ll = amao.split();
			byte[] bytes = ll.getBytes("GBK");
			//System.out.println(bytes.length+":"+ll);
			start = ll.length();
			end = str.length();
			str = str.substring(start,end);
			System.out.println(index+","+ll);
			index++;
		}
		System.out.println("use time:"+(System.currentTimeMillis()-startTime));
	}
}


结果:
0,¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,A
1,BC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds¥##,ABC汉DEFsds
use time:1
分享到:
评论

相关推荐

    cmpp3 长短信拆分

    长短信拆分的目的是将超过标准短信长度(通常为140字节)的短信内容分成多个符合标准长度的短信段进行发送。这需要遵循GSM03.40规范中的相关规定,特别是关于TP_UDHI(Transport Protocol User Data Header ...

    用C语言拆分字节

    用C语言拆分字节,可以拆分上万的数字,显示在液晶屏上

    一个字拆分成高低字节;;

    在编程和计算机科学中,"一个字拆分成高低字节"是处理二进制数据时常见的操作,尤其是在处理低级编程、嵌入式系统或特定的微控制器如西门子1200系列时。这个过程涉及到将一个字(通常为16位或32位的数据单元)分解为...

    单字节 多字节 双字节 相互转换

    单字节、多字节、双字节的相互转换是非常必要的,它们之间的转换需要根据实际情况选择合适的转换函数,以确保字符串的正确转换。同时, Unicode 和宽字符也是非常重要的概念,它们提供了一种统一的字符编码方式,...

    易语言字节集与字节数组快速互转

    在实际编程中,根据需求,有时我们需要将字节集转换为字节数组,或者反过来,以便进行各种数据处理。 转换的核心在于理解这两种数据类型的本质和特性。字节集是易语言特有的数据结构,它以集合的形式存储字节,不...

    长度是5字节的偶数倍的字符串,按5字节进行拆分,两两将位置互换

    1. 读取文件内容,将其转化为字符串。 2. 检查字符串长度是否为5字节的偶数倍,如果不是,需要进行处理,如截断或填充。 3. 使用循环按5字节切割字符串,得到子串列表。 4. 对子串列表进行两两位置互换,可以使用两...

    易语言字节集动态添加

    1. 文件读写:在处理二进制文件时,我们可以先创建一个空的字节集,然后逐步将文件内容追加到字节集中,最后再一次性写入文件,这样可以提高效率。 2. 网络通信:在网络编程中,字节集常用于构建和解析数据包。我们...

    TIA博途-整数拆分到字节数组中-全局FC库文件-V15版本.zip

    在这个V15版本中,我们聚焦于一个特定的功能:将整数拆分到字节数组中。这个功能在处理PLC(可编程逻辑控制器)的数据传输时尤为关键,因为PLC内部存储和通信往往基于字节级别的操作。 整数拆分到字节数组的过程...

    字节的数据拆分

    高至低和低至高的数据拆分是有不同的 数据帧的拆分哦

    根据字节数截取字符串

    因此,如果我们想要根据字节数截取字符串,我们不能简单地用`substring()`,而是需要先计算字符串的字节数,然后根据这个字节数来定位截取的位置。 下面是一种可能的实现方式: 1. 使用`getBytes()`方法转换字符串...

    IP地址拆分成四个字节

    ip地址点分四段,拆分成四个字节char型数值,放在一个char行数组中。

    易语言字节集转换到字节型数组

    易语言提供了“字节集到字节”命令,可以将字节集中的一个字节取出,然后使用“数组赋值”命令将这个字节赋值给数组的一个元素。 3. **循环操作**:为了将整个字节集复制到数组,你需要遍历字节集的所有字节。这...

    易语言字节集转换到字节型数组源码

    2. **字节集到字节型数组的转换**:当需要将字节集转换为字节型数组时,可以使用循环语句,逐个读取字节集内的字节并存入新创建的字节型数组中。下面是一个示例源码: ```易语言 .字节集 = .创建字节集() // 创建一...

    易语言文本型转文本字节集 文本字节集转字节集

    本文将详细探讨“文本型转文本字节集”以及“文本字节集转字节集”的转换过程,以帮助你更好地理解和应用易语言。 首先,我们来看“文本型转文本字节集”。在易语言中,“文本型”是指由汉字、字母、数字等字符组成...

    文件分割工具类(按字节分割)

    开发socket上传数据的时候,udp包有大小限制,所以需要按字节分割读取的文件。 网上找到的有没有合适的,就自己弄了一个。有需要可以试试。

    十进制数字拆分成4字节十六进制数.vi

    十进制数字拆分成4字节十六进制数.vi十进制数字拆分成4字节十六进制数.vi

    C# 按照字节长度截取字符串

    在C#编程中,有时我们需要根据字节长度来截取字符串,这可能是因为要处理不同编码格式的数据,或者为了适应特定的传输限制。本篇将详细介绍如何在C#中按照字节长度截取字符串,并结合正则表达式进行操作。 首先,...

    利用CMPP\SGIP协议发送长短信发送格式说明

    长短信实际也是由普通短信方式发送的,每条短信也是 70 字,只是每条短信头部有特殊标记,这也需要占一定的字符,一般情况有 6--16 个字节分别定义短信唯一标识以及该短信是第几条(特殊标记所占字符根据不同情况而...

    易语言字节集与图片互换

    例如,我们可以打开一个图片文件,然后用“读取文件”命令一次性读取整个文件内容到字节集中。 相反,将字节集转换回图片的过程称为反序列化或解码。这需要对图片的编码格式有深入理解,因为不同的图片格式有不同的...

Global site tag (gtag.js) - Google Analytics