说明:这是在VS2010下写的程序,其中有一个CStringW的数据类型,在VC6下是无法识别的,但是在VS2010下可以用,至于在VS2008和VS2005中能否运用我没有测试过。以下就是相关的代码段了。程序都是加了注释的,而且写得也比较直白。生成的Release版本的软件我已经在优快云上传了。欢迎大家留意,相互交流!
HRESULT CCode_TransformDlg::OnButtonOK(IHTMLElement* /*pElement*/)
{
CStringW str;
GetDlgItemTextW(IDC_EDIT_ORIGINAL,str);
if(((CButton*)GetDlgItem(IDC_RADIO_TU))->GetCheck())//文字向UNICODE转换
SetDlgItemTextW(IDC_EDIT_HEX,ShowHex(str));//在EDIT BOX显示UNICODE
else//UNICODE向文字转换
SetDlgItemTextW(IDC_EDIT_HEX,TranslateUnicode(str));//显示对应的文字
//OnOK();
return S_OK;
}
//===========================================================================
//*****************将信息转换为16进制表示的UNICODE****************************
CString CCode_TransformDlg::ShowHex(CStringW msg)
{
CString unicodestring;
for(size_t i=0;i<msg.GetLength();++i)
unicodestring+=(Transform(msg.GetAt(i))+L" ");
return unicodestring;
}
//===========================================================================
//**************将一个宽字符转换为相应的UNICODE******************************
CString CCode_TransformDlg::Transform(WCHAR wch)
{
CString temp;
//分别获取一个宽字符的高8位和第8位的UNICODE
temp=GetHexStr(((wch>>8)&0xff))+GetHexStr(wch&0xff);
return temp;
}
//===========================================================================
//****************将一个字节的数据转换为2位十六进制的串**********************
CString CCode_TransformDlg::GetHexStr(BYTE data)
{
CString temp;
//将一个字节的高4位和底4位分别转换为对应的16进制字符串
temp=GetHexChar(data/16)+GetHexChar(data%16);
return temp;
}
//==========================================================================
//***************将0-15的十进制数字转为一个16进制的字符*********************
CString CCode_TransformDlg::GetHexChar(unsigned int data)
{
CString str;
switch(data)
{
case 0:str=L"0";
break;
case 1:str=L"1";
break;
case 2:str=L"2";
break;
case 3:str=L"3";
break;
case 4:str=L"4";
break;
case 5:str=L"5";
break;
case 6:str=L"6";
break;
case 7:str=L"7";
break;
case 8:str=L"8";
break;
case 9:str=L"9";
break;
case 10:str=L"A";
break;
case 11:str=L"B";
break;
case 12:str=L"C";
break;
case 13:str=L"D";
break;
case 14:str=L"E";
break;
case 15:str=L"F";
break;
default:break;
}
return str;
}
//============================================================================
//********************将一串UNICODE转换为文字**********************************
CString CCode_TransformDlg::TranslateUnicode(CStringW unicodestr)
{
CString text;
unicodestring=unicodestr;//unicodestring用于保存包含了'0'和'X'进制串
unicodestring.Replace(L" ",NULL);//去除字符串里的所有空格
if(unicodestring.GetLength()%4)
{
AfxMessageBox(TEXT("4 characters constitute a hex-string without /"0x/" or /"0X/""));
return L"";
}
bool flag=true;
for(size_t index=0;index<unicodestring.GetLength()&&flag;index+=4)
{
WCHAR wch=0;
for(int i=0;i<4&&flag;++i)
{
if(CheckUnicode(unicodestring.GetAt(index+i)))
wch+=ChangeHexToTen(unicodestring.GetAt(index+i))*(short)(pow(16.0,3-i));
else
{
CString str;
str.Format(TEXT("UNICODE ERROR AT INDEX:%d"),index+i+1);
flag=false;
AfxMessageBox(str);
}
}
text+=wch;
}
return text;
}
//===========================================================================
//************检测输入的UNICODE是否正确(只能出现16进制的数)****************
bool CCode_TransformDlg::CheckUnicode(WCHAR wch)
{
if(((wch>=L'0')&&(wch<=L'9'))||((wch>=L'A')&&(wch<=L'F'))||((wch>=L'a')&&(wch<=L'f')))
return true;
return false;
}
//===============================================================================
//**************将每一个十六进制的字符转化为一个十进制数************************
short CCode_TransformDlg::ChangeHexToTen(WCHAR wch)
{
switch(wch)
{
case L'0':case L'1':case L'2':case L'3':case L'4':case L'5':case L'6':case L'7':case L'8':case L'9':
return (wch-L'0');
break;
case L'A':case L'B':case L'C':case L'D':case L'E':case L'F':
return (wch-L'A'+10);
break;
case L'a':case L'b':case L'c':case L'd':case L'e':case L'f':
return (wch-L'a'+10);
break;
default:
return 0;
break;
}
}
BOOL CCode_TransformDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
//截获回车消息并进行处理
if(pMsg->wParam==VK_RETURN)
{
CStringW str;
GetDlgItemTextW(IDC_EDIT_ORIGINAL,str);
if(((CButton*)GetDlgItem(IDC_RADIO_TU))->GetCheck())
SetDlgItemTextW(IDC_EDIT_HEX,ShowHex(str));
else SetDlgItemTextW(IDC_EDIT_HEX,TranslateUnicode(str));
}
return CDHtmlDialog::PreTranslateMessage(pMsg);
}