C++实现中英文与UNICODE十六进制字符串互转
2012-02-29 15:06
260 查看
之前搞过这个中英文与UNICODE十六进制字符串的互转,但是发现有点小问题。现在重新搞了一个,测试中暂时没有发现什么问题。先记录下来。
我尝试使用过MultiByteToWideChar和WideCharToMultiByte来实现这个功能,但是发现不行。也就是无法实现如:
中文English --> 4e2d65870045006e0067006c006900730068
和
4e2d65870045006e0067006c006900730068 --> 中文English
这么一个转换,上述的都是字符串。
好看下面的源码:YCodec是自己写的一个类
YCodec.h文件源码:
YCodec.cpp文件源码:
中英文转unicode十六进制字符串实例:
该功能时在MFC程序中测试的。可以做到如下效果:
输入字符串“中文English“ 转换后输出 ”4e2d65870045006e0067006c006900730068“字符串,每个中文或英文转成4个char类型数据。
unicode十六进制字符串转中英文实例:
输入字符串 ”4e2d65870045006e0067006c006900730068“转换后输出“中文English“ 字符串,每4个char类型数据转成1个中文或英文。
上述代码经测试可行,暂时没发现什么问题。
测试程序及源码:(不用分下载)
http://download.csdn.net/detail/brantyou/4241745
我尝试使用过MultiByteToWideChar和WideCharToMultiByte来实现这个功能,但是发现不行。也就是无法实现如:
中文English --> 4e2d65870045006e0067006c006900730068
和
4e2d65870045006e0067006c006900730068 --> 中文English
这么一个转换,上述的都是字符串。
好看下面的源码:YCodec是自己写的一个类
YCodec.h文件源码:
#include <iostream> using namespace std; class YCodec { public: YCodec(); ~YCodec(); // char to hex code int Char2Hex(char ch); // hex to char char Hex2Char(unsigned int n); // num^index long MIndex(int num, int index); // string to hex code long String2Hex(char* string, int strlen); // hex to char* int Hex2String(long hex, char* string, int* slen); // hex to wchar_t code wchar_t Hex2Wchart(long hex); // UNICODE十六进制字符串转成中英文 // hex string to wchar_t* int HexStr2WChars(char* hexstr, int hexstrlen, int eachchar, wchar_t* wchs, int* wchslen); // wchar_t to hex code long Wchart2Hex(wchar_t wch); // 中英文转成UNICODE十六进制字符串 // wchar_t* to char*(hex string) int Wchart2HexStr(wchar_t* wchs, int wchslen, int eachchar, char* hexstr, int* hexstrlen); };
YCodec.cpp文件源码:
#include "StdAfx.h" #include "YCodec.h" #include <stdio.h> #include <stdlib.h> #include <string.h> YCodec::YCodec() { } YCodec::~YCodec() { } // char to hex code // error: return -1 int YCodec::Char2Hex(char ch) { int n = -1; switch(ch) { case '0': n = 0; break; case '1': n = 1; break; case '2': n = 2; break; case '3': n = 3; break; case '4': n = 4; break; case '5': n = 5; break; case '6': n = 6; break; case '7': n = 7; break; case '8': n = 8; break; case '9': n = 9; break; case 'A': case 'a': n = 10; break; case 'B': case 'b': n = 11; break; case 'C': case 'c': n = 12; break; case 'D': case 'd': n = 13; break; case 'E': case 'e': n = 14; break; case 'F': case 'f': n = 15; break; default: break; } return n; } // hex to char // error: return -1 char YCodec::Hex2Char(unsigned int n) { char ch; if(n>=0 && n<=9) ch = 48 + n; else if(n>=10 && n<=15) ch = 65 - 10 + n; else ch = -1; return ch; } // num^index long YCodec::MIndex(int num, int index) { long s = 1; int i=0; while(i<index) { s *= num; i++; } return s; } // string to hex code // error: return -1 long YCodec::String2Hex(char* string, int strlen) { long hex=-1; int i=0, n=0; char *p = string; p += strlen - 1; if(string == NULL) return hex; if(strlen <= 0 || strlen > 10) return hex; hex = 0; do { n = Char2Hex(*p--); hex += n*MIndex(16, i++); }while(i<strlen); return hex; } // hex to char* // string==NULL,slen = the size of string(slen as output) // string!=NULL,input the length of string // error: return -1 int YCodec::Hex2String(long hex, char* string, int* slen) { char tmp[11] = {0}; if(hex < 0) return -1; if(string == NULL){// count the length it will be used sprintf(tmp, "%x", hex); *slen = strlen(tmp); return 1; } memset(string, 0, *slen); sprintf(string, "%x", hex); return 1; } // hex to wchar_t code // eg: input 0x5e74, return 年 // error: return -1 wchar_t YCodec::Hex2Wchart(long hex) { wchar_t wch = -1; if(hex <0) return wch; wch = (wchar_t)hex; return wch; } // hex string to wchar_t* // UNICODE十六进制字符串转成中英文 // hexstr每eachchar转换为一个wchar_t // wchs == NULL, wchsLen as output(the size of wchs will be used) // error: return -1 int YCodec::HexStr2WChars(char *hexstr, int hexstrlen, int eachchar, wchar_t *wchs, int *wchsLen) { if(hexstr == NULL || hexstrlen <= 0 || eachchar <= 0) return -1; if(wchs == NULL){// count the size wchs it will be used *wchsLen = hexstrlen/eachchar + (hexstrlen%eachchar>0 ? 1 : 0); return 1; } memset(wchs, 0, *wchsLen * sizeof(wchar_t)); char* tmp = new char[eachchar+1]; char* p = hexstr; wchar_t* pwch = wchs; for(int i=0; i<hexstrlen; i+=eachchar){ memset(tmp, 0, eachchar+1); // get eachchar char for(int j=0; j<eachchar; j++){ if(i+j > hexstrlen) break; tmp[j] = *p++; } // char* to hex long hex = String2Hex(tmp, strlen(tmp)); if(hex == -1) continue; // hex to wchar_t *pwch++ = Hex2Wchart(hex); } if(tmp) delete []tmp; return 1; } // wchar_t to hex code long YCodec::Wchart2Hex(wchar_t wch) { return (long)wch; } // wchar_t* to char*(hex string) // 中英文转成UNICODE十六进制字符串 // eachchar用于控制每个wchar_t转换成多少个char字符 // hexstr == NULL,hexstrlen as output(the size of hexstr will be used) // error: return -1 int YCodec::Wchart2HexStr(wchar_t *wchs, int wchslen, int eachchar, char* hexstr, int* hexstrlen) { if(wchs == NULL || wchslen <= 0 || eachchar <= 0) return -1; if(hexstr == NULL){// count the size of hexstr will be used *hexstrlen = wchslen*eachchar; return 1; } memset(hexstr, 0, *hexstrlen); char* p = hexstr; wchar_t* pwch = wchs; char* tmp = new char[eachchar+1]; for(int i=0; i<wchslen; i++){ // wchar_t to hex long hex = Wchart2Hex(*pwch++); // hex to char* int charlen = 0; if(Hex2String(hex, NULL, &charlen) != -1){ char* str = new char[charlen+1]; memset(str, 0, charlen+1); int n = Hex2String(hex, str, &charlen); if(n != -1){ int k=0; memset(tmp, 0, eachchar+1); for(k=0; k<eachchar-charlen; k++) tmp[k] = '0'; tmp = strcat(tmp, str); p = strcat(p, tmp); } if(str) delete []str; } if(i > *hexstrlen) break; } if(tmp) delete []tmp; return 1; }
中英文转unicode十六进制字符串实例:
CString input; m_Input.GetWindowTextW(input); CString tmp; YCodec yCodec; // CString to wchar_t* int len = input.GetLength(); wchar_t* wchs = new wchar_t[len+1]; memset(wchs, 0, sizeof(wchar_t)*(len+1)); wcscpy(wchs, input.GetBuffer(len) ); // wchar_t* to hex string int hexlen = 0; if(yCodec.Wchart2HexStr(wchs, len, 4, NULL, &hexlen) != -1){ char* hexstr = new char[hexlen+1]; memset(hexstr, 0, hexlen+1); int n = yCodec.Wchart2HexStr(wchs, len, 4, hexstr, &hexlen); if(n != -1){ // char* to CString char* p = hexstr; for(int i=0; i<hexlen; i++) tmp.AppendChar(*p++); } if(hexstr) delete []hexstr; } if(wchs) delete []wchs; m_Disp.SetWindowTextW(tmp);
该功能时在MFC程序中测试的。可以做到如下效果:
输入字符串“中文English“ 转换后输出 ”4e2d65870045006e0067006c006900730068“字符串,每个中文或英文转成4个char类型数据。
unicode十六进制字符串转中英文实例:
CString input; m_Input.GetWindowTextW(input); CString tmp; YCodec yCodec; // CString to char* int strlen = input.GetLength(); char* str = new char[strlen+1]; memset(str, 0, strlen+1); for(int i=0; i<strlen; i++) str[i] = input.GetAt(i); // hex string to wchar_t* int wchslen = 0; if(yCodec.HexStr2WChars(str, strlen, 4, NULL, &wchslen) != -1){ wchar_t* wchs = new wchar_t[wchslen+1]; memset(wchs, 0, sizeof(wchar_t)*(wchslen+1)); int n = yCodec.HexStr2WChars(str, strlen, 4, wchs, &wchslen); if(n != -1){ // wchar_t to CString wchar_t* pwch = wchs; for(int i=0; i<wchslen; i++) tmp.AppendChar(*pwch++); } if(wchs) delete []wchs; } m_Disp.SetWindowTextW(tmp);
输入字符串 ”4e2d65870045006e0067006c006900730068“转换后输出“中文English“ 字符串,每4个char类型数据转成1个中文或英文。
上述代码经测试可行,暂时没发现什么问题。
测试程序及源码:(不用分下载)
http://download.csdn.net/detail/brantyou/4241745
相关文章推荐
- C++实现数字转换为十六进制字符串的方法
- C++实现十六进制字符串转换为十进制整数的方法
- 十六进制字符串转换成十进制整数的C++实现源代码
- C++实现十六进制表示字符串
- c++ byte类型数组转十六进制字符串的几种代码实现
- 将字符串变成大写----C++实现
- 如何利用C/C++逐行读取txt文件中的字符串(可以顺便实现文本文件的复制)
- C++实现分类统计字符串中字符个数
- 在C++中实现字符串分割--split
- ACM成对的字符串(C++实现)
- C++实现从输入中读取字符串
- C++中sprintf实现将一个基本数据类型的数组转换成字符串
- C语言实现字节流与十六进制字符串的相互转换
- c++实现统计字符串中各字符的个数
- Python实现字符串的逆序 C++字符串逆序算法
- 双向循环链表实现字符串或int类型数组的左移或右移操作C++
- C++中用Socket实现对结构体、长字符串和图片的传输
- 使用C/C++编写函数,实现字符串反转,要求不使用任何系统函数,且时间复杂度最小
- C++面试题,不使用临时变量实现字符串反转
- JavaScript中字符串与Unicode编码互相转换的实现方法