📄 tool.cpp
字号:
#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 + -