컴퓨터 지식 네트워크 - 컴퓨터 프로그래밍 - 부호 없는 char형 데이터를 10진수, 16진수로 변환하는 문제에 대해

부호 없는 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진수를 나타냅니다.

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은 음수

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; ///할당

즉시 할당되지 않은 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는 온라인에서 많은 제품 그룹 구매를 하고 있으며 가격이 저렴하고 평판이 좋습니다< /피>

上篇: 안녕, 여름 줄거리 소개. 下篇: 사회자 뒤에 팬이 없으면 어떡하죠?
관련 내용