短信编码从8bit转到7bit

不知为什么,使用AT指令命令设备(测试设备USB Modem : HUAWEI E3131)发送短信时,使用Unicode和7bit编码方式都能成功,但是8bit(就是ASCII)方式不成功。当需要发送的短信只包含标准字符并且使用unicode可能超过70个字符时,7bit编码就会被采用以增加短信长度限制到140个字符。

原理图出自于这里
8bit-7bit.png

C++(Qt)代码如下

//Content是一个QString,如"AAB1E78653"
int iLen = Content.length();
BYTE *pucDate = new BYTE[iLen];
for(int i = 0; i < iLen;i++) {
	pucDate[i] = Content.at(i).toLatin1();
}

//8bit(ascii)转7bit
BYTE *pucDate7 = new BYTE[iLen];
int lackNumber = 1;
int bit7pos = 0;
for(int i = 0;i < iLen;i++) {
	//7个8bit数据=8个7bit数据个为一个循环
	if(8 == lackNumber) {
		lackNumber = 1;
	} else {
	if(i + 1 == iLen)
	{
		pucDate7[bit7pos] = pucDate[i];
	} else {
		pucDate7[bit7pos] = ((pucDate[i + 1] & ((BYTE)qPow(2, lackNumber) - 1)) * (BYTE)qPow(2, 8 - lackNumber) + pucDate[i]);
		pucDate[i + 1] = pucDate[i + 1] / (BYTE)qPow(2, lackNumber);
	}

	lackNumber++;
	bit7pos++;
	}
}