用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的每个字符又转换为十六进制了,但我本来的就是十六进制数据了,
请问怎么样才能解决.谢谢
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的每个字符又转换为十六进制了,但我本来的就是十六进制数据了,
请问怎么样才能解决.谢谢
又看见你了。你一定要把二进制不可读数据保存到CString的话呢,
需要将它转换成可读字符串以后存进去方式1: 使用Base64编码Binary后 保存
方式2: 直接格式化二进制啊,转换为文本 CString.Format( "0x%02X" ), 转换到字符串不过,你为啥子不直接传指针呢?
不能传指针了
另外还想请教下,怎么样才可以把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}的类型?
能不能给我发段代码?
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}的类型
把CString 转成 BYTE数组是不是 根据CString字符串的特征,需要自己处理
期望高手使用简单方法搞定。
一个一个字节处理, atoi , 然后附加到BYTE数组后面
// 可打印字符串转换为字节数据
// 如:"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;
}
1、从内存使用上不科学,一个16进制字符串是由2个字节组成,浪费内存
感谢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处了.
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)
{
//这里应该怎么处理?希望高人提高个函数参考下,谢谢
}