首页 > 代码库 > 长短信与短信签名

长短信与短信签名

长短信一般是指超过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); 
                               //SmsCount 拆分后短信的数量,getSmsIndex()+1 第几条拆分短信 .
				memcpy(SmsContent,bHead,6);           //SmsContent 加6位字节的头协议的短信内容
				memcpy(SmsContent + 6,content,length);//content 拆分的短信内容
				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个字数不会在临界区之内。

长短信与短信签名