char *buf;//buf为你的接收缓冲
wsprintf("%s", buf);试一下吧祝你好运

解决方案 »

  1.   

    看看吧,对你有帮助的.手机短信息SMS的程序开发安徽省信息产业厅 钱勤目前手机短信息的应用越来越广泛,互联网上提供短信息发送的站点也越来越多,但一些站点的服务并不尽如人意,往往发出去的短信息石沉大海。最可靠的发送方法当然是用手中的手机了,如果设置了状态报告,更能确切知道对方是否收到了此条信息。手机发送尽管比较可靠, 但也存在输入麻烦、效率低的问题。本文介绍一种方法,只要手机能够与电脑相连(通过红外端口或用手机数据线连接串行口,同时手机支持GSM AT指令集),就可以通过自行编制的短信息发送软件,实现短信息的发送。
    现在市场上的大多数手机均支持类似于Modem控制的GSM AT指令集,该指令集是由诺基亚、爱立信、摩托罗拉和HP等厂家共同为GSM系统研制的,其中包含了对SMS(Short Message Service)的控制。
    GSM AT相关指令的介绍
    与SMS有关的GSM AT指令如表1所示:
     
    表1 相关的GSM AT指令
    对SMS的控制共有三种实现途径:
    Block Mode;
    基于AT命令的Text Mode;
    基于AT命令的PDU Mode。
    Text Mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息正文经过十六进制编码后被传送。目前,PDU已取代Block Mode,因此本文主要探讨PDU模式的发送。
    计算机和手机的通信 
    本文以西门子 S3568i为例,介绍如何实现短信息的发送。
    数据线连接
    首先,通过S35/25数据线将手机与电脑串行口相连。然后,打开超级终端,选择直接串行口连接,端口参数设为19200速率、无校验、数据位8、停止位1。
    红外线连接
    如果使用带红外端口的计算机,可以设置与手机的无线连接。首先确认计算机红外端口已打开,并将手机的红外线和收传真/数据功能打开,对接红外端口,计算机系统托盘上应当出现一个红外设备西门子S35(如果没有安装红外监视器,则不显示)。然后,打开超级终端,选择IrDa上的串行口。
    连接测试
    点击超级终端工具条上的呼叫按钮,输入AT并回车,屏幕上如果出现OK则表明计算机与手机的连接成功,这时就可以输入各类GSM AT指令了。
    如:查询手机厂家,输入AT+CGMI=<CR>,屏幕显示Siemens。
    通常情况下,执行测试命令AT+CMGS=?<CR>,如果返回OK,表明手机支持此指令。该指令的完整语法格式如下:
    If PDU mode (+CMGF=0)+CMGS=<length><CR>PDU is given <ctrl-Z/ESC>
    如果短信息格式指令AT+CMGF返回的是0,则SMS格式为PDU模式,再执行AT+CMGS=<数据长度>命令后,手机返回“>”符号并等待输入,输入PDU数据并以^Z或Esc键结束。
    如果信息发送成功,则返回OK,并显示信息号:
    +CMGS: <mr>
    如果发送失败,则返回如下信息:
    +CMS ERROR: <err>
    PDU数据格式的分析
    下面通过对存储在手机中的待发信息的分析,来介绍SMS PDU的数据格式。首先,用手机写一条短信息,发送手机号码为13605696031,信息内容为“Hello World!”。通过执行AT+CMGL=2可以读出此条信息。
    操作过程如下(斜体字符为响应信息,{}内为注释):
    AT
    OK
    AT+CMGL=2 {读未发短信息}
    +CMGL: 1,2,,24 {1表示信息个数,2表示未发信息,24表示信息总容量}
    08 91 683108501505F0 11 00 0B 81 3106656930F1 0000A7 0B E8329BFD06DDDF723619
    OK 
    下面分析这条信息:
    08:短信息中心地址长度。
    91:短信息中心号码类型,91是TON/NPI。TON/NPI遵守International/E.164标准,指在号码前需加‘+’号;此外还可有其他数值,但91最常用。
    683108501505F0:短信息号码,是所使用的服务中心地址。由于位置上略有处理,实际号码应为:8613805515500(字母F意指长度减1),这是作者所在地GSM短信息中心的号码。
      11:文件头字节(header byte,是一种bitmask)。这里11指正常地发送短信息。
      00:信息类型。
      0B:被叫号码长度。
      81:被叫号码类型。
      3106656930F1:被叫号码,也经过了移位处理,实际号码为13605696031。
      0000A7:短信息编码类型GSM Default Alphabet,如为中文则是000010。
      0B:短信息长度。
      E8329BFD06DDDF723619:短信息内容“Hello World!”。
    短信息的编码方法及编程实现
    下面我们介绍纯英文和纯中文的信息编码方法。通过测试我们发现,每条发送的短信息前面部分均相同,只是被叫号码和短信息内容有变化。
    1.英文编码
    参见表2,设短信息内容为“Hello World!”。缺省的GSM 字符集为7位编码,可以简单地理解为ASCII码(ASCII值小于80Hex,因此,Bit8被忽略),依次将下一7位编码的后几位逐次移至前面,形成新的8位编码,参见表2箭头指示。需要注意的是第9行,移位计数已达7位,则直接将本编码前加0。GSM并非支持所有的ASCII字符显示。
     
    表2 英文编码的实现过程
    下面是实现英文编码的部分Delphi 5代码:
    //英文格式编码,s为String
    function Encode1(var s:String):String;
    var
    i,j,len:Integer;
    cur:Integer;
    t:String;
    begin
    Result:=‘’;
    len:=Length(s);
    //j 用于移位计数
    i:=1;j:=0;
    while i<=len do
    begin
    if i<len then
    //数据变换
    cur:=(ord(s[i]) shr j) or ((ord(s[i+1]) shl (7-j)) and $ff)
    else
    cur:=(ord(s[i]) shr j) and $7f;
    FmtStr(t,‘%2.2X’,[cur]);
    Result:=Result+t;
    inc(i);
    //移位计数达到7位的特别处理
    j:=(j+1) mod 7;if j=0 then inc(i);
    end;
    end;  
    2.中文编码
    参见表3,设短信息内容为“中文短信息”。中文短信息的实现较简单,只需将GB2312的中文编码转换为代码页为CP936的Unicode编码即可。
       
    表3 中文编码的实现过程
    通过Delphi的WideString类型转换,可以巧妙地实现GB2312到Unicode的编码转换(注意代码页和操作系统相关联)。下面是实现中文编码的部分Delphi 5代码:
    // 中文格式编码,s为Unicode String
    function Encode2(var s:WideString):String;
    var
    i,len:Integer;
    cur:Integer;
    t:String;
    begin
    Result:=‘’;
    len:=Length(s);
    i:=1;
    while i<=len do
    begin
    cur:=ord(s[i]);
    //BCD转换
    FmtStr(t,‘%4.4X’,[cur]);
    Result:=Result+t;
    inc(i);
    end;
    end;
    小 结
    以上介绍了PDU格式的短信息编码。建议英文信息长度不超过140个字符,中文信息不要超过54个汉字。如果使用能够支持文本方式的手机进行发送,实现起来更简单。如发送“Hello World!”,用如下的AT指令即可:
    AT+CGMF=1AT+CGMS=“13605696031”,129
    >Hello World!<^Z>
      

  2.   

    告诉一篇文章,我想对你可能会有用的.
    http://www.ccw.com.cn/htm/app/aprog/01_6_11_3.asp
      

  3.   

    http://www.ccw.com.cn/htm/app/aprog/01_6_11_3.asp
    这个打不开
      

  4.   

    //将内存中的内容以十六进制的字符串的形式表示出来
    //输入:const unsigned char *buf:内存空间
    //      unsigned long length:内存内容的长度
    //输出:无
    //返回:内存中的内容转换后的字符串
    CString CGsmTerm::bufToHex(const unsigned char *buf, unsigned long length)
    {
    const unsigned char *bb = buf;
    CString sResult; for (unsigned long i = 0; i < length; ++i)
    {
    sResult += byteToHex[*bb >> 4];
    sResult += byteToHex[*bb++ & 0xf];
    }
    return sResult;
    }
    CString CGsmTerm::UnicodeToChar(const CString sMsg)
    {
    char *pBuf;
    CString strMsg = sMsg;
    int nLength = strMsg.GetLength();
    if (nLength%2 == 1)
    {
    strMsg = strMsg.Left(nLength-1);
    int nNewLen = strMsg.GetLength();
    pBuf = new char[nNewLen/2];
    }
    else
    {
    pBuf = new char[nLength/2];
    }
    HexToChar(strMsg,pBuf);
    int i = 0,nZero = 0;
    while ((i = strMsg.Find("00",i))>=0)
    {
    i += 2;
    nZero++;
    }
    char u_ret[255];
    int nResult=WideCharToMultiByte(
      CP_ACP, // code page
      WC_COMPOSITECHECK, // character-type options
      (LPCWSTR)pBuf, // string to map
      nLength/2, //str.GetLength(),  // number of bytes in string
      (LPSTR)u_ret, // wide-character buffer
      sizeof(u_ret),    // size of buffer
      NULL,
      NULL
       );
    LPSTR lpTemp=(LPSTR)u_ret;
    int nLen = strlen(lpTemp);
    *(lpTemp+nLength/2-1-nZero)='\0';
    CString sMessage = lpTemp;
    delete []pBuf;
    return sMessage;
    }试试这两个函数,看看还缺少什么
      

  5.   

    “好”的UNICODE码为597d
    char szBuffU[2];
    char szBuff[2];szBuffU[0]=0x7d;
    szBuffU[1]=0x59;
    szBuffU[2]=TEXT('\0');WideCharToMultiByte(54936,0,(LPCWSTR)szBuffU,-1,szBuff,sizeof(szBuff),NULL,NULL);szBuff[2]=TEXT('\0');
    MessageBox(NULL,szBuff,NULL,NULL);//显示“好”
      

  6.   

    54936 Windows XP: GB18030 Simplified Chinese (4 Byte)  
    936 ANSI/OEM - Simplified Chinese (PRC, Singapore)
      

  7.   

    aXu(小鱼儿)   你能把下边的这几个函数也提供给我好吗 谢谢
    error C2065: 'byteToHex' : undeclared identifier
    error C2109: subscript requires array or pointer type
    error C2109: subscript requires array or pointer type
    error C2065: 'HexToChar' : undeclared identifier
      

  8.   

    //将内存中的内容以十六进制的字符串的形式表示出来
    //输入:const unsigned char *buf:内存空间
    //      unsigned long length:内存内容的长度
    //输出:无
    //返回:内存中的内容转换后的字符串
    CString CGsmTerm::bufToHex(const unsigned char *buf, unsigned long length)
    {
    const unsigned char *bb = buf;
    CString sResult; for (unsigned long i = 0; i < length; ++i)
    {
    sResult += byteToHex[*bb >> 4];
    sResult += byteToHex[*bb++ & 0xf];
    }
    return sResult;
    }//将字符串转换到内存中
    //输入:CString sHex:要转换的字符串
    //输出:char *p :接受内存
    //返回:无
    void CGsmTerm::HexToChar(CString sHex,char *p)
    {
    int nLen = sHex.GetLength();
    char *chBuf = p,//记录内存块的首地址
    *pch;
    CString sTemp,sLeft,sRight;
    for (int i=0; i<nLen/4; i++)
    {
    sTemp = sHex.Left(4);
    sHex.Delete(0,4);
    sLeft = sTemp.Left(2);
    sRight = sTemp.Right(2);
    *chBuf = (char)strtoul(sRight.GetBuffer(2),&pch,16);
    chBuf++;
    sRight.ReleaseBuffer();
    *chBuf = (char)strtoul(sLeft.GetBuffer(2),&pch,16);
    chBuf++;          
    sLeft.ReleaseBuffer();
    }
    *chBuf='\0';
    }
    static unsigned char byteToHex[] =
    {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
     'A', 'B', 'C', 'D', 'E', 'F'};
      

  9.   

    aXu(小鱼儿)  谢谢你提供给我的代码可是我测试后结果不正确。
    可能是我调用函数的顺序不对。
    正确的调用顺序是什么?
    CString str("4f60597d");

    CString strHex=bufToHex((const unsigned char*)str.GetBuffer(0),str.GetLength());
    CString  strMessage=UnicodeToChar(strHex);
        AfxMessageBox(strMessage);
    这是我做测试用的你看对吗?
      

  10.   

    aXu(小鱼儿):你也去看球了吗看来今天你不能答复我了是吗?
      

  11.   

    留个email,我给你我做的那个测试程序,其实已经作了很长时间了,具体的我也网的差不多了,赫赫,你自己看看我的代码吧,也许可以给你点提示
      

  12.   

    不行啊,发布过去,换一个信箱吧我的:[email protected]
      

  13.   

    qq不行,我的qq是通过代理上的,速度慢的能吓死你,再说,还没有下班,公司不让上。赫赫,抱歉
      

  14.   

    我也不知道,逆差看一下,我已经给你发过去了,我这里还没有退信。如果还有什么问题,我会的我尽量帮你解答,如果我不会,赫赫,只好抱歉了。你可以给我发email。我的email上面有
      

  15.   

    不行啊,还是发布过去,赫赫,换一个sina的信箱或者别的,我不知道出了什么问题。