부호 없는 char형 데이터를 10진수, 16진수로 변환하는 문제에 대해
혼란스럽겠지만, 이 글에서는 몇 가지 일반적인 데이터 유형의 사용을 소개합니다.
먼저 설명할 몇 가지 일반적인 유형의 변수를 정의해 보겠습니다.
long l = 2001; f= 300.2;
double d=12345.119;
char 사용자 이름[]="Cheng Peijun"
문자 임시[200];
char *buf;
CString str;
_variant_t v1;
1. 다른 데이터 유형 변환 to strings
짧은 정수형(int)
itoa(i,temp,10);///i를 문자열로 변환하여 temp에 넣으면 마지막 숫자는 10진수를 나타냅니다. p>
itoa(i,temp,2); ///바이너리 모드로 변환
Long 정수(long)
ltoa(l,temp,10) ;
부동 소수점 숫자(float, double)
변환을 완료하려면 다음이 MSDN의 예입니다.
intdecimal, sign; /p>
char *buffer;
double source = 3.1415926535;
buffer = _fcvt( source, 7, &decimal, &sign ); 결과: 소스: 3.1415926535 버퍼: '31415927' 소수: 1 부호: 0
소수는 소수점 위치를 나타내고 부호는 부호를 나타냅니다. 0은 양수, 1은 음수 p>
CString 변수
str = "2008 베이징 올림픽";
buf = (LPSTR)(LPCTSTR)str; p>
BSTR bstrValue = :: SysAllocString(L"Programmer");
char * buf = _com_util::ConvertBSTRToString(bstrValue)
SysFreeString(bstrValue); /p>
AfxMessageBox(buf);
delete(buf);
CComBSTR 변수
CComBSTR bstrVar("test"); >
char *buf = _com_util ::ConvertBSTRToString(bstrVar.m_str)
AfxMessageBox(buf)
삭제(buf); 변수
_b
str_t 유형은 BSTR의 패키지이므로 = 연산자가 오버로드되어 사용하기 쉽습니다.
_bstr_t bstrVar("test")
const char *buf = bstrVar ; ///buf의 내용을 수정하지 마세요.
AfxMessageBox(buf);
일반 방법(COM이 아닌 데이터 유형의 경우)
sprintf를 사용하여 변환 완료
p>char buffer[200];
char c = '1'
int i = 35; > long j = 1000;
float f = 1.7320534f;
sprintf( 버퍼, "%c",c)
sprintf( 버퍼, " %d",i);
sprintf( 버퍼, "%d",j);
sprintf( 버퍼, "%f",f);
2. 문자열 변환 다른 데이터 유형의 경우
strcpy(temp,"123")
짧은 정수(int)
i = atoi(temp );
긴 정수(long)
l = atol(temp)
부동 소수점(이중)
d = atof (temp);
CString 변수
CString 이름 = temp;
BSTR 변수
BSTR bstrValue = ::SysAllocString(L" Programmer") ;
...///bstrValue 사용 완료
SysFreeString(bstrValue);
CComBSTR 변수
CComBSTR 유형 변수 직접 할당 가능
CComBSTR bstrVar1("test")
CComBSTR bstrVar2(temp)
_bstr_t 변수 > _bstr_t 유형 변수에 직접 값을 할당할 수 있음
_bstr_t bstrVar1("test")
_bstr_t bstrVar2(temp)
3. 데이터 유형을 CString으로
CString의 멤버 함수 Format을 사용하여 변환합니다. 예:
Integer (int)
str.Format("%d" ,i);
부동 소수점 수(float)
str.Format("%f",i)
문자열 포인터(char *) 및 CString 생성자에서 이미 지원하는 다른 데이터 유형을 직접 할당할 수 있습니다.
str =
username;
Format에서 지원하지 않는 데이터 유형의 경우 먼저 위에서 언급한 다른 데이터 유형을 char *로 변환하는 방법을 통해 char *로 변환한 다음 해당 값을 CString 변수에 할당할 수 있습니다.
4. BSTR, _bstr_t 및 CComBSTR
CComBSTR은 ATL의 BSTR 캡슐화이고, _bstr_t는 C++의 BSTR 캡슐화이며, BSTR은 32비트 포인터이지만 직접 포인터를 가리키지는 않습니다. 문자열 버퍼 영역.
다음과 같이 char *를 BSTR로 변환합니다:
BSTR b=_com_util::ConvertStringToBSTR("data");///전에 comutil.h 및 comsupp.lib를 추가해야 합니다.
SysFreeString(bstrValue); 사용
그렇지 않으면
char *p=_com_util::ConvertBSTRToString(b); delete p
자세한 내용은 1항과 2항의 구체적인 지침을 참조하세요.
CComBSTR과 _bstr_t는 많은 수의 연산자를 오버로드했으며 =,!=,== 등의 연산을 직접 수행할 수 있어 사용하기 매우 편리합니다.
특히 _bstr_t는 모두가 사용하는 것이 좋습니다.
5. VARIANT, _variant_t 및 COleVariant
VARIANT의 구조에 대해서는 헤더 파일 VC98\Include\OAIDL.H의 tagVARIANT 구조 정의를 참조하세요.
VARIANT 변수 할당의 경우: 먼저 vt 멤버에 값을 할당하고 데이터 유형을 지정한 다음 공용체 구조에서 동일한 데이터 유형의 변수에 값을 할당합니다. 예:
VARIANT va;
int a=2001;
va.vt=VT_I4;///정수 데이터 지정
va.lVal =a; ///할당 p>
즉시 할당되지 않은 VARIANT의 경우 Void VariantInit(VARIANTARG FAR* pvarg)를 사용하여 초기화하는 것이 가장 좋습니다. 표에는 vt와 일반적으로 사용되는 데이터 간의 대응이 나와 있습니다.
Byte bVal; // VT_UI1. // VT_I2. / VT_I4.
float fltVal ; // VT_R4.
double dblVal;
VARIANT_BOOL
SCODE scode; // VT_ERROR.
DATE 날짜
VT_BSTR .
DECIMAL FAR* pdecVal // VT_BYREF|VT_DECIMAL.
IUnknown FAR* punkVal; // VT_UNKNOWN. IDispatch FAR* pdispVal;
SAFEARRAY FAR* parray; // VT_ARRAY|*.
바이트 FAR* pbVal; // VT_BYREF|VT_UI1. VT_BYREF|VT_I2.
long FAR* plVal; // VT_BYREF|VT_I4.
float FAR* pfltVal; // VT_BYREF|VT_R4. pdblVal; // VT_BYREF|VT_R8.
VARIANT_BOOL FAR* pboolVal; // VT_BYREF|VT_BOOL.
SCODE FAR* pscode; > CY FAR* pcyVal; // VT_BYREF|
VT_CY.
DATE FAR* pdate; // VT_BYREF|VT_DATE.
BSTR FAR* pbstrVal; // VT_BYREF|VT_BSTR. ppunkVal; // VT_BYREF|VT_UNKNOWN.
IDispatch FAR* FAR* ppdispVal; // VT_BYREF|VT_DISPATCH.
SAFEARRAY FAR* pparray; p> p>
VARIANT FAR* pvarVal; // VT_BYREF|VT_VARIANT.
void FAR* byref; // 일반 ByRef. /p >
unsigned short uiVal; // VT_UI2.
unsigned long ulVal; //
int intVal; unsigned int uintVal; // VT_UINT.
char FAR * pcVal; // VT_BYREF|VT_I1.
unsigned short FAR * puiVal; p> unsigned long FAR * pulVal; // VT_BYREF|VT_UI4.
int FAR * pintVal;
unsigned int FAR * //VT_BYREF|VT_UINT .
_variant_t는 VARIANT의 래퍼 클래스입니다. 해당 할당은 강제 유형 변환을 사용할 수 있으며 해당 생성자는 이러한 데이터 유형을 자동으로 처리합니다.
사용할 때 #include
를 추가해야 합니다. 예:
long l=222; > ing i= 100;
_variant_t lVal(l);
lVal = (long)i;
COleVariant의 사용은 기본적으로 동일합니다. _variant_t의 경우 다음 예를 참조하세요.
COleVariant v3 = "String", v4 = (long)1999
CString str =(BSTR)v3.pbstrVal; p>
long i = v4.lVal;
6. 기타 COM 데이터 유형
ProgID를 기반으로 CLSID 얻기
HRESULT CLSIDFromProgID(LPCOLESTR lpszProgID ,LPCLSID pclsid);
CLSID clsid;
CLSIDFromProgID( L"MAPI.Folder",&clsid)
CLSID를 기반으로 ProgID 가져오기
WINOLEAPI ProgIDFromCLSID( REFCLSID clsid, LPOLESTR * llppszProgID)
예를 들어 CLSID_IApplication을 정의했으며 다음 코드는 ProgID를 가져옵니다.
LPOLESTR pProgID = 0;
ProgIDFromCLSID( CLSID_IApplication,&pProgID);
...///pProgID를 사용할 수 있습니다
CoTaskMemFree(pProgID);//해제하는 것을 잊지 마세요
7. ANSI와 유니코드
유니코드는 와이드 문자열(wide string)이라고 하며, COM에서 사용되는 모든 유니코드 문자열은 유니코드 문자열입니다.
ANSI를 유니코드로 변환
(1) L 매크로를 통해 구현됩니다. 예: CLSIDFromProgID( L"MAPI.Folder",&clsid)
( 2) 변환은 MultiByteToWideChar 함수를 통해 이루어집니다. 예:
char *szProgID = "MAPI.Folder"
WCHAR szWideProgID[128]; CLSID clsid
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID))
szWideProgID[lLen] = '\0' ;
(3) A2W 매크로를 통해 구현됩니다. 예:
USES_CONVERSION
CLSIDFromProgID( A2W(szProgID),&clsid); p> 유니코드를 ANSI로 변환
(1) WideCharToMultiByte를 사용합니다. 예:
// 이미 유니코드 문자열이 있다고 가정 wszSomeString...
char szANSIString [ MAX_PATH];
WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL )
(2) W2A 매크로를 사용하여 예를 들어 다음과 같이 구현합니다.
USES_CONVERSION;
pTemp=W2A(wszSomeString)
기타
메시지를 처리할 때 WPARAM 또는 LPARAM과 같은 32비트 데이터(DWORD)가 두 개의 16비트 데이터(WORD)로 분해되는 경우가 많습니다. 예:
LPARAM lParam
WORD loValue = LOWORD(lParam);// /하위 16비트 가져오기
WORD hiValue = HIWORD(lParam) ///상위 16비트 가져오기
16비트 데이터의 경우(WORD ), 동일한 방법을 사용하여 두 개의 상위 및 하위 8비트 데이터(BYTE)로 분해할 수 있습니다. 예:
WORD wValue
BYTE loValue = LOBYTE(wValue; ); ///하위 8비트를 취함
BYTE hiValue = HIBYTE(wValue); ///상위 8비트를 취함
2개의 16비트 데이터(WORD)를 합성 32비트 데이터(DWORD, LRESULT, LPARAM 또는 WPARAM)
LONG MAKELONG( WORD wLow, WORD wHigh
);
WPARAM MAKEWPARAM( WORD wLow, WORD wHigh )
LPARAM MAKELPARAM( WORD wLow, WORD wHigh ); WORD wLow, WORD wHigh )
2개의 8비트 데이터(BYTE)를 16비트 데이터(WORD)로 결합합니다.
WORD MAKEWORD( BYTE bLow, BYTE bHigh ) ;
R(빨간색), G(녹색), B(파란색) 세 가지 색상에서 COLORREF 유형 색상 값을 가져옵니다.
COLORREF RGB( BYTE byRed, BYTE byGreen, BYTE byBlue );
예를 들어 COLORREF bkcolor = RGB(0x22,0x98,0x34)
COLORREF 유형 색상 값에서 세 가지 RGB 색상 값을 가져옵니다.
BYTE Red = GetRValue(bkcolor); // /빨간색 가져오기
BYTE Green = GetGValue(bkcolor); ///녹색 가져오기
BYTE Blue = GetBValue(bkcolor); ///파란색 가져오기
9. 참고
ConvertBSTRToString 등의 함수를 사용해야 하는 경우 헤더 파일 comutil.h를 추가해야 합니다. 설정에 comsupp.lib를 추가하거나 #pragma 주석( lib, " comsupp.lib" )을 직접 추가하세요.
또한 Tuan IDC는 온라인에서 많은 제품 그룹 구매를 하고 있으며 가격이 저렴하고 평판이 좋습니다< /피>