最近做个项目,把长短信内容分拆为多条短信,按字节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
分享到:
相关推荐
长短信拆分的目的是将超过标准短信长度(通常为140字节)的短信内容分成多个符合标准长度的短信段进行发送。这需要遵循GSM03.40规范中的相关规定,特别是关于TP_UDHI(Transport Protocol User Data Header ...
用C语言拆分字节,可以拆分上万的数字,显示在液晶屏上
在编程和计算机科学中,"一个字拆分成高低字节"是处理二进制数据时常见的操作,尤其是在处理低级编程、嵌入式系统或特定的微控制器如西门子1200系列时。这个过程涉及到将一个字(通常为16位或32位的数据单元)分解为...
单字节、多字节、双字节的相互转换是非常必要的,它们之间的转换需要根据实际情况选择合适的转换函数,以确保字符串的正确转换。同时, Unicode 和宽字符也是非常重要的概念,它们提供了一种统一的字符编码方式,...
在实际编程中,根据需求,有时我们需要将字节集转换为字节数组,或者反过来,以便进行各种数据处理。 转换的核心在于理解这两种数据类型的本质和特性。字节集是易语言特有的数据结构,它以集合的形式存储字节,不...
1. 读取文件内容,将其转化为字符串。 2. 检查字符串长度是否为5字节的偶数倍,如果不是,需要进行处理,如截断或填充。 3. 使用循环按5字节切割字符串,得到子串列表。 4. 对子串列表进行两两位置互换,可以使用两...
1. 文件读写:在处理二进制文件时,我们可以先创建一个空的字节集,然后逐步将文件内容追加到字节集中,最后再一次性写入文件,这样可以提高效率。 2. 网络通信:在网络编程中,字节集常用于构建和解析数据包。我们...
在这个V15版本中,我们聚焦于一个特定的功能:将整数拆分到字节数组中。这个功能在处理PLC(可编程逻辑控制器)的数据传输时尤为关键,因为PLC内部存储和通信往往基于字节级别的操作。 整数拆分到字节数组的过程...
高至低和低至高的数据拆分是有不同的 数据帧的拆分哦
因此,如果我们想要根据字节数截取字符串,我们不能简单地用`substring()`,而是需要先计算字符串的字节数,然后根据这个字节数来定位截取的位置。 下面是一种可能的实现方式: 1. 使用`getBytes()`方法转换字符串...
ip地址点分四段,拆分成四个字节char型数值,放在一个char行数组中。
易语言提供了“字节集到字节”命令,可以将字节集中的一个字节取出,然后使用“数组赋值”命令将这个字节赋值给数组的一个元素。 3. **循环操作**:为了将整个字节集复制到数组,你需要遍历字节集的所有字节。这...
2. **字节集到字节型数组的转换**:当需要将字节集转换为字节型数组时,可以使用循环语句,逐个读取字节集内的字节并存入新创建的字节型数组中。下面是一个示例源码: ```易语言 .字节集 = .创建字节集() // 创建一...
本文将详细探讨“文本型转文本字节集”以及“文本字节集转字节集”的转换过程,以帮助你更好地理解和应用易语言。 首先,我们来看“文本型转文本字节集”。在易语言中,“文本型”是指由汉字、字母、数字等字符组成...
开发socket上传数据的时候,udp包有大小限制,所以需要按字节分割读取的文件。 网上找到的有没有合适的,就自己弄了一个。有需要可以试试。
十进制数字拆分成4字节十六进制数.vi十进制数字拆分成4字节十六进制数.vi
在C#编程中,有时我们需要根据字节长度来截取字符串,这可能是因为要处理不同编码格式的数据,或者为了适应特定的传输限制。本篇将详细介绍如何在C#中按照字节长度截取字符串,并结合正则表达式进行操作。 首先,...
长短信实际也是由普通短信方式发送的,每条短信也是 70 字,只是每条短信头部有特殊标记,这也需要占一定的字符,一般情况有 6--16 个字节分别定义短信唯一标识以及该短信是第几条(特殊标记所占字符根据不同情况而...
例如,我们可以打开一个图片文件,然后用“读取文件”命令一次性读取整个文件内容到字节集中。 相反,将字节集转换回图片的过程称为反序列化或解码。这需要对图片的编码格式有深入理解,因为不同的图片格式有不同的...