用WPE抓到一个十六进制数据包如下:
23 1A 00 00 00 CC C4 14 00 0A 40 C5 00 D9 E4 22 33 1F 98 7C
我想模仿程序向服务器发送这个数据包,程序如下//从对话框接收输入的数据(23 1A 00 00 00 CC C4 14 00 0A 40 C5 00 D9 E4 22 33 1F 98 7C)到m_StrSend中,并利用消息通知发送数据.
void  CDlg::OnBtnSend()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();
HWND hwnd =::FindWindow(NULL,"xxxxxxx");
//COPYDATASTRUCT结构是WM_COPYDATA传递的数据结构对象
COPYDATASTRUCT cpd;
cpd.dwData =  0;
cpd.cbData  =  m_StrSend.GetLength();            //传递的数据长度
cpd.lpData    =  (void*)m_StrSend.GetBuffer(cpd.cbData);  //传递的数据地址
::SendMessage( hwnd, WM_COPYDATA, 0, (LPARAM) & cpd );}
void OnCopyData(WPARAM wParam,LPARAM lParam)
{
 PCOPYDATASTRUCT mydata= (PCOPYDATASTRUCT) lParam;
 CString strsend=(LPCSTR)mydata->lpData;
  strsend=strsend.Left(mydata->cbData);
char  *p =(LPTSTR)(LPCTSTR)strsend;   //MessageBox(NULL,p,"fdsa",0);
  send(g_socket,p,strlen(p)+1,0);
}
在  send(g_socket,p,strlen(p)+1,0);后,再用WPE捕捉,得到的十六进制数据包却变成了
32 33 20 31 41 20 30 30 20 30 30 20 30 30 20 43 43 20 43 34 20 31 34 20 30 30 20 30 41 20 34 30 20 43 35 20 30 30 20 44 39 20 45 34 20 32 32 20 33 33 20 31 46 20 39 38 20 37 43 00 
他似乎是把m_StrSend的每个字符又转换为十六进制了,但我本来的就是十六进制数据了,
请问怎么样才能解决.谢谢

解决方案 »

  1.   

    额, 老兄。
    又看见你了。你一定要把二进制不可读数据保存到CString的话呢, 
    需要将它转换成可读字符串以后存进去方式1: 使用Base64编码Binary后 保存
    方式2:  直接格式化二进制啊,转换为文本  CString.Format( "0x%02X" ), 转换到字符串不过,你为啥子不直接传指针呢?
      

  2.   

    WM_COPYDATA....
    不能传指针了
      

  3.   

    CString是用来储存字符串的,储存二进制数据不要用它,可以用数组来储存。
      

  4.   

    谢谢wangjia184,那个总是解决了.
    另外还想请教下,怎么样才可以把CString 转换为BYTE[]? 
    比如 现在有CString str="23 1A 00 00 00 CC C4 14 00 0A 40 C5 00 D9 E4 22 33 1F 98 7C"; 
    怎么把str转化为BYTE buffer[] = { 0x23, 0x1A, 0x00, 0x00, 0x00, 0xCC, 0xC4, 0x14, 0x00, 0x0A, 0x40, 0xC5, 0x00, 0xD9, 0xE4, 0x22, 0x33, 0x1F, 0x98, 0x7C}的类型?
    能不能给我发段代码?
      

  5.   

    CStrin.GetBuffer
    WideCharToMultiByte
      

  6.   

    没用过WideCharToMultiByte,能不能举个详细的例子?把
    CString str="23 1A 00 00 00 CC C4 14 00 0A 40 C5 00 D9 E4 22 33 1F 98 7C"; 
    转化为BYTE buffer[] = { 0x23, 0x1A, 0x00, 0x00, 0x00, 0xCC, 0xC4, 0x14, 0x00, 0x0A, 0x40, 0xC5, 0x00, 0xD9, 0xE4, 0x22, 0x33, 0x1F, 0x98, 0x7C}的类型
      

  7.   

    帮忙顶,,
    把CString 转成 BYTE数组是不是 根据CString字符串的特征,需要自己处理
    期望高手使用简单方法搞定。
      

  8.   

    用一个循环
    一个一个字节处理,  atoi ,  然后附加到BYTE数组后面
      

  9.   


    // 可打印字符串转换为字节数据
    // 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
    // pSrc: 源字符串指针
    // pDst: 目标数据指针
    // nSrcLength: 源字符串长度
    // 返回: 目标数据长度
    int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
    {
        char *ptr = strupr((char*)pSrc);
        for(int i=0; i<nSrcLength; i+=2)
        {
            // 输出高4位
            if(*ptr>='0' && *ptr<='9')
            {
                *pDst = (*ptr - '0') << 4;
            }
            else
            {
                *pDst = (*ptr - 'A' + 10) << 4;
            }        ptr++;        // 输出低4位
            if(*ptr>='0' && *ptr<='9')
            {
                *pDst |= *ptr - '0';
            }
            else
            {
                *pDst |= *ptr - 'A' + 10;
            }
            ptr++;
            pDst++;
        }    // 返回目标数据长度
        return nSrcLength / 2;
    }
      

  10.   

    不要用CString,建议用字节数组:原因如下:
    1、从内存使用上不科学,一个16进制字符串是由2个字节组成,浪费内存
      

  11.   

    23 91 E9 00
    感谢Conry 提供的代码.
    但是也有个问题,CString str="23 1A 00 00 00 CC C4 14 00 0A 40 C5 00 D9 E4 22 33 1F 98 7C"; 里面00 00 00之类的应该是不可见字符吧,用你的函数转换后得不到需要的数据,而后还有的就是把转换后的数据发送后,数据被截断在23 91 E9 00处了.
      

  12.   

    因为直接定义BYTE buffer[] = { 0x23, 0x1A, 0x00, 0x00, 0x00, 0xCC, 0xC4, 0x14, 0x00, 0x0A, 0x40, 0xC5, 0x00, 0xD9, 0xE4, 0x22, 0x33, 0x1F, 0x98, 0x7C};或
    char buffer[] = { 0x23, 0x1A, 0x00, 0x00, 0x00, 0xCC, 0xC4, 0x14, 0x00, 0x0A, 0x40, 0xC5, 0x00, 0xD9, 0xE4, 0x22, 0x33, 0x1F, 0x98, 0x7C};
     然后send(g_socket,(char *)buffer,sizeof(buffer),0)的话都是可以成功的,所以我想能不能再处理一下这里
    (CString str="23 1A 00 00 00 CC C4 14 00 0A 40 C5 00 D9 E4 22 33 1F 98 7C")的数据,使
    23->0x23
    1A->0x1A
    00->0x00
    .....
    即在每个字节前加上0x,然后保存在数组中发送?
    如果这样行的话,请问怎么样才能处理这种转换?
    char * StringToCharArray(CString str)
    {
    //这里应该怎么处理?希望高人提高个函数参考下,谢谢
    }
      

  13.   

    webxeyes很有自信呀,能不能指教下我?
      

  14.   

    (CString str="23 1A 00 00 00 CC C4 14 00 0A 40 C5 00 D9 E4 22 33 1F 98 7C")请问 saien ,这里是把23一起转换为10制还是把2和3分别转换为10进制再发?