천객만래 [千客萬來] (It has an interminable succession of visitors)

LPSTR LPCTSTR 위험 CStrgin -> char 으로 변환




(LPSTR)(LPCTSTR)csTest은 위험하다.!!
-. 유니코드를 고려하지 않았을뿐 아니라
-. 위험하게 내부데이터를 접근합니다.
 
CString strPP;
char * chNN = (LPSTR)(LPCSTR)strPP;
이렇게 해서 chNN을 CString의 포인터로 가져 옵니다.

(LPSTR)(LPCSTR)strPP 이 부분 에서 이유는 MSDN을 찾아보시면 아시겠지만 CString은 const char * 으로 만 받을수 있답니다. 
그래서 (LPCTSTR)strPP 이런 형식으로도 사용합니다. 물론 const char *으로 return되겠죠.. 다시 char *을 필요하신다면  
char * chNN = (char *)(LPCTSTR)strPP; 이런 식으로도 사용합니다
 
char *pstr = (LPSTR)(LPCTSTR)str;        이 줄은 UNICODE인경우 
    char *pstr = (char *) (const wchar_t *) str;    입니다.
특히 wchar_t를 본래데이터형으로 보지 않을 경우
    char *pstr = (char *)(const unsigned short *)str;   입니다..
 
유니코드를 고려하지 않는다고 하더라도, CString이 제공하는 것은 const 가 붙은 형변환 밖에 없는데,
이걸 const 를 억지로 빼버리고는 마치 접근해서 고쳐도 되는 것처럼 보이게 되므로 
잘못사용하면 오류를 일으키며. 프로그램이 뻗을수도 있습니다.
 
const 변환은 받는 쪽에서 안고친다고 보고 CString이 자기 내부 메모리주소를 살짝 보여주는 건데.. 
그걸 char로 바꾸고 쓰려고 하면 당연히 에러가 발생 하겠죠...
보통 이런 문제는 char[50] 에서 처럼 .. "특정 위치의 글자를 바로 접근할 수 있냐..?"란 의문에서 생기는데 
이 문제는 CString만으로도 충분합니다.

CString이 operator[] 를 제공하고 있습니다.. operator를 이용 하면 됩니다.. 
str[23] 이렇게 마치 char[] 처럼 사용하실수 있습니다. 
물론 이때도 배열의 길이를 넘어서는 접근은 피해야 합니다.
C/C++의 배열이 제공못하는 길이를 CString은 GetLength()형태로 제공하니 얼마나 편합니까 .
출처:이상 데브피아
 
 
"이하" 파란 생각~
CString csTest = "사나이로 태어나서 할일은 사랑하기";
char* cTest = (LPSTR)(LPCTSTR)csTest;
AfxMessageBox(cTest);
 
즉, 위와 같이 무리한 형변환 보다는 CString의 Operator의 GetBuffer()을 사용해서 가지고오면 더욱 효율적입니다.
char* cTest;
CString csTest = "사나이로 태어나서 할일은 사랑하기";
cTest = csTest.GetBuffer(0);                //GetBuffer(0): csTest가 가지고 있는 문자열의 만큼 가지고 온다는 의미
AfxMessageBox(cTest);
 







Posted by SB패밀리

CString ↔ char 변환




1. CString을 char으로 변환
CString csTest;
csTest = "I Love You";
char* cTest = LPSTR(LPCTSTR(csTest));
 
2. char을 CString으로 변환
char cTest[10] = "I Love You";
CString csTest;
csTest.Format("%s", cTest);

출처 : http://blog.daum.net/sjdody/5693925



Posted by SB패밀리

[개발/VC++] 유니코드 버전으로 된 프로젝트에서 CString 를 char* 로 바꾸는 방법





MFC에서 유니코드 버전으로 된 프로젝트에서 CString 를 char* 로 바꾸는 방법은
유니코드 상태에서 CString 을 바로 CHAR* 로 바꾸는 것이 안됩니다.

W2A 나 A2W 로 코드 변환을 하거나 wsprintf(); 함수를 이용 하면 됩니다.

유니코드는 사용 되는 바이트 수가 2바이트이고 1바이트 문자열로 변환하면 깨져 버리는 문자열 들이 있는데  처리를 해야 합니다. 

유니코드를 멀티바이트 코드로 변환 하려면 

char Text[80];
wsprintfA(Text, "%S", L"문자열" );

멀티바이트 코드를 유니코드로 변환 하려면 

WCHAR Text[80];
wsprintfW(Text, L"%S", "문자열" );


변환될 문자열을 %S(대문자)로 wsprintf()함수를 사용합니다.

※ 현재로써는 바로 CString 에서 char*(LPSTR , LPCSTR) 로 변환 할수 없습니다. 

참고로 더 설명을 하면 CString 기본 요소는 CStringBase<WCHAR>  , CStringBase<CHAR> 둘로 나누어집니다.
이 두 클래스 사이에서 바로 입력 변환이 불가능 합니다. 

변환시에는 API 함수로 코드 변환 후에 사용 해야 하며 
CStringBase<CHAR> 로 사용 한다면 유니코드 내에서 ANSI 코드를 사용 할 수 있습니다. 

또 다른 방법의 함수
-----------------------------
CString을 유니코드로

CString tmp("test");
WCHAR m_wPath[MAX_PATH];

wcscpy(wPath,tmp.GetBuffer(0));



Posted by SB패밀리

[개발/MFC] 문자열 변환 BSTR to CString, CString to BSTR, BSTR to char*

VC++ , MFC에서 문자열 변환 정말 까다롭다.
더군다나 유니코드 모드는 조금더 까다로운것 같다.
아래 예제가 도움이 될 것이라 생각된다.

// Convert BSTR to CString
BSTR bsName;
CString csName;

USES_CONVERSION;
csName = OLE2A(bsName);

// Convert CString to BSTR
BSTR bsName;
CString csName;

bsName = csName.SysAllocString();

// create an OLE string
BSTR bstr = ::SysAllocString(L"Golf is fun!");

// Convert BSTR to char*
BSTR bsName;
char* sName;

bsName = OLE2A(sName);

// convert ATL::CCommBSTR to CString
CommBSTR cbsName;
CString csName;

csName = OLE2T(cbsName);

 

 


Posted by SB패밀리

[개발/MFC] 스트링 형변환

 

문자관련 함수

MBCS(multi-byte character set) : ASCII 코드 문자열을 쓰는 함수

WCS(wide character string) : 유니코드 문자열을 쓰는 함수

 

함수 제일 뒤에 ASCII를 나타내는 A Wide Character를 나타내는 W를 붙여서 구분함.

)  GetCurrentDirectoryA ...

예외) cout, wcout

LPCTSTR(Long Pointer Constant TCHAR String)

여기서 TCHAR 라는 것은 typedef  유니코드가 설정되어 있으면 2바이트로(wchar_t) 아니면 기존 char 방식인 1바이트로(char) 한다는 것을 의미.

LPSTR : 8비트 윈도우 캐릭터 스트링(string) 포인터 문자.

LPCSTR : LPSTR 와 같고 단지 상수형(Constant )이라는 포인터문자.

참조http://cafe.naver.com/whatvoip.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=225

 

--> MFC CString TCHAR 형이다.

 

ATL 형변환 매크로

종류는 [소스 타입]2[새로운 타입] [소스 타입]2C[새로운 타입] 이 있다.

여기서 2C C const(읽기전용)이라는 뜻이다.

 

ATL 3.0 String Conversion Macros

 

 

여기서 A, W, T, OLE, BSTR이 있는데 그 의미는 다음과 같다.

A : MBCS 스트링, char* (A ANSI를 의미) -> LPSTR

W : Unicode 스트링, wchar_t* (W wide를 의미) -> LPWSTR

T : TCHAR 스트링, TCHAR* -> LPTSTR

OLE : OLECHAR 스트링, OLECHAR* (사실, W와 같은 의미) -> LPOLESTR

BSTR : BSTR

이를 통해 몇가지 매크로를 분석해 보면

 

A2BSTR

OLE2A

T2A

W2A

A2COLE

OLE2BSTR

T2BSTR

W2BSTR

A2CT

OLE2CA

T2CA

W2CA

A2CW

OLE2CT

T2COLE

W2COLE

A2OLE

OLE2CW

T2CW

W2CT

A2T

OLE2T

T2OLE

W2OLE

A2W

OLE2W

T2W

W2T

 

*사용법:

#include <atlconv.h>

void func( LPSTR lpsz )

{

   USES_CONVERSION; //형변환 메크로를 사용하기 위해서.

   ...

   LPWSTR x = A2W(lpsz)

   // Do something with x

   ...

}

 

*사용시 주의점:

이 매크로는 메모리를 스택에 잡음:

1) 과도한 순환문 속에서는 사용하면 안됨.

   - 매크로가 불릴 때마다 스택의 메모리를 잡아먹습니다.

   - 그 메모리는 함수가 끝날 때까지 해제되지 않습니다.

2) 매크로의 결과를 리턴하면 안됨.

   - 결과로 나오는 포인터는 함수가 끝날 때까지만 유효합니다.

참조 :

http://msdn.microsoft.com/en-us/library/87zae4a3(VS.80).aspx

http://jof4002.net/?Unicode

http://eroom.korea.com/post/board.aspx?bid=kmh_19505&mode=read&view=board&pid=189103&page=1

 

LPWSTR to CString

(CString) 으로 캐스팅하면 끝

 

CString to LPWSTR

CString strString = "abcd";

BSTR bstrString = strString.AllocSysString();

LPWSTR pwstr = (LPWSTR)bstrString;

SysFreeString(bstrString);

CString to LPTSTR

CString str = _T("new text");

  LVITEM item = {0};

 

  item.mask = LVIF_TEXT;

  item.iItem = 1;

  item.pszText = (LPTSTR)(LPCTSTR) str; // 잘못된 사용!

  // 올바른 사용.

  /*1)*/ item.pszText = str.GetBuffer();

  // 또는

  /*2)*/ _tcscpy_s(item.pszText, MAX_PATH, str.GetBuffer(str.GetLength()));

  ListView_SetItem ( &item );

  str.ReleaseBuffer();

 

참조http://eroom.korea.com/post/board.aspx?bid=kmh_19505&mode=read&view=board&pid=189103&page=1

 

CString to DWORD

CString str=_T("abcd");

DWORD dw = (DWORD)_ttoi((LPCTSTR)str);

출처 : http://hogwarts.tistory.com/172

 

 

매크로

인자

결과

A2CW

(LPCSTR)

(LPCWSTR)

A2W

(LPCSTR)

(LPWSTR)

W2CA

(LPCWSTR)

(LPCSTR)

W2A

(LPCWSTR)

(LPSTR)

T2COLE

(LPCTSTR)

(LPCOLESTR)

 

Posted by SB패밀리
[개발/MFC] 형 변환

http://blog.naver.com/PostView.nhn?blogId=wlsdnrtjd&logNo=20141848341&categoryNo=0&parentCategoryNo=17&viewDate=&currentPage=6&postListTopCurrentPage=&isAfterWrite=true&userTopListOpen=true&userTopListCount=10&userTopListManageOpen=false&userTopListCurrentPage=6

▶ CString -> BYTE
BYTE*   temp;
CString   cmd;
에서 cmd 의 값을 temp에 할당하려 할때.
 
temp=new BYTE[255];
temp=(LPBYTE)(LPCSTR)cmd;
delete []temp;
 
or
 
CString str = _T("abcd");
BYTE* pbyte = new BYTE[256];
int nSize;
nSize = str.GetLength();
CopyMemory( pbyte, str.GetBuffer(nSize), nSize );
pbyte[nSize] = 0;
 
or
 
strcpy(szNamePlace,(LPCTSTR)name);
or
 
CString str = "string";
BYTE* pByte;
pByte = (BYTE*)(LPTSTR)(LPCTSTR)str;

▶ BYTE -> CString
CString testString;
BYTE    testByte;
testString.Format( "%s", testByte );
 
▶ CString -> BYTE *
CString name = "몽룡이";
 BYTE byte[26] = {0};
 BYTE bName[26] = {0x0,};
 sprintf((char*)byte, "%s", name);
 
 memcpy(bName, byte, 26);
 
CString strTmp1, strTmp2;
 strTmp1 = "";
 strTmp2 = "";
 for(int i=0; i<26; i++) {
     strTmp1.Format("%02X ", bName[i]);
     strTmp2 += strTmp1;
 }
 MessageBox(strTmp2, "", 0);
 
26바이트의 크기의 이름이다. 남는 공간은 0으로 채워진다
 
▶  CString -> int

 CString의 문자열을 바로 숫자로 바꾸는것은 
 아직 보지 못했습니다.
 아마 atoi()나 atod()의 C함수를 사용해야 될것 같네요.
 도움말을 참고하세요.


▶  int -> CString

 CString str;
 int i = 6;
 str.Format("%d",i);    // str에 6의 문자가 들어갑니다.


▶  BYTE -> int, int -> BYTE 
 
 바로 형변환으로 가능합니다.
 
 bt = (BYTE)i;          // 주의 : 작은 크기로 들어가기 때문에 
                        // 255 이상의 값은 엉뚱하게 동작하겠지요.
 i = (int)bt;
 
▶ CString  => char* 변환

char * ch;
CString *str;

1) ch = (LPSTR)(LPCSTR)str;
2) ch = str.GetBuffer(str.GetLength());
3) wsprintf( ch, "%s", str);
 

▶ char*  =>  CString 변환

1) str = (LPCSTR)(LPSTR)ch;
2) str = ch;
 
 
참고)
LPSTR 은 char* 입니다.
LPSTR : char stirng의 32비트 포인터, char* 와 같다.
LPCTSTR : Constant character String의 32비트 포인터
UINT : 32비트 unsigned형 정수
DWORD : unsigned long int형
BYTE : 8비트 unsigned 정수
 
 
1.CString 클래스의 GetBuffer()는 CString을 char *로 바꿔줍니다. 

ex) CString strTemp = _T("test"); 
     char *getTemp=NULL; 

     getTemp = malloc(strTemp.GetLength()+1); 
     strcpy(getTemp, strTemp.GetBuffer(strTemp.GetLength()); 
     printf("결과:%sn", getTemp); 

     free(getTemp); 

2. operator LPCTSTR ()도 마찬가지입니다. 

ex) CString strTemp = _T("test");
     char *getTemp = (LPSTR)(LPCSTR)strData;

CString -> BYTE*
CString str="1234";
BYTE *pbyte;
pbyte = (BYTE(LPSTR)(LPCSTR)str;
 
 
 
CString str = _T("abcd");
BYTE* pbyte = new BYTE[256];
int nSize;
nSize = str.GetLength();
CopyMemory( pbyte, str.GetBuffer(nSize), nSize );
pbyte[nSize] = 0;
 
 
CString  => char* 변환

char * ch;
CString *str;

1) ch = (LPSTR)(LPCSTR)str;
2) ch = str.GetBuffer(str.GetLength());
3) wsprintf( ch, "%s", str);

char*  =>  CString 변환

1) str = (LPCSTR)(LPSTR)ch;
2) str = ch;
 
 
참고)
LPSTR 은 char* 입니다.
LPSTR : char stirng의 32비트 포인터, char* 와 같다.
LPCTSTR : Constant character String의 32비트 포인터
UINT : 32비트 unsigned형 정수
DWORD : unsigned long int형
BYTE : 8비트 unsigned 정수
 
참고 : CString을 const char* 형태로 변경 -> (LPTSTR)(LPCTSTR)CString
 
LPCSTR :  A 32-bit pointer to a constant character string.
LPSTR :  A 32-bit pointer to a character string.
LPCTSTR :  A 32-bit pointer to a constant character string that is portable for Unicode and DBCS.
LPTSTR :  A 32-bit pointer to a character string that is portable for Unicode and DBCS.
Posted by SB패밀리
[개발/MFC] 파일에서 불러들인 문자열 나누기 Tokenize

vector나  AfxExtractSubString 함수를 사용하지 않고 하려고 찾다가 보니
MFC에서 지원하는 CString 내 tokenize() 함수가 있어서 이 함수를 사용하게 되었다.
아래 사이트의 내용을 보고 배워서 잘 사용하고 있다.


출처:  http://www.cyworld.com/blog_calmtot/3254873 

//load the ini file setting value.
 CArray<CString,CString&> tokens;
 CFile file;
 BOOL bFileOpend = file.Open(DBConnFile,CFile::modeRead);
 if(bFileOpend)
 {
  char buf[100] = {0,};
  file.Read(&buf,sizeof(buf));
  CString strBuf = buf;  
  int pos = 0;
  CString token;

  while((token = strBuf.Tokenize("|",pos)) != "")
  {
   CString str(token);
   tokens.Add(str);
  }
  file.Close();

  if(tokens.GetSize() == 4)
  {
   mEditHost.SetWindowTextA(tokens.GetAt(0));
   mEditDB.SetWindowTextA(tokens.GetAt(1));
   mEditUser.SetWindowTextA(tokens.GetAt(2));   
   mCEditPort.SetWindowText(tokens.GetAt(3));
  }
 }

 

CFile 로 파일을 읽기모드로 열어 문자열을 buf 에 읽어 들인다.

CString 클래스를 이용해 Tokenize 함수를 호출하여 "|" 문자로 나누어져 있는 문자열을

각각 분리하여 CArray 클래스에 넣는다.  - CalmToT- 
Posted by SB패밀리
소백촌닭
이제 문자열 변환 헤매이지 말고 여기에서 다 찾자.
이 문자열 변수 변환은 아주 유용하게 사용될 것이당.

[개발/MFC] BSTR to CString 문자열 변환 http://sbrich.tistory.com/1047
[개발/MFC} CString to char  http://sbrich.tistory.com/842
[VC++] 문자열변환 CString LPSTR WCHAR* LPCWSTR  http://sbrich.tistory.com/383

Variant To CString , CString to Variant


CString str="abc";
COleVariant strVar(str);
VARIANT var=strVar.Detach();

 
CString VariantToString(VARIANT * va)
   {
    CString s;
    switch(va->vt)
      { /* vt */
       case VT_BSTR:
          return CString(vaData->bstrVal);
       case VT_BSTR | VT_BYREF:
          return CString(*vaData->pbstrVal);
       case VT_I4:
          s.Format(_T("%d"), va->lVal);
          return s;
       case VT_I4 | VT_BYREF:
          s.Format(_T("%d"), *va->plVal);
       case VT_R8:
          s.Format(_T("%f"), va->dblVal);
          return s;
       ... remaining cases left as an Exercise For The Reader
       default:
          ASSERT(FALSE); // unknown VARIANT type (this ASSERT is optional)
          return CString("");
      } /* vt */
   }

Posted by SB패밀리

[개발/MFC] 문자열 변환 BSTR to CString, CString to BSTR, BSTR to char*

VC++ , MFC에서 문자열 변환 정말 까다롭다.
더군다나 유니코드 모드는 조금더 까다로운것 같다.
아래 예제가 도움이 될 것이라 생각된다.

// Convert BSTR to CString
BSTR bsName;
CString csName;

USES_CONVERSION;
csName = OLE2A(bsName);

// Convert CString to BSTR
BSTR bsName;
CString csName;

bsName = csName.SysAllocString();

// create an OLE string
BSTR bstr = ::SysAllocString(L"Golf is fun!");

// Convert BSTR to char*
BSTR bsName;
char* sName;

bsName = OLE2A(sName);

// convert ATL::CCommBSTR to CString
CommBSTR cbsName;
CString csName;

csName = OLE2T(cbsName);

Posted by SB패밀리

1. CString을 char으로 변환
CString csTest;
csTest = "I Love You";
char* cTest = LPSTR(LPCTSTR(csTest));
 
2. char을 CString으로 변환
char cTest[10] = "I Love You";
CString csTest;
csTest.Format("%s", cTest);

출처 : http://blog.daum.net/sjdody/5693925

Posted by SB패밀리

(LPSTR)(LPCTSTR)csTest은 위험하다.!!
-. 유니코드를 고려하지 않았을뿐 아니라
-. 위험하게 내부데이터를 접근합니다.
 
CString strPP;
char * chNN = (LPSTR)(LPCSTR)strPP;
이렇게 해서 chNN을 CString의 포인터로 가져 옵니다.

(LPSTR)(LPCSTR)strPP 이 부분 에서 이유는 MSDN을 찾아보시면 아시겠지만 CString은 const char * 으로 만 받을수 있답니다.
그래서 (LPCTSTR)strPP 이런 형식으로도 사용합니다. 물론 const char *으로 return되겠죠.. 다시 char *을 필요하신다면 
char * chNN = (char *)(LPCTSTR)strPP; 이런 식으로도 사용합니다
 
char *pstr = (LPSTR)(LPCTSTR)str;        이 줄은 UNICODE인경우
    char *pstr = (char *) (const wchar_t *) str;    입니다.
특히 wchar_t를 본래데이터형으로 보지 않을 경우
    char *pstr = (char *)(const unsigned short *)str;   입니다..
 
유니코드를 고려하지 않는다고 하더라도, CString이 제공하는 것은 const 가 붙은 형변환 밖에 없는데,
이걸 const 를 억지로 빼버리고는 마치 접근해서 고쳐도 되는 것처럼 보이게 되므로
잘못사용하면 오류를 일으키며. 프로그램이 뻗을수도 있습니다.
 
const 변환은 받는 쪽에서 안고친다고 보고 CString이 자기 내부 메모리주소를 살짝 보여주는 건데..
그걸 char로 바꾸고 쓰려고 하면 당연히 에러가 발생 하겠죠...
보통 이런 문제는 char[50] 에서 처럼 .. "특정 위치의 글자를 바로 접근할 수 있냐..?"란 의문에서 생기는데
이 문제는 CString만으로도 충분합니다.

CString이 operator[] 를 제공하고 있습니다.. operator를 이용 하면 됩니다..
str[23] 이렇게 마치 char[] 처럼 사용하실수 있습니다.
물론 이때도 배열의 길이를 넘어서는 접근은 피해야 합니다.
C/C++의 배열이 제공못하는 길이를 CString은 GetLength()형태로 제공하니 얼마나 편합니까 .
출처:이상 데브피아
 
 
"이하" 파란 생각~
CString csTest = "사나이로 태어나서 할일은 사랑하기";
char* cTest = (LPSTR)(LPCTSTR)csTest;
AfxMessageBox(cTest);
 
즉, 위와 같이 무리한 형변환 보다는 CString의 Operator의 GetBuffer()을 사용해서 가지고오면 더욱 효율적입니다.
char* cTest;
CString csTest = "사나이로 태어나서 할일은 사랑하기";
cTest = csTest.GetBuffer(0);                //GetBuffer(0): csTest가 가지고 있는 문자열의 만큼 가지고 온다는 의미
AfxMessageBox(cTest);

출처 : http://blog.daum.net/sjdody/5693925
Posted by SB패밀리

MFC에서 유니코드 버전으로 된 프로젝트에서 CString 를 char* 로 바꾸는 방법은
유니코드 상태에서 CString 을 바로 CHAR* 로 바꾸는 것이 안됩니다.

W2A 나 A2W 로 코드 변환을 하거나 wsprintf(); 함수를 이용 하면 됩니다.

유니코드는 사용 되는 바이트 수가 2바이트이고 1바이트 문자열로 변환하면 깨져 버리는 문자열 들이 있는데  처리를 해야 합니다.

유니코드를 멀티바이트 코드로 변환 하려면

char Text[80];
wsprintfA(Text, "%s", L"문자열" );

멀티바이트 코드를 유니코드로 변환 하려면

WCHAR Text[80];
wsprintfW(Text, L"%s", "문자열" );


변환될 문자열을 %s(대문자)로 wsprintf()함수를 사용합니다.

※ 현재로써는 바로 CString 에서 char*(LPSTR , LPCSTR) 로 변환 할수 없습니다.

참고로 더 설명을 하면 CString 기본 요소는 CStringBase<WCHAR>  , CStringBase<CHAR> 둘로 나누어집니다.
이 두 클래스 사이에서 바로 입력 변환이 불가능 합니다.

변환시에는 API 함수로 코드 변환 후에 사용 해야 하며 
CStringBase<CHAR> 로 사용 한다면 유니코드 내에서 ANSI 코드를 사용 할 수 있습니다.

또 다른 방법의 함수
-----------------------------
CString을 유니코드로

CString tmp("test");
WCHAR m_wPath[MAX_PATH];

wcscpy(wPath,tmp.GetBuffer(0));

Posted by SB패밀리


CString -> char *

CString str;
str = "Hello";
char* ss = LPSTR(LPCTSTR(str));

 

char * --> CString

char ss[] = "Hello";
CString str;
str.Format("%s", ss);

(Format대신에 GetBuffer()를 써도 됩니다.)
 
지식인!
 
Environment: Compiled using VC6.0 Sp3 and tested using Win95/98 WinNT4.0 and Win 2000
Here are a few data Conversions with small examples :-

PART ONE :- DECIMAL CONVERSIONS
Decimal To Hexa :-
Use _itoa( ) function and set radix to 16.

 

char hexstring[10];
int number = 30;
itoa( number, hexstring, 16);

In hexstring is 1e.

Hexa To Decimal :-
a)You can use strtol function and you can specify base.

char * hexstring= "ABCDEF";
char * p;
int number = strtol(hexstring, &p,16);

b) Or you can use this too

bool HexToDecimal (char* HexNumber, int& Number)
{
char* pStopString;
Number = strtol (HexNumber, &pStopString, 16);
return (bool)(Number != LONG_MAX);
}


Decimal to Time :-

char *DecToTime(float fTime, char *szTime)
{
int nHrs, nMin, nSec;
fTime *= 3600;
nHrs = (int)fTime / 3600;
nMin = (int)(fTime - nHrs * 3600) / 60;
nSec = (int)(fTime - nHrs * 3600 - nMin * 60);
wsprintf(szTime, "%02d.%02d.%02d Hrs.Min.Sec.", nHrs, nMin, nSec);
return szTime;
}

PART TWO :- STRING CONVERSIONS
String to Hexa :-

sscanf(string, %04X, &your_word16);
// where string = your string and 04 = length of your string and X = hex


Hex to CString :-
CString Str;
unsigned char Write_Buff[1];
Write_Buff[0] = 0x01;
Str.Format("0x0%x",Write_Buff[0]);


COleVariant to CString :-
CString strTemp;
COleVariant Var;
Var = "FirstName";
strTemp = Var.bstrVal;
AfxMessageBox(strTemp);


CString to Char Pointer :-
a) CString MyString = "ABCDEF";
char * szMyString = (char *) (LPCTSTR) MyString;

b) char *pBuffer = new char[1024];
CString strBuf = "Test";
pBuffer = strBuf.GetBuffer(sizeof(pBuffer));

 

Char Pointer to CString :-
char * mystring = "12345";
CString string = mystring;


Double to CString including the fractional part :-
CString strValue,strInt, strDecimal;
int decimal,sign;
double dValue = 4.125;
strValue = _fcvt(dValue,6,&decimal,&sign);

// Now decimal contains 1 because there is only one digit before the .

strInt = strValue.Left(decimal); // strInt contains 4
strDecimal = strValue.Mid(decimal); // strDecimal contains 125

CString strFinalVal;
strFinalVal.Format("%s.%s",strInt,strDecimal); // strFinalVal contains 4.125

 

Double To CString :-
CString strValue;
int decimal,sign;

double dValue = 123456789101112;
strValue = _ecvt(dValue,15,&decimal,&sign);


CString To Double :-
strValue = "121110987654321";
dValue = atof(strValue);


CString to LPCSTR :-
CString str1 = _T("My String");
int nLen = str1.GetLength();
LPCSTR lpszBuf = str1.GetBuffer(nLen);
// here do something with lpszBuf...........
str1.ReleaseBuffer();


CString to LPSTR :-
CString str = _T("My String");
int nLen = str.GetLength();
LPTSTR lpszBuf = str.GetBuffer(nLen);
// here do something with lpszBuf...........
str.ReleaseBuffer();

CString to WCHAR* :-
CString str = "A string here" ;
LPWSTR lpszW = new WCHAR[255];

LPTSTR lpStr = str.GetBuffer( str.GetLength() );
int nLen = MultiByteToWideChar(CP_ACP, 0,lpStr, -1, NULL, NULL);
MultiByteToWideChar(CP_ACP, 0, lpStr, -1, lpszW, nLen);
AFunctionUsesWCHAR( lpszW );
delete[] lpszW;

 

LPTSTR to LPWSTR :-
int nLen = MultiByteToWideChar(CP_ACP, 0, lptStr, -1, NULL, NULL);
MultiByteToWideChar(CP_ACP, 0, lptStr, -1, lpwStr, nLen);


string to BSTR
string ss = "Girish";
BSTR _bstr_home = A2BSTR(ss.c_str());


CString to BSTR :-
CString str = "whatever" ;
BSTR resultsString = str.AllocSysString();


_bstr_t to CString :-

#include
#include
_bstr_t bsText("Hai Bayram");
CString strName;
W2A(bsText, strName.GetBuffer(256), 256);
strName.ReleaseBuffer();
AfxMessageBox(strName);

char szFileName[256];
GetModuleFileName(NULL,szFileName,256);
AfxMessageBox(szFileName);


PART THREE :- CHARACTER ARRAYS

Char array to integer
char MyArray[20];
int nValue;

nValue = atoi(MyArray);

 

Char array to float
char MyArray[20];
float fValue;

fValue = atof(MyArray);


Char Pointer to double :-
char *str = " -343.23 ";
double dVal;
dVal = atof( str );


Char Pointer to integer :-
char *str = " -343.23 ";
int iVal;
iVal = atoi( str );

 

Char Pointer to long :-
char *str = "99999";
long lVal;
lVal = atol( str );


Char* to BSTR :-
char * p = "whatever";
_bstr_t bstr = p;

Float to WORD and Vice Versa :-
float fVar;
WORD wVar;
fVar = 247.346;
wVar = (WORD)fVar; //Converting from float to WORD. The value in wVar would be 247
wVar = 247;
fVar = (float)fVar; //Converting from WORD to float. The value in fVar would be 247.00

# cstring to int

int 형 = _ttoi(cstring 형)


# int to cstring

cstring 형.Format( _T("%d"), int 형); 
 
* CString -> std::string

 

CString cs ("Hello");

  // Convert a TCHAR string to a LPCSTR
  CT2CA pszConvertedAnsiString (cs);

  // construct a std::string using the LPCSTR input
  std::string strStd (pszConvertedAnsiString);

 

 

* std::string -> CString

 

CString tmp;

string foo;

tmp = foo.c_str();

Posted by SB패밀리

VC++의 문자열 변환중 CString에 관련된 몇가지를 알아보자.


CString LPSTR WCHAR* LPCWSTR

CString to LPSTR

 CollapseCString str = _T("My String");
int nLen = str.GetLength();
LPTSTR lpszBuf = str.GetBuffer(nLen);
// here do something with lpszBuf...........

str.ReleaseBuffer();

 

LPTSTR to LPWSTR

int nLen = MultiByteToWideChar(CP_ACP, 0, lptStr, -1, NULL, NULL);
MultiByteToWideChar(CP_ACP, 0, lptStr, -1, lpwStr, nLen);


CString to WCHAR*

CString str = "A string here" ;
LPWSTR lpszW = new WCHAR[255];

LPTSTR lpStr = str.GetBuffer( str.GetLength() );
int nLen = MultiByteToWideChar(CP_ACP, 0,lpStr, -1, NULL, NULL);

MultiByteToWideChar(CP_ACP, 0, lpStr, -1, lpszW, nLen);
AFunctionUsesWCHAR( lpszW );
delete[] lpszW;


CString to LPCWSTR

CString a;
a.Format(_T("%d"), nDiffTime);
WCHAR *b;
b = a.GetBuffer(a.GetLength());

Posted by SB패밀리