📄 convert.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// 类名:CConvert
// 功能:各种不同进制互相转换接口声明部分(服务器端)
// 说明:提供二个接口涵数:IsValidate()用来检验输入有效性;Convert()来完成实际转换
// 作者:徐景周(jingzhou_xu@163.net)
// 组织:未来工作室(Future Studio)
// 日期:2003.1.1
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ConvertNum.h"
#include "Convert.h"
/////////////////////////////////////////////////////////////////////////////
// CConvert
STDMETHODIMP CConvert::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IConvert
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
// 检验输入参数的有效性
STDMETHODIMP CConvert::IsValidate(VARIANT varStr, long lBase, long lLength)
{
CComVariant varNum(varStr);
HRESULT hr = varNum.ChangeType(VT_BSTR);
if(FAILED(hr))
return(DISP_E_TYPEMISMATCH);
char str[30];
USES_CONVERSION;
lstrcpy(str,OLE2T(varNum.bstrVal)); // 将BSTR转为ANSI字符串
int iVal ;
iVal = '0' + lBase ;
if (lBase>10)
iVal += ('A' - '9') -1;
for (int i=0; i<lLength; i++)
{
if (str[i] >= iVal)
return S_FALSE; // 无效
}
return S_OK;
}
// 在各种进制间进行转换
STDMETHODIMP CConvert::Convert(VARIANT varStr, long lOldBase, long lNewBase, long lLength, VARIANT* pvarResult)
{
CComVariant varNum(varStr);
HRESULT hr = varNum.ChangeType(VT_BSTR);
if(FAILED(hr))
return(DISP_E_TYPEMISMATCH);
char str[30], strDesc[30],strTemp[30];
USES_CONVERSION;
lstrcpy(str,OLE2T(varNum.bstrVal));
double dec_frac =0;
long dec_num =0;
int dec_digit =0;
// 计算整数部分
for (int i=0; i<lLength && str[i]!='.'; i++)
{
dec_digit = str[i] - '0';
if (str[i]>='A')
dec_digit -= ('A' - '9') -1; // 对9以后数据进行计算
dec_num = dec_digit + dec_num*lOldBase;
}
int j,aski_val;
j = 0;
while (dec_num > 0)
{
aski_val = dec_num % lNewBase + '0';
if (dec_num%lNewBase > 9)
aski_val += ('A' - '9') -1; // 对9以后数据进行计算
strTemp[j] = aski_val ;
dec_num = dec_num/lNewBase ;
j++;
}
// 将整数部分倒转存储来正确格式
int nTemp = 0;
for (int k=j-1; k>=0; k--)
strDesc[nTemp++] = strTemp[k];
// 计算小数部分
int index;
if (str[i] == '.')
{
for (index = --lLength ; index > i; index--)
{
dec_digit = str[index] - '0';
if (str[index]>='A')
dec_digit -= ('A' -'9') -1; // 对9以后数据进行计算
dec_frac = (dec_frac + dec_digit)/lOldBase;
}
strDesc[j++] = '.';
char FracDigit;
int Digit ;
for (int i=0; i<10; i++)
{
dec_frac = dec_frac * lNewBase ; // 小数点后的计算
Digit = dec_frac ;
dec_frac -= Digit;
FracDigit = Digit + '0' ;
if (lNewBase>10 && FracDigit>'9')
FracDigit += ('A' - '9' - 1) ;
strDesc[j++] = FracDigit;
}
}
strDesc[j] = '\0';
if(pvarResult)
{
CComBSTR bstrDesc(strDesc);
VariantInit(pvarResult);
pvarResult->vt = VT_BSTR;
pvarResult->bstrVal = bstrDesc;
}
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -