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

📄 tool.cpp

📁 对数据进行base64编码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "StdAfx.h"
#include ".\tool.h"
#include ".\ans1.h"
#include <stdio.h>

CTool::CTool(void)
{
}

CTool::~CTool(void)
{
}


/*
 * BASE64 编码用到的定义
 */
static char basis_64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";	
#define CHAR64(c)  (((c) < 0 || (c) > 127) ? -1 : index_64[(c)])
char * base64_encode(const unsigned char *value, int vlen);	
unsigned char * base64_decode(const char *value, int *rlen);
	
static signed char index_64[128] = {	
	    -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,	
	    -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,	
	    -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,	
	    52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1,	
	    -1, 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,-1, -1,-1,-1,-1,	
	    -1,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,-1, -1,-1,-1,-1	
} ;
//End
	
/*******************************************************************
 * 函数名称:Base64_Encode
 * 功能说明:对所给数据进行BASE64编码。
 * 参数说明:IN     value           :待编码数据
 *           IN     vLen            :待编码数据长度
 *           OUT    pcBase64Value   :返回编码结果。前提:已经提供了足够的内存空间。
 * 返 回 值:返回BASE64编码后的结果。
*******************************************************************/
void CTool::Base64_Encode(IN const unsigned char *value, 
                           IN int vlen, 
                           OUT char *pcBase64Value) 
{
    unsigned char oval = 0 ; 	
    char *result = (char *)malloc((vlen * 4) / 3 + 5) ;	
    char *out = pcBase64Value;	

	while (vlen >= 3) 
    {	
        	*out++ = basis_64[value[0] >> 2];	
        	*out++ = basis_64[((value[0] << 4) & 0x30) | (value[1] >> 4)];	
        	*out++ = basis_64[((value[1] << 2) & 0x3C) | (value[2] >> 6)];	
        	*out++ = basis_64[value[2] & 0x3F];	
        	value += 3;	
       		vlen -= 3;	
    }

	if (vlen > 0) 
    {	
	        *out++ = basis_64[value[0] >> 2];	
	        oval = (value[0] << 4) & 0x30 ;	
	        if (vlen > 1) oval |= value[1] >> 4;	
	        *out++ = basis_64[oval];	
	        *out++ = (vlen < 2) ? '=' : basis_64[(value[1] << 2) & 0x3C];	
	        *out++ = '=';	
	}	
	*out = '\0';		

}	


/*******************************************************************
 * 函数名称:Base64_Decode
 * 功能说明:对所给BASE64格式的数据进行解码。
 * 参数说明:IN     value   :BASE64格式的数据
 *           IN     vLen    :数据长度
 * 返 回 值:返回BASE64解码后的结果。
*******************************************************************/
unsigned char * CTool::Base64_Decode(const char *value, int *rlen, OUT char *pcBase64Value)	
{		
    int c1, c2, c3, c4;	        	
    int vlen = strlen(value);	
    unsigned char *result = (unsigned char*)pcBase64Value;//(unsigned char *)malloc((vlen * 3) / 4 + 1);	
    unsigned char *out = result;	

    *rlen = 0;

    while (1) 
    {	
		if (value[0]==0) {
            *out = '\0' ; 
            return result;	
		}
        c1 = value[0];	
        if (CHAR64(c1) == -1) goto base64_decode_error;
	    c2 = value[1];	
	    if (CHAR64(c2) == -1) goto base64_decode_error;
	    c3 = value[2];	
	    if ((c3 != '=') && (CHAR64(c3) == -1)) goto base64_decode_error;
	    c4 = value[3];	
	    if ((c4 != '=') && (CHAR64(c4) == -1)) goto base64_decode_error;	
        value += 4;	
	    *out++ = (CHAR64(c1) << 2) | (CHAR64(c2) >> 4);	
	    *rlen += 1;	
	    if (c3 != '=') 
        {	
	        *out++ = ((CHAR64(c2) << 4) & 0xf0) | (CHAR64(c3) >> 2);	
	        *rlen += 1;	
	        if (c4 != '=') 
            {	
	            *out++ = ((CHAR64(c3) << 6) & 0xc0) | CHAR64(c4);	
	                *rlen += 1;	
	        }
	    }	
	}	
    base64_decode_error:	
    *result = 0;	
    *rlen = 0;	

    return result;	
}



/*********************************************************************
 * 函数名称:i_Reverse
 * 功能说明:将所给数据的高低字节做反向。例如:
 *           {0x12, 0x34, 0x56, 0x78} 反向后的结果为 {0x78, 0x56, 0x34, 0x12}
 *           
 * 参数说明:
 *           IN OUT pbData         :输入待反向数据,输出反向后的数据。
 *           IN     dwDataLen      :待反向数据长度
 * 历    史:
*********************************************************************/
void CTool::i_Reverse(
                IN OUT  BYTE*   pbData,
                IN      DWORD   dwDataLen
                )
{
	DWORD dwCount;
	BYTE bTem;
	for(dwCount = 0;dwCount < dwDataLen/2;dwCount++){
		bTem = pbData[dwCount];
		pbData[dwCount] = pbData[dwDataLen - 1 - dwCount];
		pbData[dwDataLen - 1 - dwCount] = bTem;
	}
}


/************************************************************************
 * 函数名称:HexToStr
 * 功能说明:二进制数据转换为字符串格式。
 *           例如{0x13, 0xa0, 0x6d, 0x49} =〉"13A06D49"
 * 参数说明:IN     pbHex      :二进制数据。例如:{0x13, 0xa0, 0x6d, 0x49}
 *           IN     dwHexLen   :二进制数据长度
 *           OUT    pcStr      :字符串,例如:"13A06D49"
 *           IN OUT pdwStrLen  :输入pcStr缓冲区的大小,返回转换后的字符串长度。
 ************************************************************************/
void CTool::HexToStr(
                    IN      BYTE    *pbHex, 
                    IN      DWORD   dwHexLen, 
                    OUT     char    *pcStr, 
                    IN OUT  DWORD   *pdwStrLen
                    )
{
    BYTE    pbOut[0x400 * 8];//相对足够大
    DWORD   dwRetLen = 0;
    BYTE    pbM[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
	int		i;

    //将一个字节一分为二
    for(i=0; i<dwHexLen; i++)
    {
        pbOut[i * 2] = pbHex[i] >> 4;
        pbOut[i * 2 + 1] = pbHex[i] & 0x0f;
    }

    //将二进制数据转换为可见字符
    for(i=0; i<dwHexLen * 2; i++)
    {
        pbOut[i] = pbM[pbOut[i]];
    }

    //
    dwRetLen = dwHexLen * 2;
    if((pdwStrLen != NULL) && (*pdwStrLen < dwRetLen)) {
        dwRetLen = *pdwStrLen;
    }
    memcpy(pcStr, pbOut, dwRetLen);
}


//将数据从字符串表示转换为二进制表示
int CTool::StrToHex(
            IN      BYTE    *pbStr, 
            IN      DWORD   dwLen, 
            OUT     BYTE    *pbHex
            )
{
    BYTE    b;
    BYTE    pbTmp[0x400 * 8];
    int     i;

    for(i=0; i<dwLen; i++) {
        b = pbStr[i];
        if((b>='a') && (b<='f')) {
            b = b - 'a' + 0xa;
        }
        else if((b>='A') && (b<='F')) {
            b = b - 'A' + 0xa;
        }
        else if((b>='0') && (b<='9')) {
            b = b - '0';
        }
        else {
            return 1;
        }

        pbTmp[i] = b;
    }

    for(i=0; i<dwLen/2; i++) {
        pbHex[i] = pbTmp[i*2] * 16 + pbTmp[i*2+1];
    }

    return 0;
}



/*********************************************************************
 * 函数名称:LogFile
 * 功能说明:将所给字符串(或二进制数据)写入到日志文件。
 *           所给数据pcData可能为字符串,也可能为二进制数据。
 *           当nDataLen=-1时,pcData为字符串;当nDataLen>0时,pcData为二进制数据。
 *           如果pcData为二进制数据,则将会被转换为可见字符,然后写入日志。
 * 参数说明:
 *           IN     pcTitle     :本条日志的标题。可以为空""。
 *                                pcTitle和pcData进行拼接后被记录到日志文件。
 *           IN     pcData      :字符串或二进制数据
 *           IN     nDataLen    :>=0   :pcData将被视为二进制数据进行显示。
 *                                -1    :pcData将被视为字符串进行显示。
 *                                -2    :pcData将被视为字符串进行显示,并在本条日志的末尾加上系统时间(YYYY-MM-DD HH:MM:SS:MMM)。
 *           IN     blIfReturn  :是否在数据末尾加入回车换行符。
 * 历    史:2007-05-29 石明浩 创建完成
*********************************************************************/
void CTool::LogFile(
             IN     char    *pcTitle,
             IN     char    *pcData, 
             IN     int     nDataLen,
             IN     bool    blIfReturn
             )
{

#ifdef _DEBUG
    const char *pcFilename= "c:\\ICBCQueryPubKey.log";
    FILE *fp;
    char pcLogData[0x500];

    memset(pcLogData, 0, sizeof(pcLogData));

	fp = fopen(pcFilename, "a");
	if(fp == NULL) {
		return;
	}

    strcat(pcLogData, pcTitle);

    if(nDataLen >= 0) {
        if(pcData != NULL) {
            HexToStr((BYTE*)pcData, nDataLen, pcLogData + strlen(pcLogData), NULL);//转换为可见字符
        }
        sprintf(pcLogData + strlen(pcLogData), "(%d)", nDataLen);//长度也显示出来,十进制表示
        sprintf(pcLogData + strlen(pcLogData), "(0x%x)", nDataLen);//长度也显示出来,十六进制表示
    }else if(nDataLen == -1){
        strcat(pcLogData, pcData);
    }else if(nDataLen == -2){
        SYSTEMTIME sysTime;
        GetLocalTime(&sysTime);
        strcat(pcLogData, pcData);
        sprintf(pcLogData + strlen(pcLogData), "%4d-%0.2d-%0.2d %0.2d:%0.2d:%0.2d:%0.3d",sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds);
    }

    if(blIfReturn) {
        strcat(pcLogData, "\r\n");
    }

    //写入文件
    fwrite(pcLogData,strlen(pcLogData), 1, fp);
	fflush(fp);
	fclose(fp);
    //*/
#endif
}





/*********************************************************************
 * 函数名称:ToDER
 * 功能说明:对所给(RSA公私钥)数据进行DER编码。输入的数据是低位在前。
 *           
 * 参数说明:
 *           OUT    pbDERValue     :返回DER编码
 *           IN OUT pdwDERValueLen :输入pbDERValue缓冲区的大小,返回DER编码的实际长度。
 *           IN     bKeyType       :取值:公钥(TYPE_PUBKEY)、私钥(TYPE_PRIKEY)。
 *                                   如果为公钥,则需要输入pbN、pbE。

⌨️ 快捷键说明

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