短信系统中的 7bit 编码(c)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 7-bit编码
// pSrc:
源字符串指针
// pDst:
目标编码串指针
// nSrcLength:
源字符串xx
//返回:
目标编码串xx
intgsmEncode7bit(constchar*pSrc,unsignedchar*pDst,intnSrcLength){
int nSrc; //源字符串的计数值
int nDst; //目标编码串的计数值
int nChar; //当前正在处理的组内字符字节的序号,范围是0-7unsigned char nLeft; //上一字节残余的数据
//计数值初始化
nSrc = 0;
nDst = 0;
//将源串每8个字节分为一组,压缩成7个字节
//循环该处理过程,直至源串被处理完
//如果分组不到8字节,也能正确处理
while(nSrc<nSrcLength){//取源字符串的计数值的最低3位
nChar = nSrc & 7;
//处理源串的每个字节
if(nChar == 0){//组内第一个字节,只是保存起来,待处理下一个字节时使用nLeft = *pSrc;}else{//组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节
*pDst = (*pSrc << (8-nChar)) | nLeft;
//将该字节剩下的左边部分,作为残余数据保存起来
nLeft = *pSrc >> nChar;
//修改目标串的指针和计数值pDst++;
nDst++;}//修改源串的指针和计数值
pSrc++; nSrc++;}//返回目标串长度
return nDst;}// 7-bit解码
// pSrc:
源编码串指针
// pDst:
目标字符串指针
// nSrcLength:
源编码串xx
//返回:
目标字符串xx
intgsmDecode7bit(constunsignedchar*pSrc,char*pDst,intnSrcLength){
int nSrc; //源字符串的计数值
int nDst; //目标解码串的计数值
int nByte; //当前正在处理的组内字节的序号,范围是0-6unsigned char nLeft; //上一字节残余的数据
//计数值初始化
nSrc = 0;
nDst = 0;
//组内字节序号和残余数据初始化
nByte = 0;
nLeft = 0;
//将源数据每7个字节分为一组,解压缩成8个字节
//循环该处理过程,直至源数据被处理完
//如果分组不到7字节,也能正确处理
while(nSrc<nSrcLength){//将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节
*pDst = ((*pSrc << nByte) | nLeft) & 0x7f;
//将该字节剩下的左边部分,作为残余数据保存起来
nLeft = *pSrc >> (7-nByte);
//修改目标串的指针和计数值
pDst++;
nDst++;
//修改字节计数值
nByte++;
//到了一组的最后一个字节
if(nByte == 7){//额外得到一个目标解码字节*pDst = nLeft;
//修改目标串的指针和计数值
pDst++;
nDst++;
//组内字节序号和残余数据初始化
nByte = 0;
nLeft = 0;}//修改源串的指针和计数值pSrc++;
nSrc++;}*pDst = 0;
//返回目标串xx
return nDst;}。