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; }