www.gusucode.com > VC++进制转换组件及示例-源码程序 > VC++进制转换组件及示例-源码程序/code/ConvertNum/Convert.cpp

    /////////////////////////////////////////////////////////////////////////////
// 类名:CConvert
// 功能:各种不同进制互相转换接口声明部分(服务器端)
// 下载:http://www.NewXing.com
// 说明:提供二个接口涵数: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;
}