C++实现中英文与UNICODE十六进制字符串互转

13 篇文章 0 订阅
10 篇文章 0 订阅

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

我尝试使用过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


  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值