中英文与UNICODE十六进制字符串的互转

  文章出处:http://blog.csdn.net/brantyou/article/details/7306029

之前搞过这个中英文与UNICODE十六进制字符串的互转,但是发现有点小问题。现在重新搞了一个,测试中暂时没有发现什么问题。先记录下来。

我尝试使用过MultiByteToWideChar和WideCharToMultiByte来实现这个功能,但是发现不行。也就是无法实现如:

中文English  --> 4e2d65870045006e0067006c006900730068

4e2d65870045006e0067006c006900730068 --> 中文English

这么一个转换,上述的都是字符串。

好看下面的源码:YCodec是自己写的一个类

YCodec.h文件源码:

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class YCodec  
  5. {  
  6. public:  
  7.     YCodec();  
  8.     ~YCodec();  
  9.     // char to hex code  
  10.     int Char2Hex(char ch);  
  11.     // hex to char  
  12.     char Hex2Char(unsigned int n);  
  13.     // num^<span style="background-color: rgb(255, 255, 255); ">index</span>  
  14.     long MIndex(int num, int index);  
  15.     // string to hex code  
  16.     long String2Hex(char* string, int strlen);  
  17.     // hex to char*  
  18.     int Hex2String(long hex, char* string, int* slen);  
  19.     // hex to wchar_t code  
  20.     wchar_t Hex2Wchart(long hex);  
  21.     // UNICODE十六进制字符串转成中英文  
  22.     // hex string to wchar_t*  
  23.     int HexStr2WChars(char* hexstr, int hexstrlen, int eachchar, wchar_t* wchs, int* wchslen);  
  24.     // wchar_t to hex code  
  25.     long Wchart2Hex(wchar_t wch);  
  26.     // 中英文转成UNICODE十六进制字符串  
  27.     // wchar_t* to char*(hex string)  
  28.     int Wchart2HexStr(wchar_t* wchs, int wchslen, int eachchar, char* hexstr, int* hexstrlen);  
  29.   
  30. };  


YCodec.cpp文件源码:

[cpp]  view plain copy
  1. #include "StdAfx.h"  
  2. #include "YCodec.h"  
  3. #include <stdio.h>  
  4. #include <stdlib.h>  
  5. #include <string.h>  
  6.   
  7. YCodec::YCodec()  
  8. {  
  9. }  
  10.   
  11. YCodec::~YCodec()  
  12. {  
  13. }  
  14.   
  15.   
  16. // char to hex code  
  17. // error: return -1   
  18. int YCodec::Char2Hex(char ch)  
  19. {  
  20.     int n = -1;  
  21.     switch(ch)  
  22.     {  
  23.     case '0':   n = 0;  break;  
  24.     case '1':   n = 1;  break;  
  25.     case '2':   n = 2;  break;  
  26.     case '3':   n = 3;  break;  
  27.     case '4':   n = 4;  break;  
  28.     case '5':   n = 5;  break;  
  29.     case '6':   n = 6;  break;  
  30.     case '7':   n = 7;  break;  
  31.     case '8':   n = 8;  break;  
  32.     case '9':   n = 9;  break;  
  33.     case 'A':  
  34.     case 'a':   n = 10; break;  
  35.     case 'B':  
  36.     case 'b':   n = 11; break;  
  37.     case 'C':  
  38.     case 'c':   n = 12; break;  
  39.     case 'D':  
  40.     case 'd':   n = 13; break;  
  41.     case 'E':  
  42.     case 'e':   n = 14; break;  
  43.     case 'F':  
  44.     case 'f':   n = 15; break;  
  45.     default:    break;  
  46.     }  
  47.   
  48.     return n;  
  49. }  
  50.   
  51. // hex to char  
  52. // error: return -1   
  53. char YCodec::Hex2Char(unsigned int n)  
  54. {  
  55.     char ch;  
  56.     if(n>=0 && n<=9)  ch = 48 + n;  
  57.     else if(n>=10 && n<=15)   ch = 65 - 10 + n;  
  58.     else ch = -1;  
  59.   
  60.     return ch;  
  61. }  
  62.   
  63. // num^<span style="background-color: rgb(255, 255, 255); ">index</span>  
  64. long YCodec::MIndex(int num, int index)  
  65. {  
  66.     long s = 1;  
  67.     int i=0;  
  68.     while(i<index)  
  69.     {  
  70.         s *= num;  
  71.         i++;  
  72.     }  
  73.   
  74.     return s;  
  75. }  
  76.   
  77. // string to hex code  
  78. // error: return -1   
  79. long YCodec::String2Hex(char* string, int strlen)  
  80. {  
  81.     long hex=-1;  
  82.     int i=0, n=0;  
  83.     char *p = string;  
  84.     p += strlen - 1;  
  85.     if(string == NULL)  return hex;  
  86.     if(strlen <= 0 || strlen > 10)    return hex;  
  87.   
  88.     hex = 0;  
  89.     do  
  90.     {  
  91.         n = Char2Hex(*p--);  
  92.         hex += n*MIndex(16, i++);  
  93.     }while(i<strlen);  
  94.   
  95.     return hex;  
  96. }  
  97.   
  98. // hex to char*  
  99. // string==NULL,slen = the size of string(slen as output)  
  100. // string!=NULL,input the length of string  
  101. // error: return -1  
  102. int YCodec::Hex2String(long hex, char* string, int* slen)  
  103. {  
  104.     char tmp[11] = {0};  
  105.     if(hex < 0)  return -1;  
  106.     if(string == NULL){// count the length it will be used  
  107.         sprintf(tmp, "%x", hex);  
  108.         *slen = strlen(tmp);  
  109.         return 1;  
  110.     }  
  111.     memset(string, 0, *slen);  
  112.     sprintf(string, "%x", hex);  
  113.   
  114.     return 1;  
  115. }  
  116.   
  117. // hex to wchar_t code  
  118. // eg: input 0x5e74, return 年  
  119. // error: return -1  
  120. wchar_t YCodec::Hex2Wchart(long hex)  
  121. {  
  122.     wchar_t wch = -1;  
  123.     if(hex <0)   return wch;  
  124.     wch = (wchar_t)hex;  
  125.   
  126.     return wch;  
  127. }  
  128.   
  129. // hex string to wchar_t*  
  130. // UNICODE十六进制字符串转成中英文  
  131. // hexstr每eachchar转换为一个wchar_t  
  132. // wchs == NULL, wchsLen as output(the size of wchs will be used)  
  133. // error: return -1  
  134. int YCodec::HexStr2WChars(char *hexstr, int hexstrlen, int eachchar, wchar_t *wchs, int *wchsLen)  
  135. {  
  136.     if(hexstr == NULL || hexstrlen <= 0 || eachchar <= 0) return -1;  
  137.     if(wchs == NULL){// count the size wchs it will be used  
  138.         *wchsLen = hexstrlen/eachchar + (hexstrlen%eachchar>0 ? 1 : 0);  
  139.         return 1;  
  140.     }  
  141.     memset(wchs, 0, *wchsLen * sizeof(wchar_t));  
  142.     char* tmp = new char[eachchar+1];  
  143.     char* p = hexstr;  
  144.     wchar_t* pwch = wchs;  
  145.     for(int i=0; i<hexstrlen; i+=eachchar){  
  146.         memset(tmp, 0, eachchar+1);  
  147.         // get eachchar char  
  148.         for(int j=0; j<eachchar; j++){  
  149.             if(i+j > hexstrlen)  break;  
  150.             tmp[j] = *p++;  
  151.         }  
  152.         // char* to hex  
  153.         long hex = String2Hex(tmp, strlen(tmp));  
  154.         if(hex == -1)   continue;  
  155.         // hex to wchar_t  
  156.         *pwch++ = Hex2Wchart(hex);  
  157.     }  
  158.   
  159.     if(tmp) delete []tmp;  
  160.   
  161.     return 1;  
  162. }  
  163.   
  164. // wchar_t to hex code  
  165. long YCodec::Wchart2Hex(wchar_t wch)  
  166. {  
  167.     return (long)wch;  
  168. }  
  169.   
  170. // wchar_t* to char*(hex string)  
  171. // 中英文转成UNICODE十六进制字符串  
  172. // eachchar用于控制每个wchar_t转换成多少个char字符  
  173. // hexstr == NULL,hexstrlen as output(the size of hexstr will be used)  
  174. // error: return -1  
  175. int YCodec::Wchart2HexStr(wchar_t *wchs, int wchslen, int eachchar, char* hexstr, int* hexstrlen)  
  176. {  
  177.     if(wchs == NULL || wchslen <= 0 || eachchar <= 0) return -1;  
  178.     if(hexstr == NULL){// count the size of hexstr will be used  
  179.         *hexstrlen = wchslen*eachchar;  
  180.         return 1;  
  181.     }  
  182.     memset(hexstr, 0, *hexstrlen);  
  183.     char* p = hexstr;  
  184.     wchar_t* pwch = wchs;  
  185.     char* tmp = new char[eachchar+1];  
  186.     for(int i=0; i<wchslen; i++){  
  187.         // wchar_t to hex  
  188.         long hex = Wchart2Hex(*pwch++);  
  189.         // hex to char*  
  190.         int charlen = 0;  
  191.         if(Hex2String(hex, NULL, &charlen) != -1){  
  192.             char* str = new char[charlen+1];  
  193.             memset(str, 0, charlen+1);  
  194.             int n = Hex2String(hex, str, &charlen);  
  195.             if(n != -1){  
  196.                 int k=0;  
  197.                 memset(tmp, 0, eachchar+1);  
  198.                 for(k=0; k<eachchar-charlen; k++)    tmp[k] = '0';  
  199.                 tmp = strcat(tmp, str);  
  200.                 p = strcat(p, tmp);  
  201.             }  
  202.             if(str) delete []str;  
  203.         }  
  204.         if(i > *hexstrlen)   break;  
  205.     }  
  206.     if(tmp) delete []tmp;  
  207.   
  208.     return 1;  
  209. }  

中英文转unicode十六进制字符串实例:

[cpp]  view plain copy
  1. CString input;  
  2. m_Input.GetWindowTextW(input);  
  3. CString tmp;  
  4. YCodec yCodec;  
  5.   
  6. // CString to wchar_t*  
  7. int len = input.GetLength();  
  8. wchar_t* wchs = new wchar_t[len+1];  
  9. memset(wchs, 0, sizeof(wchar_t)*(len+1));  
  10. wcscpy(wchs, input.GetBuffer(len) );  
  11. // wchar_t* to hex string  
  12. int hexlen = 0;  
  13. if(yCodec.Wchart2HexStr(wchs, len, 4, NULL, &hexlen) != -1){  
  14.     char* hexstr = new char[hexlen+1];  
  15.     memset(hexstr, 0, hexlen+1);  
  16.     int n = yCodec.Wchart2HexStr(wchs, len, 4, hexstr, &hexlen);  
  17.     if(n != -1){  
  18.         // char* to CString  
  19.         char* p = hexstr;  
  20.         for(int i=0; i<hexlen; i++)  tmp.AppendChar(*p++);  
  21.     }  
  22.     if(hexstr)  delete []hexstr;  
  23. }  
  24.   
  25. if(wchs)    delete []wchs;  
  26.   
  27. m_Disp.SetWindowTextW(tmp);  

该功能时在MFC程序中测试的。可以做到如下效果:

输入字符串“中文English“ 转换后输出 ”4e2d65870045006e0067006c006900730068“字符串,每个中文或英文转成4个char类型数据。


unicode十六进制字符串转中英文实例:

[cpp]  view plain copy
  1. <span style="white-space:pre">  </span>CString input;  
  2.     m_Input.GetWindowTextW(input);  
  3.   
  4.     CString tmp;  
  5.   
  6.     YCodec yCodec;  
  7.   
  8.     // CString to char*  
  9.     int strlen = input.GetLength();  
  10.     char* str = new char[strlen+1];  
  11.     memset(str, 0, strlen+1);  
  12.     for(int i=0; i<strlen; i++)  str[i] = input.GetAt(i);  
  13.     // hex string to wchar_t*  
  14.     int wchslen = 0;  
  15.     if(yCodec.HexStr2WChars(str, strlen, 4, NULL, &wchslen) != -1){  
  16.         wchar_t* wchs = new wchar_t[wchslen+1];  
  17.         memset(wchs, 0, sizeof(wchar_t)*(wchslen+1));  
  18.         int n = yCodec.HexStr2WChars(str, strlen, 4, wchs, &wchslen);  
  19.         if(n != -1){  
  20.             // wchar_t to CString  
  21.             wchar_t* pwch = wchs;  
  22.             for(int i=0; i<wchslen; i++) tmp.AppendChar(*pwch++);  
  23.         }  
  24.         if(wchs)    delete []wchs;  
  25.     }  
  26.   
  27.   
  28.     m_Disp.SetWindowTextW(tmp);  


输入字符串 ”4e2d65870045006e0067006c006900730068“转换后输出“中文English“ 字符串,每4个char类型数据转成1个中文或英文。


上述代码经测试可行,暂时没发现什么问题。


测试程序及源码:(不用分下载)

http://download.csdn.net/detail/brantyou/4241745

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值