VC笔记 unicode、ascii、16进制bytedata 互转_vc asc to unicode-程序员宅基地

技术标签: C++  

1、如何创建unicode 项目

选择“Project->Setting”菜单 
(1)选 Win32 Unicode Debug :
切换到“c/C++ ” Tab页 从下拉列表框中选择 “Preprocessor” ,去掉_MBCS,添加UNICODE,_UNICODE(注意逗号隔开) ,如果是MFC程序,还要在

link中,Category选output,将Entry-Point Symbol设为wWinMainCRTStartup

 

2、unicode码格式存放的16进制数据显示成可见的字符

例子: 如何在电脑上显示出 0x6211 0x4eec ?

代码:
 //我们:  我们  0x6211 0x4eec

 TCHAR MyWchar[128];
 //WCHAR MyWchar[128];
 memset(MyWchar, 0, sizeof(MyWchar));

 MyWchar[0] = 0x6211;
 MyWchar[1] = 0x4eec;
 MyWchar[2] = 25105;
 MyWchar[3] = 20204;

 int a = ((6*16 + 2)*16 + 1)*16 + 1;
 MessageBox(MyWchar);

 

3、Ascii码格式存放的16进制数据显示成可见的字符

 同2,

具体代码:

// ab: 87,98

 char str[20] = {97,98,0};
 MessageBox(str);

 

转换函数:

/**
*把unicode形式的字节数据转成字符格式的字串

例如:"62114eec"-> "我们"
*/
TCHAR* UnicoidByteData2Char(char* pByteIn,int nLenInByte, TCHAR* pCharOut)
{
 if(nLenInByte <= 0 || pByteIn == NULL || pCharOut == NULL)
 {
  MessageBox(_T("UnicoidByteData2Char: 传入解析参数错误!"));
  return NULL;
 }


 char temp[5] = {0};
 int intValue = 0;
 TCHAR* pOut = pCharOut;

 for(int i=0; i<nLenInByte/2; i++)
 {
  memset(temp, 0, sizeof(temp));
  temp[0] = pByteIn[4*i];
  temp[1] = pByteIn[4*i + 1];
  temp[2] = pByteIn[4*i + 2];
  temp[3] = pByteIn[4*i + 3];

  intValue = 0;
  for(int j=0; j<4; j++)
  {
   if(temp[j]>='a' && temp[j] <='f')
   {
    intValue = intValue*16 + (temp[j] - 'a') + 10;
   }
   else if(temp[0]>='A' && temp[j] <='F')
   {
    intValue = intValue*16 + (temp[j] - 'A') + 10;
   }
   else if(temp[0]>='0' && temp[j] <='9')
   {
    intValue = intValue*16 + (temp[j] - '0');
   }
   else
   {
    MessageBox(_T("UnicoidByteData2Char:STK 数据有误"));
    return NULL;
   }
  }

   
  //swprintf(&pOut[i],_T("%d"), intValue);
  pOut[i] = intValue;
 }

 return pOut;
}

 

/**
*把ascii形式的字节数据转成字符格式的字串

例如:"61623031323334" -> "ab01234"
*/
char* AsciiByteData2Char(char* pByteIn,int nLenInByte, char* pCharOut)
{
 if(nLenInByte <= 0 || pByteIn == NULL || pCharOut == NULL)
 {
  MessageBox(_T("AsciiByteData2Char: 传入解析参数错误!"));
  return NULL;
 }


 char temp[3] = {0};
 int intValue = 0;
 char* pOut = pCharOut;

 for(int i=0; i<nLenInByte; i++)
 {
  memset(temp, 0, sizeof(temp));
  temp[0] = pByteIn[2*i];
  temp[1] = pByteIn[2*i + 1];

  //十位数
  if(temp[0]>='a' && temp[0] <='f')
  {
   intValue = 16*(temp[0] - 'a');
  }
  else if(temp[0]>='A' && temp[0] <='F')
  {
   intValue = 16*(temp[0] - 'A');
  }
  else if(temp[0]>='0' && temp[0] <='9')
  {
   intValue = 16*(temp[0] - '0');
  }
  else
  {
   MessageBox(_T("AsciiByteData2Char:STK 数据有误"));
   return NULL;
  }

  //个位数
  if(temp[1]>='a' && temp[1] <='f')
  {
   intValue += (temp[1] - 'a') + 10;
  }
  else if(temp[1]>='A' && temp[1] <='F')
  {
   intValue += (temp[1] - 'A') + 10;
  }
  else if(temp[1]>='0' && temp[1] <='9')
  {
   intValue += (temp[1] - '0');
  }
  else
  {
   MessageBox(_T("STK 数据有误"));
   return NULL;
  }

   
  sprintf(&pOut[i],"%c", intValue);
 }

 

 return pOut;
}

 

 

 /**
*把ascii形式的字串转换成unicode字串
*/
int Ascii2Unicode(char *pchIn, CString *pstrOut)
{
    int nLen;
    WCHAR *ptch;
 
    if(pchIn == NULL)
    {
        return 0;
    }
 
 //WideCharToMultiByte(); //unicode 2 ascii
 //MultiByteToWideChar(); //ascii 2 unicode
    
 nLen = MultiByteToWideChar(CP_ACP, 0, pchIn, -1, NULL, 0);
    ptch = new WCHAR[nLen];
    MultiByteToWideChar(CP_ACP, 0, pchIn, -1, ptch, nLen);
    pstrOut->Format(_T("%s"), ptch);
    
    delete [] ptch;
 
    return nLen;
}

 

 

 输入参数1 @buf ascii码字符串 
输入参数2 @len 字符串buf的长度 
返回对应的hex进制的值 
4、例如: 输入"23abcfe"字符串, 输出的hex值为: 0x23abcfe 
 

UINT ascii2hex(char *buf, int len)  
{  
    int i = 0;
 int j = 0;  
    unsigned int ret = 0;  
    char p[2] = {0};  
    int tmp = 1; 

    for(i = 0; i<len; i++)
 {  
        memcpy(p,&buf[i],1);     
        switch (p[0]){  
  case 'a':                 
   tmp = 1;  
   for(j=0;j<len-1-i;j++)  
    tmp *= 16;  
   ret += 10*tmp;  
   break;  
  case 'b':             
   tmp = 1;  
   for(j=0;j<len-1-i;j++)  
    tmp *= 16;  
   ret += 11*tmp;  
   break;  
  case 'c':                 
   tmp = 1;  
   for(j=0;j<len-1-i;j++)  
    tmp *= 16;  
   ret += 12*tmp;  
   break;  
  case 'd':                 
   tmp = 1;  
   for(j=0;j<len-1-i;j++)  
    tmp *= 16;  
   ret += 13*tmp;  
   break;  
  case 'e':                 
   tmp = 1;  
   for(j=0;j<len-1-i;j++)  
    tmp *= 16;  
   ret += 14*tmp;  
   break;  
  case 'f':                 
   tmp = 1;  
   for(j=0;j<len-1-i;j++)  
    tmp *= 16;  
   ret += 15*tmp;  
   break;  
  default:  
   tmp = 1;  
   for(j=0;j<len-1-i;j++)  
    tmp *= 16;  
   ret += atoi(p)*tmp;  
   break;  
        }  
    } 

    return ret;  
}  

 

/*
*
* 把ascii形式的字串转换成16进制数
* 例如:"ab01234" -> "61623031323334"
*/
char* CStkTreeDlg::AscToHex(char* pInData, char* pOutData)
{
 char* pIn = pInData;
 char* pOut = pOutData;
 
 int hexValue = 0;

 for(int i=0; i<strlen(pIn); i++)
 { 
  hexValue = pIn[i];

  sprintf(pOut + 2*i, "%0x", hexValue);
 }
    return pOut;
}

 

/*
*
* 把CString形式的字串转换成16进制数
5、* 例如:"我们0123"->"62114eec0030003100320033"
*/
char* CStkTreeDlg::CStringToHexByteStr(CString strIn, char* pOutHexStr)
{
 int len = strIn.GetLength();
 if((pOutHexStr == NULL) || (len <= 0))
 {
  return NULL;
 }

 uint16* text = NULL;
 text = (uint16 *)new uint16[len + 1];
 if(text == NULL)
 {
  return NULL;
 }

 char * pOut = pOutHexStr; 
 
 //取得内存内容
 uint16* ptext = strIn.GetBuffer(len);
 wcscpy(text, ptext);

 //转成16进制数
 int index = 0;
 for(int i=0; i<len; i++)
 {
  if(text[i] > 0xff)
  {
   sprintf(pOut+index, "%0x", text[i]);
   index += 4;
  }
  else
  {
   sprintf(pOut+index, "%s", "00");
   index += 2;

   sprintf(pOut+index, "%0x", text[i]);
   index += 2;
  }
  
 }

 delete [] text;

 return pOut;
}

 

 

/*
*
6* 把unicode形式的字串转换成ascii字串
*//Cstring 转 char
*/
char* CStkTreeDlg::CStringToChar(CString szItem, char* pOutChars)      

{
 int len = WideCharToMultiByte(CP_ACP,0,szItem,szItem.GetLength(),NULL,0,NULL,NULL);
 
 char * pOutStr = pOutChars; 
 if(pOutStr == NULL)
 {
  return NULL;
 }
 WideCharToMultiByte(CP_ACP,0,szItem,szItem.GetLength(),pOutStr,len,NULL,NULL);  
 pOutStr[len] = '\0';
 
 return pOutStr;
}

7* 把unicode形式的字串转换成ascii字串

************************************************************************/
/* 输入efbbbf字符串, 输出"efbbbf"       取得utf-8文件的前三个字符,用于比较文件类型
                                                                 */

/************************************************************************/
char* CStkTreeDlg::Adr2Char(char *pIn, char *pOut)
{
int value1 = *(pIn+0) & 0xff;
int value2 = *(pIn+1) & 0xff;
int value3 = *(pIn+2) & 0xff;
char ch1[3] = {0};
char ch2[3] = {0};
char ch3[3] = {0};

sprintf(ch1, "%X", value1);
sprintf(ch2, "%X", value2);
sprintf(ch3, "%X", value3);
sprintf(pOut,"%s%s%s", ch1, ch2, ch3);

return pOut;
}


8* 判断文件类型

/************************************************************************/
/* get file type : EF BB BF   UTF-8 1
FF FE     UNICODE 2
FE FF     UNICODE BIG EDIAN 3
ELSE      ASCII 0
*
/************************************************************************/
int CStkTreeDlg::GetFileType()
{
char fileBegin[4];
memset(fileBegin, 0, sizeof(fileBegin));
m_File.Read(fileBegin, 3);

char strType[7];
memset(strType, 0, sizeof(strType));
Adr2Char(fileBegin, strType);

if((memcmp(strType, "efbbbf", 6) == 0) || (memcmp(strType, "EFBBBF", 6) == 0)){
m_fileType = 1;  //utf-8
}else if((memcmp(strType, "fffe", 4) == 0) || (memcmp(strType, "FFFE", 4) == 0)){
m_fileType = 2;  //UNICODE
}else if((memcmp(strType, "feff", 4) == 0) || (memcmp(strType, "FEFF", 4) == 0)){
m_fileType = 3;  //UNICODE BIG EDIAN
}else{
m_fileType = 0;  //ASCII
}

return m_fileType;
}


 // 根据语言取得配置文件中的字符串

CString LoadMutiLanString(CString szID)
{
 CString szValue;
 DWORD dwSize = 1000;
 TCHAR szStylesPath[_MAX_PATH];
 CString strStylesPath;
 
 VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, szStylesPath, _MAX_PATH));  
 strStylesPath = szStylesPath;
 int nIndex  = strStylesPath.ReverseFind(_T('\\'));
 if (nIndex > 0)
 {
  strStylesPath = strStylesPath.Left(nIndex);
 }
 else 
 {
  strStylesPath.Empty();
 }
 strStylesPath += _T("\\Lang\\");

 switch (theApp.m_sSettingOnPc.sSystem.nLang)
 {
 case LANG_TYPE_ENG_USA:
  {
   GetPrivateProfileString(_T("String"),szID,_T("Not found"),
   szValue.GetBuffer(dwSize),dwSize, strStylesPath + _T("English.ini"));
  }
  break; 

 case LANG_TYPE_CH_SIMP:
  {
   GetPrivateProfileString(_T("String"),szID,_T("Not found"),
   szValue.GetBuffer(dwSize),dwSize,strStylesPath + _T("SimpleChinese.ini"));
  }
  break;

 default:
  break;
 }
 
  szValue.ReleaseBuffer();
  szValue.Replace(_T("\\n"),_T("\n")); 

 return szValue;
}





WideCharToMultiByte和MultiByteToWideChar函数的用法 

转自:http://www.cnblogs.com/gakusei/articles/1585211.html

为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。
WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。
MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。
常用的代码页由CP_ACP和CP_UTF8两个。
使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。
下面是代码实现:
1.  ANSI to Unicode
wstring ANSIToUnicode( const string& str )
{
 int  len = 0;
 len = str.length();
 int  unicodeLen = ::MultiByteToWideChar( CP_ACP,
            0,
            str.c_str(),
            -1,
            NULL,
            0 );  
 wchar_t *  pUnicode;  
 pUnicode = new  wchar_t[unicodeLen+1];  
 memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));  
 ::MultiByteToWideChar( CP_ACP,
         0,
         str.c_str(),
         -1,
         (LPWSTR)pUnicode,
         unicodeLen );  
 wstring  rt;  
 rt = ( wchar_t* )pUnicode;
 delete  pUnicode; 
 
 return  rt;  
}
2.  Unicode to ANSI
string UnicodeToANSI( const wstring& str )
{
 char*     pElementText;
 int    iTextLen;
 // wide char to multi char
 iTextLen = WideCharToMultiByte( CP_ACP,
         0,
         str.c_str(),
         -1,
         NULL,
         0,
NULL,
         NULL );
 pElementText = new char[iTextLen + 1];
 memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
 ::WideCharToMultiByte( CP_ACP,
         0,
         str.c_str(),
         -1,
         pElementText,
         iTextLen,
         NULL,
         NULL );
 string strText;
 strText = pElementText;
 delete[] pElementText;
 return strText;
}
3.  UTF-8 to Unicode
wstring UTF8ToUnicode( const string& str )
{
 int  len = 0;
 len = str.length();
 int  unicodeLen = ::MultiByteToWideChar( CP_UTF8,
            0,
            str.c_str(),
            -1,
            NULL,
            0 );  
 wchar_t *  pUnicode;  
 pUnicode = new  wchar_t[unicodeLen+1];  
 memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));  
 ::MultiByteToWideChar( CP_UTF8,
         0,
         str.c_str(),
         -1,
         (LPWSTR)pUnicode,
         unicodeLen );  
 wstring  rt;  
 rt = ( wchar_t* )pUnicode;
 delete  pUnicode; 
 
 return  rt;  
}
4.  Unicode to UTF-8    
string UnicodeToUTF8( const wstring& str )
{
 char*     pElementText;
 int    iTextLen;
 // wide char to multi char
 iTextLen = WideCharToMultiByte( CP_UTF8,
         0,
         str.c_str(),
         -1,
         NULL,
         0,
         NULL,
         NULL );
 pElementText = new char[iTextLen + 1];
 memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
 ::WideCharToMultiByte( CP_UTF8,
         0,
         str.c_str(),
         -1,
         pElementText,
         iTextLen,
         NULL,
         NULL );
 string strText;
 strText = pElementText;
 delete[] pElementText;
 return strText;
}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jimbo_lee/article/details/10404295

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf