长短信一般是指超过70个汉字的短信内容,由于长短信需要加增加长短信的协议头(6个字节),所以,每条短信就不是70个了,而是67个汉字[即字符长度是134]。6个字节的协力头如: 6位协议头格式:05 00 03 XX MM NN.
C++实现如下:
- char bHead[20] = {0};
- sprintf(bHead,"%c%c%c%c%c%c",5,0,3,1,SmsCount,getSmsIndex() +1);
-
- memcpy(SmsContent,bHead,6);
- memcpy(SmsContent + 6,content,length);
- SmsLenth = length + 6;
- submit->setContent(SmsContent,SmsLenth);
那短信签名跟长短信有啥关系呢? 有这么一条公式来判断:67*N-签名字数-2<=临界区<=67*N [N指长短信拆分成为几条短信]。 如果该条短信在临界区之内,发送的短信内容的最后几位就会被短信签名覆盖,甚至导致短信内容丢失一大半。
我们来讨论数字签名覆盖的问题:假如短信的签名是"大家好love",这就是7个字数,如果发送的短信内容是字数是120,则需要拆分为2条短信,那么短信的临界区是 [125,134] ,所以短信内容发字数为120是没有问题的,如果发送的短信内容是130个字数的,则最后5个字数会被短信签名覆盖。
那如何来避免短信签名覆盖的问题呢? 很简单,发送的短信内容不能在临界区内。一般如果已经在临界区内了,我们不可能减少短信内容,那么可以通过短信内容后面添加相应N个空格之后,短信内容不在临界区内再拆分发送。如上面的要发送130个字数的,我们可以通过在短信内容添加5个空格,变成135个字数后再拆分。其实135个字数拆分的临界区是[192,201],所以135个字数不会在临界区之内。
最后说明一下所谓长短信是指短信的大小超过了单条短信的限制,需将短信拆分成几条短信然后分别发送,接收的时候将几条短信拼在一起组成原始短信的内容,对于拆分后每条短信的长度有一定的限制与单条短信有区别。