⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coding.h

📁 实现VC环境下网络编程的各种数据编码解码
💻 H
字号:
#ifndef _CODING_H
#define _CODING_H

#pragma warning( disable : 4309 )        // Issue warning 4385
#pragma warning( disable : 4305 )        // Issue warning 4385

CONST CHAR base64_alphabet[]= {
		'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', 
		'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', 
		'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', 
		'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/',
		'='
}; 
CONST DWORD base64_dword_value[]= {
	'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', 
		'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', 
		'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', 
		'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/',
		'='
}; 


//替换XML元素中关键字符< >
int ReplaceXmlKeyWord(LPCTSTR lpszInput,LPTSTR szOut);

//把汉字格式化为%HH
int URLEncode(LPCTSTR pInBuf,LPTSTR szOut);

// Unicode字符 转换成UTF-8编码
LPCTSTR UnicodeToUTF8Char(LPTSTR pOut,WCHAR wcText);

//GB2312字符串转为UTF-8编码
LPCTSTR GB2312ToUTF8(LPTSTR pUTF8Out,LPCTSTR pGB2312Input, int GB2312Len);

//GB2312字符串转为GB2312网页编码
LPCTSTR GB2312ToWebGB2312(LPTSTR pWebGB2312Out,LPCTSTR pGB2312Input, int GB2312Len);

//去掉空格
LPCTSTR TrimChar(LPTSTR pSrc,CHAR c);



BYTE LMoveBit(int base, int MoveNum) 
{ 
	BYTE result=base; 
	if(MoveNum==0)return 1; 
	if(MoveNum==1)return MoveNum; 
	result=base<<(MoveNum-1); 
	return result; 
} 



int Base64Encode(LPBYTE pbSrc, DWORD SrcLen, LPBYTE pbDes) 
{		
	LPBYTE pbOut = pbDes;	
	DWORD dwSrc;
	if( SrcLen<=0 ) return 0;

	
	
	for( DWORD iSrc=0;iSrc<SrcLen;iSrc+=3 ){
		
		dwSrc =  *pbSrc++;
		dwSrc <<= 8;
		dwSrc += *pbSrc++;
		dwSrc <<= 8;
		dwSrc += *pbSrc++;
		
		*pbOut++ = base64_alphabet[ (dwSrc>>18) & 0x3F ];
		*pbOut++ = base64_alphabet[ (dwSrc>>12) & 0x3F ];
		*pbOut++ = base64_alphabet[ (dwSrc>>6)  & 0x3F ];
		*pbOut++ = base64_alphabet[ (dwSrc)     & 0x3F ];	
		
	}
	
	iSrc -= SrcLen;	
	
	if( SrcLen==1 ){//需要补2位
		*(pbOut-1) = *(pbOut-2) = '=';		 		
	}else if( SrcLen==2 ){//需要补1位
		*(pbOut-1) = '=';
	}
	*pbOut = 0;
	iSrc = (int)(pbOut-pbDes);	
	return  iSrc;
}

int Base64Decode(LPBYTE pbSrc, DWORD SrcLen, LPBYTE pbDes) 
{
	char base64_decode_map[256] = {
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,			
			255, 255, 255, 62, 255, 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,			
			255, 0, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,			
			15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, 255, 26, 27, 28,			
			29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,			
			49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,			
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,			
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,			
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,			
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,			
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,			
			255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
	};
	LPBYTE pbOut = pbDes;		
	DWORD b1,b2,b3,b4;	
	
	for( DWORD iSrc=0;iSrc<SrcLen;iSrc+=4 ){
		b1 = *pbSrc++;
		b2 = *pbSrc++;
		b3 = *pbSrc++;
		b4 = *pbSrc++;		
		*pbDes++ = base64_decode_map[b1]<<2 | base64_decode_map[b2]>>4;		
		*pbDes++ = base64_decode_map[b2]<<4 | base64_decode_map[b3]>>2;		
		*pbDes++ = base64_decode_map[b3]<<6 | base64_decode_map[b4];
	}
	
	if( SrcLen ){		
		if( *--pbSrc=='=' ){
			--pbDes;
			if( *--pbSrc=='=' ) --pbDes;
		}
	}
	*pbDes = 0;		
	return (int)(pbDes-pbOut);		
}








LPCTSTR TrimChar(LPTSTR pSrc,CHAR c)
{	
	for( LPTSTR p = pSrc; *p ; p++){
		if( *p==c ) strcpy( p, p+1);
	}
	return pSrc;
}


int ReplaceXmlKeyWord(LPCTSTR lpszInput,LPTSTR szOut)
{	
	char sDst1[] = "〈";
	char sDst2[] = "〉";	
	LPCTSTR pInput = lpszInput;
	LPTSTR	pOutput = szOut;
	while( *pInput ){
		switch( *pInput ){
		case '<': strcpy(pOutput, sDst1); pOutput += strlen(sDst1);  ++pInput; break;
		case '>': strcpy(pOutput, sDst2); pOutput += strlen(sDst2);  ++pInput; break;
		default: *pOutput++ = *pInput++;
		}
	}
	*pOutput = 0;
	return (int)(pOutput-szOut);
}


//把汉字格式化为%HH
BYTE toHex(const BYTE x){return x>9?x+55:x+48;}
int URLEncode(LPCTSTR pInBuf,LPTSTR szOut)
{	
	LPBYTE pInTmp,pOutTmp;	
	pInTmp  = (LPBYTE)pInBuf;
	pOutTmp = (LPBYTE)szOut;	
	while (*pInTmp){
		if(isalnum(*pInTmp)){
			*pOutTmp++ = *pInTmp;
		}else{
			
			if(isspace(*pInTmp)){
				*pOutTmp++ = '+';
			}else{					
				*pOutTmp++ = '%';					
				*pOutTmp++ = toHex(*pInTmp>>4);					
				*pOutTmp++ = toHex(*pInTmp&0xF);					
			}
		}	
		pInTmp++;		
	}
	*pOutTmp = '\0';
	return (int)(pOutTmp-(LPBYTE)szOut);	
}

// Unicode字符 转换成UTF-8编码
LPCTSTR UnicodeToUTF8Char(LPTSTR pOut,WCHAR wcText)
{
	// 注意 WCHAR高低字的顺序,低字节在前,高字节在后
	LPTSTR pchar = (LPTSTR)&wcText;
	pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
	pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
	pOut[2] = (0x80 | (pchar[0] & 0x3F));
	pOut[3] = '\0';	
	return pOut;
}

//GB2312字符串转为UTF-8编码
LPCTSTR GB2312ToUTF8(LPTSTR pUTF8Out,LPCTSTR pGB2312Input, int GB2312Len)
{
	CHAR	buf[4];			
	LPCTSTR lpReturn,pGB2312Cursor,pGB2312InputEnd;
	WCHAR	wcBuffer;	
	
	lpReturn = (LPCTSTR)pUTF8Out;
	pGB2312Cursor  = (LPTSTR)pGB2312Input;
	pGB2312InputEnd= pGB2312Cursor + GB2312Len;
	
	while( pGB2312Cursor<pGB2312InputEnd ){
		//如果ANSII直接复制就可以
		if( *pGB2312Cursor>0 ){
			*pUTF8Out++ = *pGB2312Cursor++;			
		}else{			
			::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,pGB2312Cursor,2,&wcBuffer,1);
			memcpy( pUTF8Out, UnicodeToUTF8Char(buf,wcBuffer), 3 );
			pGB2312Cursor += 2;
			pUTF8Out += 3;			
		}
	}
	*pUTF8Out = '\0';	
	return lpReturn;
}

//GB2312字符串转为GB2312网页编码
LPCTSTR GB2312ToWebGB2312(LPTSTR pWebGB2312Out,LPCTSTR pGB2312Input, int GB2312Len)
{ 
	
	LPCTSTR lpReturn,pGB2312Cursor,pGB2312InputEnd;
	WCHAR	wcBuffer;	
	
	lpReturn = (LPCTSTR)pWebGB2312Out;
	pGB2312Cursor  = (LPTSTR)pGB2312Input;
	pGB2312InputEnd= pGB2312Cursor + GB2312Len;
	
	while( pGB2312Cursor<pGB2312InputEnd ){
		//如果ANSII直接复制就可以
		if( *pGB2312Cursor>0 ){
			*pWebGB2312Out++ = *pGB2312Cursor++;			
		}else{			
			::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,pGB2312Cursor,2,&wcBuffer,1);
			pWebGB2312Out += sprintf( pWebGB2312Out, "&#%d;", wcBuffer);
			pGB2312Cursor += 2;			
		}
	}
	*pWebGB2312Out = '\0';	
	return lpReturn;
}

const char g_cHexChar[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
LPCTSTR GBK_EnCode(LPCTSTR lpszAnsi, LPTSTR szGBK)
{
	LPTSTR szRet = szGBK;
	BYTE num;
	for( LPBYTE pb = (LPBYTE)lpszAnsi;*pb;pb++){
		if( *pb&0x80  ){ //汉字
			num = *pb|0x80;			
		}else{
			num = *pb;
		}

		if( num&0xF0 ){
			*szGBK++ = g_cHexChar[num>>4];
		}else{
			*szGBK++ = '0';
		}
		*szGBK++ = g_cHexChar[num&0x0F];
	}
	*szGBK = '\0';
	return szRet;
}

LPCTSTR GBK_DeCode(LPCTSTR lpszGBK, LPTSTR szAnsi)
{
	LPTSTR szRet = szAnsi;
	BYTE bt;
	for( LPCH pc = (LPCH)lpszGBK;*pc;pc+=2){
		bt = 0;
		switch( *pc ){
		case '0': bt|=0x00; break;
		case '1': bt|=0x10; break;
		case '2': bt|=0x20; break;
		case '3': bt|=0x30; break;
		case '4': bt|=0x40; break;
		case '5': bt|=0x50; break;
		case '6': bt|=0x60; break;
		case '7': bt|=0x70; break;
		case '8': bt|=0x80; break;
		case '9': bt|=0x90; break;
		case 'A': 
		case 'a': bt|=0xA0; break;
		case 'B': 
		case 'b': bt|=0xB0; break;
		case 'C': 
		case 'c': bt|=0xC0; break;
		case 'D': 
		case 'd': bt|=0xD0; break;
		case 'E': 
		case 'e': bt|=0xE0; break;
		case 'F': 
		case 'f': bt|=0xF0; break;
		default: *szRet = '\0'; return szRet;
		}

		switch( *(pc+1) ){
		case '0': bt|=0x0; break;
		case '1': bt|=0x1; break;
		case '2': bt|=0x2; break;
		case '3': bt|=0x3; break;
		case '4': bt|=0x4; break;
		case '5': bt|=0x5; break;
		case '6': bt|=0x6; break;
		case '7': bt|=0x7; break;
		case '8': bt|=0x8; break;
		case '9': bt|=0x9; break;
		case 'A': 
		case 'a': bt|=0xA; break;
		case 'B':
		case 'b': bt|=0xB; break;
		case 'C':
		case 'c': bt|=0xC; break;
		case 'D':
		case 'd': bt|=0xD; break;
		case 'E':
		case 'e': bt|=0xE; break;
		case 'F':
		case 'f': bt|=0xF; break;
		default: *szRet = '\0'; return szRet;
		}

		*szAnsi++ = (CHAR)bt;
	}
	*szAnsi++ = '\0';
	return szRet;
}

int UTF8_2_GBK(const char* pUTF8, LPSTR pGBK)
{
	WCHAR  wcs[4096];
	LPWSTR pUCS2 = wcs;

	if (pUTF8 == NULL){
		*pUCS2 = 0;
		return 0;
	}
	
	int size_s = strlen(pUTF8);
	int size_d = size_s + 10;          //?
	
	int s = 0, d = 0;
	bool toomuchbyte = true; //set true to skip error prefix.
	
	while (s < size_s && d < size_d)
	{
		unsigned char c = pUTF8[s];
		if ((c & 0x80) == 0) 
		{
			pUCS2[d++] += pUTF8[s++];
		} 
		else if((c & 0xE0) == 0xC0)  ///< 110x-xxxx 10xx-xxxx
		{
			WCHAR &wideChar = pUCS2[d++];
			wideChar  = (pUTF8[s + 0] & 0x3F) << 6;
			wideChar |= (pUTF8[s + 1] & 0x3F);
			
			s += 2;
		}
		else if((c & 0xF0) == 0xE0)  ///< 1110-xxxx 10xx-xxxx 10xx-xxxx
		{
			WCHAR &wideChar = pUCS2[d++];
			
			wideChar  = (pUTF8[s + 0] & 0x1F) << 12;
			wideChar |= (pUTF8[s + 1] & 0x3F) << 6;
			wideChar |= (pUTF8[s + 2] & 0x3F);
			
			s += 3;
		} 
		else if((c & 0xF8) == 0xF0)  ///< 1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 
		{
			WCHAR &wideChar = pUCS2[d++];
			
			wideChar  = (pUTF8[s + 0] & 0x0F) << 18;
			wideChar  = (pUTF8[s + 1] & 0x3F) << 12;
			wideChar |= (pUTF8[s + 2] & 0x3F) << 6;
			wideChar |= (pUTF8[s + 3] & 0x3F);
			
			s += 4;
		} 
		else 
		{
			WCHAR &wideChar = pUCS2[d++]; ///< 1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 
			
			wideChar  = (pUTF8[s + 0] & 0x07) << 24;
			wideChar  = (pUTF8[s + 1] & 0x3F) << 18;
			wideChar  = (pUTF8[s + 2] & 0x3F) << 12;
			wideChar |= (pUTF8[s + 3] & 0x3F) << 6;
			wideChar |= (pUTF8[s + 4] & 0x3F);
			
			s += 5;
		}
	}
	pUCS2[d] = 0;	


	int iLen = WideCharToMultiByte( CP_ACP, 0, pUCS2, d, pGBK, size_d, NULL, NULL );

	if( iLen==0 ) 
		iLen = GetLastError();
	
	return iLen;
}

int UTF8_2_UCS2(const char* pUTF8, LPWSTR pUCS2)
{
	if (pUTF8 == NULL){
		*pUCS2 = 0;
		return 0;
	}
	
	int size_s = strlen(pUTF8);
	int size_d = size_s + 10;          //?
	
	int s = 0, d = 0;
	bool toomuchbyte = true; //set true to skip error prefix.
	
	while (s < size_s && d < size_d)
	{
		unsigned char c = pUTF8[s];
		if ((c & 0x80) == 0) 
		{
			pUCS2[d++] += pUTF8[s++];
		} 
		else if((c & 0xE0) == 0xC0)  ///< 110x-xxxx 10xx-xxxx
		{
			WCHAR &wideChar = pUCS2[d++];
			wideChar  = (pUTF8[s + 0] & 0x3F) << 6;
			wideChar |= (pUTF8[s + 1] & 0x3F);
			
			s += 2;
		}
		else if((c & 0xF0) == 0xE0)  ///< 1110-xxxx 10xx-xxxx 10xx-xxxx
		{
			WCHAR &wideChar = pUCS2[d++];
			
			wideChar  = (pUTF8[s + 0] & 0x1F) << 12;
			wideChar |= (pUTF8[s + 1] & 0x3F) << 6;
			wideChar |= (pUTF8[s + 2] & 0x3F);
			
			s += 3;
		} 
		else if((c & 0xF8) == 0xF0)  ///< 1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 
		{
			WCHAR &wideChar = pUCS2[d++];
			
			wideChar  = (pUTF8[s + 0] & 0x0F) << 18;
			wideChar  = (pUTF8[s + 1] & 0x3F) << 12;
			wideChar |= (pUTF8[s + 2] & 0x3F) << 6;
			wideChar |= (pUTF8[s + 3] & 0x3F);
			
			s += 4;
		} 
		else 
		{
			WCHAR &wideChar = pUCS2[d++]; ///< 1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 
			
			wideChar  = (pUTF8[s + 0] & 0x07) << 24;
			wideChar  = (pUTF8[s + 1] & 0x3F) << 18;
			wideChar  = (pUTF8[s + 2] & 0x3F) << 12;
			wideChar |= (pUTF8[s + 3] & 0x3F) << 6;
			wideChar |= (pUTF8[s + 4] & 0x3F);
			
			s += 5;
		}
	}
	pUCS2[d] = 0;	
	
	return d;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -