首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

c语言7位编码有关问题,发送短消息

2013-07-08 
c语言7位编码问题,发送短消息以下这段程序 只能正确编码6个字符,比如hellogoodboy,只能正确发送hellog后面

c语言7位编码问题,发送短消息
以下这段程序 只能正确编码6个字符,比如hellogoodboy,只能正确发送hellog后面都是乱码,这段程序是在网上找的,本人是做上层app,不擅长这种移位计算,请高手指点,
7位编码是将8个字节为一组,编码后为7个字节,也就是说hellogoo编码完后,需要重新开始编码dboy,反正就是8个一组了,短信的发送对我来说真是不好做擦

// 7-bit编码
// pSrc: 源字符串指针
// pDst: 目标编码串指针
// nSrcLength: 源字符串长度
// 返回: 目标编码串长度
int gsmEncode7bit(char* pSrc, unsigned char* pDst, int nSrcLength)
{
    int nSrc;        // 源字符串的计数值
    int nDst;        // 目标编码串的计数值
    int nChar;       // 当前正在处理的组内字符字节的序号,范围是0-7
    unsigned 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; 
}
[解决办法]
算法问题,我也想不出有效的方法,不过可以弄一个比较笨,但直观的方法


//nSrcLength<256
int gsmEncode7bit(char* pSrc, unsigned char* pDst, int nSrcLength)
{


    uint i;
    uchar dst[256*8];
    for(i=0;i<sizeof(dst);i++0dst[i]=0;
    for(i=0;i<SrcLength;i++)
    {
        if(pSrc[i]&0x40 == 0x40)dst[i*7]=1;//可以循环优化下
        if(pSrc[i]&0x20 == 0x20)dst[i*7+1]=1;
        if(pSrc[i]&0x10 == 0x10)dst[i*7+2]=1;
        if(pSrc[i]&0x08 == 0x08)dst[i*7+3]=1;
        if(pSrc[i]&0x04 == 0x04)dst[i*7+4]=1;
        if(pSrc[i]&0x02 == 0x02)dst[i*7+5]=1;
        if(pSrc[i]&0x01 == 0x01)dst[i*7+6]=1;
    }
    for(i=0;i<SrcLength*7/8;i++)
    {
        pDst[i]=0;
        pDst[i]
[解决办法]
=dst[i*7];pDst[i]<<=1; //可以循环优化下
        pDst[i]
[解决办法]
=dst[i*7+1];pDst[i]<<1;
        pDst[i]
[解决办法]
=dst[i*7+2];pDst[i]<<1;
        pDst[i]
[解决办法]
=dst[i*7+3];pDst[i]<<1;
        pDst[i]
[解决办法]
=dst[i*7+4];pDst[i]<<1;
        pDst[i]
[解决办法]
=dst[i*7+5];pDst[i]<<1;
        pDst[i]
[解决办法]
=dst[i*7+6];
    }
}


原理就是把原字符串的每一字节的低7位都提取出来放到dst[]中,然后目标字符串根据dst[]对应的值赋值,很笨,但管用
[解决办法]
这个是8位扩展ASCII码中(0-127)拼成7为ASCII码过程,这个还用算法么,我以前都是向下面这样直接拼的

nSrcLength1 = nSrcLength&(~7);
nSrcLength2 = nSrcLength&0x07;
nDst = 0;
pSrc1 = (unsigned char *)pSrc;
for(nSrc=0; nSrc<nSrcLength1; nSrc+=8)
{
    pDst[0] = pSrc1[0]
[解决办法]
(pSrc1[1]<<7);
    pDst[1] = (pSrc1[1]>>1)
[解决办法]
(pSrc1[2]<<6);
    pDst[2] = (pSrc1[2]>>2)
[解决办法]
(pSrc1[3]<<5);
    pDst[3] = (pSrc1[3]>>3)
[解决办法]
(pSrc1[4]<<4);
    pDst[4] = (pSrc1[4]>>4)
[解决办法]
(pSrc1[2]<<3);
    pDst[5] = (pSrc1[5]>>5)


[解决办法]
(pSrc1[2]<<2);
    pDst[6] = (pSrc1[6]>>6)
[解决办法]
(pSrc1[2]<<1);
    pDst += 7;
    pSrc1 += 8;
    nDst += 7;
}

if(nSrcLength2 > 0)
{
    for(nSrc=0; nSrc<nSrcLength2-1; nSrc++)
    {
        *pDst++ = (pSrc1[0]>>nSrc)
[解决办法]
(pSrc1[1]<<(7-nSrc));
        nDst++;
        pSrc1++;
    }
    *pDst = (pSrc1[0]>>nSrc);
    nDst++;
}

return nDst;





热点排行