请教一个进制转换问题 CString Strtemp; Strtemp.Format("%x", chz);我想以十六进制显示 输入A 显示 41 输入B 显示 40 应该怎样设置 Strtemp.Format("%x", chz);命令 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CString Temp::GetHex(char ch){ CString str; str.Format(_T("%x"),ch); return str;} char a="A";str.Format(_T("%x"),a);AfxMessageBox(str); 如果是UNICODE方式,TCHAR a=_T("A");str.Format(_T("%x"),a);AfxMessageBox(str);否则就为char a="A";str.Format("%x",a);AfxMessageBox(str); 用这个指令str.Format(_T("%x"),a);不行,我的指令是这样的: chz = *(char*)(rxdata+k); Strtemp.Format("%x", chz);我改成 chz = *(char*)(rxdata+k); Strtemp.Format(_T("%x"), chz); 还是不行,看看还有什么办法? #include "stdafx.h"#include <sstream>#include <iomanip> using namespace std;int _tmain(int argc, _TCHAR* argv[]){ char *msg = "汉字"; ostringstream s; for(char *p = msg; *p != 0; p++) { s << "0x" << hex << setw(2) << setfill('0') << (unsigned int)((unsigned char)*p) << " "; } printf("%s\n", s.str().c_str()); system("pause"); return 0;} void CChzDlg::OnCommMscomm() { // TODO: Add your control notification handler code here CChzDlg sen; int nEvent; CString m_RcvData; nEvent=m_ComChz.GetCommEvent(); switch(nEvent) { case 1: sen.Onsenbtn(); break; case 2: VARIANT variant_inp; COleSafeArray safearray_inp; long len, k; BYTE rxdata[2048]; CString strtemp; if(m_ComChz.GetCommEvent()==2) { variant_inp=m_ComChz.GetInput(); safearray_inp=variant_inp; len= safearray_inp.GetOneDimSize(); for(k=0;k<len;k++) safearray_inp.GetElement(&k,rxdata+k); for(k=0;k<len;k++) { BYTE bt=*(char*)(rxdata); strtemp.Format("%x",bt); m_receive+=strtemp; } m_receive+=" "; } UpdateData(FALSE); }}void CChzDlg::Onsenbtn() { // TODO: Add your control notification handler code here UpdateData(true); int i,Count; CString m_SendData; m_SendData=m_send; Count=m_SendData.GetLength(); CByteArray m_Array; m_Array.RemoveAll(); m_Array.SetSize(Count); for(i=0;i<Count;i++) m_Array.SetAt(i,m_SendData[i]); { m_ComChz.SetOutput(COleVariant(m_SendData)); }} 上面的可以发送和接收数据,但是每发送一个字符串只能接收到第一个字符,是什么原因? void CChzDlg::OnCommMscomm() { Sleep(200); ....} Sleep(200);这条指令是什么意思 char chz;CString strTemp;chz = 'A';strTemp.Format("%02X", chz); // 你在variant_inp=m_ComChz.GetInput();前挂起看看// 如果挂起后正常,那么需要在取数前将延时,或者将RThreshold 的值设的大一点。 Sleep(200);我用了这个还是不行, 主要是 例如发送ABC这个字符串, 接收只看到A,再发送ABC还是A,再发送ABC还是A 你在variant_inp=m_ComChz.GetInput();前挂起看看是不执行这一句吗? if(m_ComChz.GetCommEvent()==2) { k=m_ComChz.GetInBufferCount(); //接收到的字符数目 if(k>0) { vResponse=m_ComChz.GetInput(); //read safearray_inp=vResponse; len=safearray_inp.GetOneDimSize(); memcpy(rxdata, (unsigned char*) vResponse.parray->pvData, len); //拷贝出数据 rxdata[len] =0x00; ...... // } }试试这样用memcpy 同问19楼..---不用搞这么复杂吧.. 写个映射关系不就ok了?////////////////////////////////////////////////////////////// Purpose: 存储结构定义typdef std::map<CString, CString> CodeMap;/////////////////////////////////////////////////////////////////////////////////// FunctionName: InitCodeMap void InitCodeMap(CodeMap &vMap) { struct { TCHAR SrcCode[MAX_PATH]; TCHAR DesCode[MAX_PATH]; } nItem [] = { _T("A"), _T("0X20"), _T("B"), _T("OX21") }; vMap.Clear(); for ( long i = 0; i < sizeof(nItem) / sizeof(*nItem); i++ ) { vMap.insert(std::make_pair<CString, CString>(nItem[i].SrcCode, nItem[i].DesCode)); }}/////////////////////////////////////////////////////////////////////////////////// FunctionName: FindCodeMapCString FindCodeMap(const CodeMap &vMap, const CString &sCode) { CString sTmp; if ( vMap.size() == 0 ) return sTmp; CodeMap::iterator iRet = vMap.find(sCode); if ( iRet != vMap.end() ) return (*iRet).second; return vTmp;} rxdata[len] =0x00;这条是什么意思?, 是将rxdata送到编辑框的变量m_receivem_receive = rxdata; 结尾结束相当‘\0’m_receive="";m_receive+=(char *)rxdata;如果m_receive只有一个字符,并不是说你只接收到一个字符。如果你发的数据中有0x00,m_receive只显示0x00之前的数据。 if(m_ComChz.GetCommEvent()==2) { k=m_ComChz.GetInBufferCount(); //接收到的字符数目 if(k>0) { vResponse=m_ComChz.GetInput(); //read safearray_inp=vResponse; len=safearray_inp.GetOneDimSize(); memcpy(rxdata, (unsigned char*) vResponse.parray->pvData, len); //拷贝出数据 rxdata[len] =0x00; m_receive=""; m_receive+=(char *)rxdata; } }是这样的吗? 加上sleep(200)和updatedata(false)试试可以吗? if(m_ComChz.GetCommEvent()==2){k=m_ComChz.GetInBufferCount(); //接收到的字符数目 if(k>0) {vResponse=m_ComChz.GetInput(); //readsafearray_inp=vResponse;len=safearray_inp.GetOneDimSize(); memcpy(rxdata, (unsigned char*) vResponse.parray->pvData, len); //拷贝出数据 rxdata[len] =0x00;m_receive="";m_receive+=(char *)rxdata;}}还是只能接收一个字符,是不是正常的. 你可以设置一下断点,看看rxdata的数据 有没有高手用MFC做过多智能体系统仿真? 大家来看:关于VC生成可执行文件名称的控制问题。 有代码,我不知道该怎么写下去了,请各位大侠帮帮我,谢谢 请大家看看我的打印出现的错误,怎么修改呢,好久了,都解决不了,请大家帮忙了,先谢谢了!55555555555555 VC如何写一个HttpServer的服务器? 有谁会用oo4o,进来讨论一下。 vc6.0转到vc2010出错 高分求助,up者有分!!! 程序为什么总是自己关闭 对话框尺寸大小改变,背景图片有问题 如何使用com来实现一个webbrowser控件 如何编写自动断网程序
{
CString str;
str.Format(_T("%x"),ch);
return str;
}
str.Format(_T("%x"),a);
AfxMessageBox(str);
TCHAR a=_T("A");
str.Format(_T("%x"),a);
AfxMessageBox(str);
否则就为
char a="A";
str.Format("%x",a);
AfxMessageBox(str);
我的指令是这样的:
chz = *(char*)(rxdata+k);
Strtemp.Format("%x", chz);我改成
chz = *(char*)(rxdata+k);
Strtemp.Format(_T("%x"), chz);
还是不行,看看还有什么办法?
#include "stdafx.h"
#include <sstream>
#include <iomanip>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char *msg = "汉字";
ostringstream s; for(char *p = msg; *p != 0; p++)
{
s << "0x" << hex << setw(2) << setfill('0') << (unsigned int)((unsigned char)*p) << " ";
}
printf("%s\n", s.str().c_str());
system("pause");
return 0;
}
{
// TODO: Add your control notification handler code here
CChzDlg sen;
int nEvent;
CString m_RcvData;
nEvent=m_ComChz.GetCommEvent();
switch(nEvent)
{
case 1: sen.Onsenbtn();
break;
case 2:
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len, k;
BYTE rxdata[2048];
CString strtemp;
if(m_ComChz.GetCommEvent()==2)
{
variant_inp=m_ComChz.GetInput();
safearray_inp=variant_inp;
len= safearray_inp.GetOneDimSize();
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);
for(k=0;k<len;k++)
{
BYTE bt=*(char*)(rxdata);
strtemp.Format("%x",bt);
m_receive+=strtemp;
}
m_receive+=" ";
}
UpdateData(FALSE);
}
}void CChzDlg::Onsenbtn()
{
// TODO: Add your control notification handler code here
UpdateData(true);
int i,Count;
CString m_SendData;
m_SendData=m_send;
Count=m_SendData.GetLength();
CByteArray m_Array;
m_Array.RemoveAll();
m_Array.SetSize(Count);
for(i=0;i<Count;i++)
m_Array.SetAt(i,m_SendData[i]);
{
m_ComChz.SetOutput(COleVariant(m_SendData));
}
}
上面的可以发送和接收数据,但是每发送一个字符串只能接收到第一个字符,是什么原因?
void CChzDlg::OnCommMscomm()
{
Sleep(200);
....
}
char chz;
CString strTemp;
chz = 'A';
strTemp.Format("%02X", chz);
// 如果挂起后正常,那么需要在取数前将延时,或者将RThreshold 的值设的大一点。
我用了这个还是不行,
主要是 例如发送ABC这个字符串, 接收只看到A,再发送ABC还是A,再发送ABC还是A
if(m_ComChz.GetCommEvent()==2)
{
k=m_ComChz.GetInBufferCount(); //接收到的字符数目
if(k>0)
{
vResponse=m_ComChz.GetInput(); //read
safearray_inp=vResponse;
len=safearray_inp.GetOneDimSize();
memcpy(rxdata, (unsigned char*) vResponse.parray->pvData, len); //拷贝出数据
rxdata[len] =0x00;
...... //
}
}试试这样用memcpy
// Purpose: 存储结构定义
typdef std::map<CString, CString> CodeMap;/////////////////////////////////////////////////////////////////////////////////
// FunctionName: InitCodeMap
void InitCodeMap(CodeMap &vMap) {
struct {
TCHAR SrcCode[MAX_PATH];
TCHAR DesCode[MAX_PATH];
} nItem [] = {
_T("A"), _T("0X20"),
_T("B"), _T("OX21")
};
vMap.Clear();
for ( long i = 0; i < sizeof(nItem) / sizeof(*nItem); i++ ) {
vMap.insert(std::make_pair<CString, CString>(nItem[i].SrcCode, nItem[i].DesCode));
}
}/////////////////////////////////////////////////////////////////////////////////
// FunctionName: FindCodeMap
CString FindCodeMap(const CodeMap &vMap, const CString &sCode) {
CString sTmp;
if ( vMap.size() == 0 )
return sTmp;
CodeMap::iterator iRet = vMap.find(sCode);
if ( iRet != vMap.end() )
return (*iRet).second;
return vTmp;
}
m_receive = rxdata;
m_receive="";
m_receive+=(char *)rxdata;如果m_receive只有一个字符,并不是说你只接收到一个字符。如果你发的数据中有0x00,m_receive只显示0x00之前的数据。
{
k=m_ComChz.GetInBufferCount(); //接收到的字符数目
if(k>0)
{
vResponse=m_ComChz.GetInput(); //read
safearray_inp=vResponse;
len=safearray_inp.GetOneDimSize();
memcpy(rxdata, (unsigned char*) vResponse.parray->pvData, len); //拷贝出数据
rxdata[len] =0x00;
m_receive="";
m_receive+=(char *)rxdata;
}
}
是这样的吗?
{
k=m_ComChz.GetInBufferCount(); //接收到的字符数目 if(k>0)
{
vResponse=m_ComChz.GetInput(); //read
safearray_inp=vResponse;
len=safearray_inp.GetOneDimSize();
memcpy(rxdata, (unsigned char*) vResponse.parray->pvData, len); //拷贝出数据
rxdata[len] =0x00;
m_receive="";
m_receive+=(char *)rxdata;}}
还是只能接收一个字符,是不是正常的.