MFC 将文本框内容转为十六进制的字符串

作者&投稿:月浅 (若有异议请与网页底部的电邮联系)
MFC 十六进制以字符串形式直接输出~

#假设收到的数据数组 byte dat[100]; 数据长度 int num
CString str, tem;
for(int i= 0; i < num; i++)
{
tem.Format("%02x ", dat[i]);
str+= tem;
}
把str显示到 Edit就行

读取输入框内容,保存到buf中
然后写个函数调用处理,把都到的内容转化成十六进制

你看看这个是不是你要的:

发送十六进制字符
在主对话框中加入一个复选接钮,ID为IDC_CHECK_HEXSEND Caption: 十六进制发送,再利用ClassWizard为其添加控制变量:m_ctrlHexSend;
在ClassView中为SCommTestDlg类添加以下两个PUBLIC成员函数,并输入相应代码;

//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔
//如:A1 23 45 0B 00 29
//CByteArray是一个动态字节数组,可参看MSDN帮助
int CSCommTestDlg::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2);
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}

//这是一个将字符转换为相应的十六进制值的函数
//好多C语言书上都可以找到
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CSCommTestDlg::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}

再将CSCommTestDlg::OnButtonManualsend()修改成以下形式:
void CSCommTestDlg::OnButtonManualsend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //读取编辑框内容
if(m_ctrlHexSend.GetCheck())
{
CByteArray hexdata;
int len=String2Hex(m_strTXData,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据
}
else
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据

}
现在,你先将串口线接好并打开串口调试助手V2.1,选上以十六制显示,设置好相应串口,然后运行我们这个程序,在发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在串口调试助手的接收框中应该可以看到00 01 02 03 A1 CC了。

9.在接收框中以十六进制显示
这就容易多了: 在主对话框中加入一个复选接钮,IDC_CHECK_HEXDISPLAY Caption: 十六进制显示,再利用ClassWizard为其添加控制变量:m_ctrlHexDiaplay。 然后修改CSCommTestDlg::OnComm()函数:
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
if(m_ctrlHexDisplay.GetCheck())
strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
else
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放

m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
}
测试:在串口调试助手发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在本程序运行后选上以十六进制显示,在串口调试助手中单击手动发送或自动发送,则在本程序的接收框中应该可以看到00 01 02 03 A1 CC了。
留个邮箱我把原文给你

你看看这个是不是你要的:
发送十六进制字符
在主对话框中加入一个复选接钮,ID为IDC_CHECK_HEXSEND
Caption:
十六进制发送,再利用ClassWizard为其添加控制变量:m_ctrlHexSend;
在ClassView中为SCommTestDlg类添加以下两个PUBLIC成员函数,并输入相应代码;
//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔
//如:A1
23
45
0B
00
29
//CByteArray是一个动态字节数组,可参看MSDN帮助
int
CSCommTestDlg::String2Hex(CString
str,
CByteArray
&senddata)
{
int
hexdata,lowhexdata;
int
hexdatalen=0;
int
len=str.GetLength();
senddata.SetSize(len/2);
for(int
i=0;i<len;)
{
char
lstr,hstr=str[i];
if(hstr=='
')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return
hexdatalen;
}
//这是一个将字符转换为相应的十六进制值的函数
//好多C语言书上都可以找到
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char
CSCommTestDlg::ConvertHexChar(char
ch)
{
if((ch>='0')&&(ch<='9'))
return
ch-0x30;
else
if((ch>='A')&&(ch<='F'))
return
ch-'A'+10;
else
if((ch>='a')&&(ch<='f'))
return
ch-'a'+10;
else
return
(-1);
}
再将CSCommTestDlg::OnButtonManualsend()修改成以下形式:
void
CSCommTestDlg::OnButtonManualsend()
{
//
TODO:
Add
your
control
notification
handler
code
here
UpdateData(TRUE);
//读取编辑框内容
if(m_ctrlHexSend.GetCheck())
{
CByteArray
hexdata;
int
len=String2Hex(m_strTXData,hexdata);
//此处返回的len可以用于计算发送了多少个十六进制数
m_ctrlComm.SetOutput(COleVariant(hexdata));
//发送十六进制数据
}
else
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据
}
现在,你先将串口线接好并打开串口调试助手V2.1,选上以十六制显示,设置好相应串口,然后运行我们这个程序,在发送框中输入00
01
02
03
A1
CC等十六进制字符,并选上以十六进制发送,单击手动发送,在串口调试助手的接收框中应该可以看到00
01
02
03
A1
CC了。
9.在接收框中以十六进制显示
这就容易多了:
在主对话框中加入一个复选接钮,IDC_CHECK_HEXDISPLAY
Caption:
十六进制显示,再利用ClassWizard为其添加控制变量:m_ctrlHexDiaplay。
然后修改CSCommTestDlg::OnComm()函数:
void
CSCommTestDlg::OnComm()
{
//
TODO:
Add
your
control
notification
handler
code
here
VARIANT
variant_inp;
COleSafeArray
safearray_inp;
LONG
len,k;
BYTE
rxdata[2048];
//设置BYTE数组
An
8-bit
integerthat
is
not
signed.
CString
strtemp;
if(m_ctrlComm.GetCommEvent()==2)
//事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput();
//读缓冲区
safearray_inp=variant_inp;
//VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize();
//得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++)
//将数组转换为Cstring型变量
{
BYTE
bt=*(char*)(rxdata+k);
//字符型
if(m_ctrlHexDisplay.GetCheck())
strtemp.Format("%02X
",bt);
//将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
else
strtemp.Format("%c",bt);
//将字符送入临时变量strtemp存放
m_strRXData+=strtemp;
//加入接收编辑框对应字符串
}
}
UpdateData(FALSE);
//更新编辑框内容
}
测试:在串口调试助手发送框中输入00
01
02
03
A1
CC等十六进制字符,并选上以十六进制发送,单击手动发送,在本程序运行后选上以十六进制显示,在串口调试助手中单击手动发送或自动发送,则在本程序的接收框中应该可以看到00
01
02
03
A1
CC了。
留个邮箱我把原文给你

//CString 转十六进制 返回值 0正常返回 1长度超限 2输入错误 3没有数据
char cstrToHex(CString info , unsigned char pbuff[],DWORD &outlength)
{
info.Trim();
int length = info.GetLength();
if (length == 0)
return 3;
unsigned char high = 0xff, low = 0xff, ch = 0xff;
int j = 0, i = 0;
while (i < length)
{
if (j == 65)
return 1;
ch = info[i];
if (ch == 0x20)
{
i++;
continue;
}
else if (ch >= 0x30 && ch <= 0x39)
ch -= 0x30;
else if (ch >= 0x41 && ch <= 0x46)
ch -= 0x37;
else if (ch >= 0x61 && ch <= 0x66)
ch -= 0x57;
else
return 2;
high = ch;
if (i == length - 1)
{
pbuff[j] = high;
j++;
break;
}
else
{
i++;
ch = info[i];
if (ch == 0x20)
{
pbuff[j] = high;
j++;
i++;
continue;
}
else if (ch >= 0x30 && ch <= 0x39)
ch -= 0x30;
else if (ch >= 0x41 && ch <= 0x46)
ch -= 0x37;
else if (ch >= 0x61 && ch <= 0x66)
ch -= 0x57;
else
return 2;
low = ch;
}
pbuff[j] = high * 16 + low;
i++;
j++;
}
outlength = j;
return 0;
}

csdn上有串口空间MScomm的例程,关于串口发送的MFC可以下载看下


船营区13064148182: MFC 如何将文本文件的内容以16进制显示 -
独孤有樟脑: BYTE buf[100]={0}; FILE *pFile=fopen("a.txt","rb"); if(pFile) {fread(buf,1,100,pFile);CString Str;for(int i=0;i<100;++i) {Str.Format(TEXT("%02X"),buf[i]);//得到对应16进制表示.OutputDebugString(Str); } fclose(pFile); }

船营区13064148182: vc用MFC编辑一个输入窗口,类型为cstring,如何将此字符串转换为16进制数,例如输入80, -
独孤有樟脑: 第一:你可以设置编辑框属性,使其仅仅可以输入数字,然后使用int关联控件后,该int值会保存你输入的数字;第二:如果获取的是字符串,可以使用atoi函数,转换成数字;得到int型数字后,怎么转换成十六进制就与其他系统一样的了

船营区13064148182: 如何用VC的MFC制作一个进制转换的程序? -
独孤有樟脑: 先读取编辑框内容,里面的每一个字符按一个十六进制数对应的字符,然后把他转会为整形数,定义byte类型数据,把第一个整形数据赋值给byte类型数据,然后byte类型数据左移4位.再定义一byte类型数据,把第二个字符转换得到的整形数据赋值给他,然后把第一个byte类型数据和第2个byte类型数据进行或操作就得到你想要的结果.

船营区13064148182: 在MFC中怎样将整数转化为16进制的数并写入到文件中去 -
独孤有樟脑: 写入一般文件(专做储存用)无需保存为16进制格式,直接将整数写入即可,这样是最节省空间的,如果要显示为字符串的话,可以先格式化字符串(用_stprintf_s()函数, 格式化格式为'%x'),然后将字符串写入到文本文件中去.

船营区13064148182: 用MFC写一个程序.现在需要把一个编辑框的值跟另外一个值比较,需要把Csring型识别为十六进制,该怎么写? -
独孤有樟脑: 你两个地方输出的值都CString类型的.不必要使用数字比较的形式比较.直接字符方式比较即可.比如串口返回的是"AB";你要对比的值也可以输入16进制的AB,即可比较 CString可以直接对比,方式如下 CString s;//s是从输入的编辑框 ...

船营区13064148182: MFC cstring内容转换成16进制数 -
独孤有樟脑: CString str = "1A"; char *pBuff=str.GetBuffer(10); int Num = 0; sscanf(pBuff,"%X",&Num);

船营区13064148182: MFC 如何把字符串比如“78E32F79”转换成十六进制的数据78E32F79 -
独孤有樟脑: int String2Hex(CString str, CByteArray &senddata) { int hexdata,lowhexdata; int hexdatalen=0; int len=str.GetLength(); senddata.SetSize(len/2); for(int i=0;i { char lstr,hstr=str[i]; if(hstr==' ') { i++; continue; } i++; if(i>=len) break; lstr=str[i]; hexdata=...

船营区13064148182: MFC程序在示例编辑框上显示十六进制 -
独孤有樟脑: 你的方法正确的,三个错误的都是一个错误造成的.strTemp写成了strtemp,就在红色波浪线的位置

船营区13064148182: MFC字符串转双字节十六进制 -
独孤有樟脑: 这个其实用你用的函数String2Hex函数就可以实现,转换完了以后你只需要将两个单字节(8位)的数解释成一个双字节(16位)的数即可. 比如用unsigned short类型,比如你的转换以后的单字节数存在数组unsigned char pBuf1[10]中, 定义unsigned short pBuf2[5],类似使用pBuf2[0] = unsigned short((unsigned short*)pBuf1)转换一下,这时候pBuf2[0]就是双字节的十六进制

船营区13064148182: MFC 如何将 BYTE类型的二进制数据转换成BYTE型的十六进制数据 -
独孤有樟脑: BYTE Hex1 = (Bin1

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网