16进制、Cstring、char*类型转换

2 篇文章 0 订阅
1 篇文章 0 订阅
//char*转16进制
DWORD HEXS(char *decString)
{
	DWORD hexValue=0;
	DWORD sl=0;
	BOOL isWhile=FALSE;
	DWORD idx=0;
	char str[256];
	BYTE ct=0;

	sl=strlen(decString);
	if((sl>0) && (sl<256))
		isWhile=TRUE;
	strcpy(str,decString);
	idx=0;
	while(isWhile)
	{
		ct=(BYTE)(str[idx]);
		switch(ct)
		{
		case 48: // "0"
			hexValue=hexValue<<4;
			hexValue+=0x0;
			break;
		case 49: // "1"
			hexValue=hexValue<<4;
			hexValue+=0x01;
			break;
		case 50: // "2"
			hexValue=hexValue<<4;
			hexValue+=0x02;
			break;
		case 51: // "3"
			hexValue=hexValue<<4;
			hexValue+=0x03;
			break;
		case 52: // "4"
			hexValue=hexValue<<4;
			hexValue+=0x04;
			break;
		case 53: // "5"
			hexValue=hexValue<<4;
			hexValue+=0x05;
			break;
		case 54: // "6"
			hexValue=hexValue<<4;
			hexValue+=0x06;
			break;
		case 55: // "7"
			hexValue=hexValue<<4;
			hexValue+=0x07;
			break;
		case 56: // "8"
			hexValue=hexValue<<4;
			hexValue+=0x08;
			break;
		case 57: // "9"
			hexValue=hexValue<<4;
			hexValue+=0x09;
			break;
		case 65: // "A"
			hexValue=hexValue<<4;
			hexValue+=0x0a;
			break;
		case 97: // "a"
			hexValue=hexValue<<4;
			hexValue+=0x0a;
			break;
		case 66: // "B"
			hexValue=hexValue<<4;
			hexValue+=0x0b;
			break;
		case 98: // "b"
			hexValue=hexValue<<4;
			hexValue+=0x0b;
			break;
		case 67: // "C"
			hexValue=hexValue<<4;
			hexValue+=0x0c;
			break;
		case 99: // "c"
			hexValue=hexValue<<4;
			hexValue+=0x0c;
			break;
		case 68: // "D"
			hexValue=hexValue<<4;
			hexValue+=0x0d;
			break;
		case 100: // "d"
			hexValue=hexValue<<4;
			hexValue+=0x0d;
			break;
		case 69: // "E"
			hexValue=hexValue<<4;
			hexValue+=0x0e;
			break;
		case 101: // "e"
			hexValue=hexValue<<4;
			hexValue+=0x0e;
			break;
		case 70: // "F"
			hexValue=hexValue<<4;
			hexValue+=0x0f;
			break;
		case 102: // "f"
			hexValue=hexValue<<4;
			hexValue+=0x0f;
			break;
		default: //unknown char
			isWhile=FALSE;
			break;
		}
		idx++;
		if(idx>=sl)
			isWhile=FALSE;
	}

	return  hexValue;
}
//Cstring转16进制Cstring
CString ConvertCStringoHex(CString Data)  
{  	
	//char*转为wchar_t*
	char* CStr = Data.GetBuffer( Data.GetLength() );
	size_t len = strlen(CStr) + 1;
	size_t converted = 0;
	wchar_t* a = (wchar_t*)malloc(len*sizeof(wchar_t)); 
	mbstowcs_s(&converted, a, len, CStr, _TRUNCATE);
	//CString转换成char[] 
	int nLen = WideCharToMultiByte( CP_ACP, 0, a, -1, NULL, 0, NULL, NULL );  
	if (nLen == 0)  
	{  
		return NULL;  
	}  
	char* pResult = new char[nLen];  
	char tagChar[2048];  
	WideCharToMultiByte( CP_ACP, 0, a, -1, pResult, nLen, NULL, NULL );  
	strncpy( tagChar,pResult , sizeof(tagChar));  
	//转换成hex  
	CString sResult="";  
	int nLoop=0;  
	while(tagChar[nLoop]!='\0')  
	{  
		static const char *hex="0123456789ABCDEF";  
		if(tagChar[nLoop]<127&&tagChar[nLoop]>0)  
		{  
			//sResult += '0';  
			//sResult += '0';  
			unsigned char chHexA = hex[((unsigned char)(tagChar[nLoop]) >> 4) & 0x0f];  
			unsigned char chHexB = hex[(unsigned char)(tagChar[nLoop]) & 0x0f];  
			sResult += (char)chHexA;  
			sResult += (char)chHexB;  
			nLoop++;  
		}  
		else  
		{  
			unsigned char chHexA = hex[((unsigned char)(tagChar[nLoop]) >> 4) & 0x0f];  
			unsigned char chHexB = hex[(unsigned char)(tagChar[nLoop]) & 0x0f];  
			sResult += (char)chHexA;  
			sResult += (char)chHexB;  

			if(tagChar[++nLoop]=='\0') break;  
			sResult+= hex[((unsigned char)(tagChar[nLoop]) >> 4) & 0x0f];  
			sResult+=hex[(unsigned char)(tagChar[nLoop]) & 0x0f];  
			nLoop++;  

		}  
	}  
	return sResult;  

} 

//HexChar函数的功能是将16进制字符由ASCII码转为相应大小的16进制数
char HexChar(char c)
{
	if((c>='0')&&(c<='9'))
		return c-'0';//将?0-9的??数?y字??字??符¤?转?a为a十??六?¨?进?制?格?式??
	else if((c>='A')&&(c<='F'))
		return c-'A'+10;//将?A-F的??字??符¤?转?a为a十??六?¨?进?制?格?式??例¤y如¨?字??符¤?'C'-'A'+10=12=0x0C
	else if((c>='a')&&(c<='f'))
		return c-'a'+10;//将?a-f的??字??符¤?转?a为a十??六?¨?进?制?格?式??
	else
		return 0x10;
}

//Str2Hex函数的功能则是将如“66 03 ...”形式的字符串以空格为间隔转换为对应的16进制数
//并存放在BYTE型(typdef unsigned char BYTE)数组中,
//data数组作为发送缓冲数组写入串口即可。
int Str2Hex(CString str, BYTE *data)
{
	int t,t1;
	int rlen=0,len=str.GetLength();
	if(len==1)
	{
		char h=str[0];
		t=HexChar(h);
		data[0]=(BYTE)t;
		rlen++;
	}
	//data.SetSize(len/2);
	for(int i=0;i<len;)
	{
		char l,h=str[i];
		if(h==' ')
		{
			i++;
			continue;
		}
		i++;
		if(i>=len)
			break;
		l=str[i];
		t=HexChar(h);
		t1=HexChar(l);
		if((t==16)||(t1==16))//判D断?为a非¤?法¤?§的??16进?制?数?y
			break;
		else
			t=t*16+t1;
		i++;
		data[rlen]=(BYTE)t;
		rlen++;
	}
	return rlen;
}


CString16是Windows API中的字符串类型,通常用于宽字符字符串。如果你有一个十六进制表示的宽字符字符串,想要换成普通的`char*`指针,可以按照以下步骤操作: 1. 首先,你需要确保十六进制字符串是有效的,并且每个字节都有对应的十六进制值。 2. 将十六进制字符串分割成单个字符的十六进制数,例如`'0x1A'`到`'0xFF'`这样的形式。 3. 对于每个十六进制数字,将其换为相应的ASCII码或Unicode字符。在大多数情况下,前两个十六进制位代表一个字符(对于UTF-16),你可以使用`_wtoi()`函数将每个2位换为一个整数值,然后用`static_cast<char>(value)`换回char。 4. 连接这些字符,形成一个新的`char*`字符串。 示例代码(假设`hex_str`是你的十六进制字符串): ```cpp #include <windows.h> #include <string> std::wstring hex_to_wide(const std::string& hex_str) { std::wstring wide_str; for (size_t i = 0; i < hex_str.size(); i += 2) { int value = _wtoi(hex_str.substr(i, 2).c_str(), nullptr, 16); if (value >= 0 && value <= 0xFFFF) { // 检查是否在有效范围内 wide_str.push_back(static_cast<wchar_t>(value)); } } return wide_str; } char* c_string_from_hex(const std::string& hex_str) { std::wstring wide_str = hex_to_wide(hex_str); size_t len = static_cast<size_t>(wide_str.length()) * sizeof(wchar_t); char* result = new char[len + 1]; wcstombs_s(nullptr, result, len + 1, wide_str.c_str(), -1); // 注意内存分配和释放 result[len] = '\0'; // 添加终止符 return result; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值