인터넷 주소를 변환한다.


1.1. 사용법

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

in_addr_t inet_addr(const char *cp);
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_network(const char *cp);
char *inet_ntoa(struct in_addr in);


1.2. 설명

inet_addr()함수는 (점박이 3형제)인터넷 주소 cp를 32bit 바이너리 주소로 변경한값을 리턴한다. 리턴된 값은 네트워크 바이트 오더를 따른다. 만약 잘못된 값을 입력했다면 INADDR_NONE(-1)을 리턴한다. 이 함수는 입력을 제대로 검사할 수 없으므로 가능하면 이 함수보다 inet_aton()을 사용하기 바란다. 왜냐하면 리턴되는 값 -1은 255.255.255.255로 올바른 주소를 나타내기 때문이다. inet_aton()은 에러 체크를 위한 확실한 방법을 제공한다.

inet_aton()함수는 inet_addr()의 보다 최신 버젼이다. inet_aton()은 주어진 인터넷 주소 cp를 변경한 값을 inp에 복사한다. 잘못된 인터넷 주소를 입력했을 경우 0을 리턴한다. 변환값과 리턴값이 분리되어 있으므로 보다 확실한 입력 체크가 가능하다.

inet_network()함수는 인터넷 주소 cp에 대한 호스트 바이트 오더를 따르는 바이너리 주소값을 리턴하는 걸 제외하면 inet_addr()과 동일하다.

inet_ntoa()는 in의 바이너리 인터넷 주소를 점박이 3형제 인터넷 주소로 변경한 다음 되돌려준다. 입력되는 값은 네트워크 바이트 오더를 따라야 한다.

in_addr구조체는 netinet/in.h에 정의되어 있다.

 

struct in_addr
{
    unsigned long int s_addr;
}

 

 


1.3. 예제

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <string.h>

#include <stdio.h>

 

int main(int argc, char **argv)

{

  char buf[256];

  struct in_addr laddr;

  int stat;

 

  while(1)

  {

 

    // 인터넷 주소를 입력 받는다.

    printf("INPUT ADDRESS : ");

    fgets(buf, 255, stdin);

    buf[strlen(buf) -1] = 0x00;

 

    if (strcmp(buf, "quit") == 0) break;

 

    stat = inet_aton(buf, &laddr);

 

    if (!stat)

    {

      printf("Format Error\n");

    }

    else

    {

      printf("inet_addr : %s => %d\n", buf, laddr.s_addr);

      printf("inet_ntoa : %d => %s\n", laddr.s_addr, inet_ntoa(laddr));

    }

  }

  return 0;

}

Posted by pkss
,

1, 문자 집합

 문자 표현 집합은 크게 아래처럼 볼 수 있습니다.

  • SBCS(Single-Byte-Character Set) : 1byte(0~255)로 표현되는 문자 집합

    • ASCII코드(7비트:0x00~0x7F)가 이에 해당하고 8비트 확장코드는 각 나라에서 사용하는 언어마다 조금씩 다르다.
    • 1byte 문자 표현 문화권에서 사용
    • \0(널문자) 1byte
  • MBCS(MultiByte-Character Set) : 1byte이상 문자 집합

    • 윈도우즈 계열에서는 DBCS(Double-Byte Character Set)을 사용하여 1, 2byte(0~655235)로 문자를 표현
    • 1byte이상 문자 표현이 필요한 문화권에서 사용하고 0x00~0x7F는 ASCII코드와 같고 나머지는 각 나라마다 다름
    • \0(널문자) 1byte
  • UCS(Universal Character Set) : 전 세계의 문자를 모두 표현할 목적으로 만들어진 국제 표준 문자 집합. 1byte 이상으로 표현

    • 유니코드(UNICODE)가 이에 해당하고 윈도우즈 계열은 UTF-16으로 인코딩(UTF : Unicode Transformation Format). \0(널문자) 2byte
    • 대표적인 유니코드

      • UTF-8 : 1,2,3,4byte로 인코딩
      • UTF-16 : 2byte로 인코딩
      • UTF-32 : 4byte로 인코딩

 

 

2, Microsoft의 C/C++ 컴파일러와 문자 집합

우리나라도 영어 문화권이 아닌 관계로 MBCS를 사용하거나 UNICODE를 사용합니다. 컴파일 옵션에서 간단하게 바꿀 수 있습니다.

  • MBCS의 특징

    • 1byte의 문자를 많이 사용한다면 메모리를 절약할 수 있다.
    • 국제화에 사용될 수 없습니다.(다른 문화권의 문자를 표현할 수 없습니다.)
    • 문자 크기가 일정하지 않으므로 문자 처리속도가 느릴 수 있습니다.
  • UNICODE의 특징

    • 모든 문자를 2byte로 표현하므로 처리 속도가 빠릅니다.
    • 국제화에 사용될 수 있습니다.(다른 문화권의 문자를 표현할 수 있습니다.)

 

요즘 만들어지는 대두분의 프로그램은 UNICODE를 사용합니다.

만약 MBCS를 사용하는 프로그램으로 만들 경우, 국제화를 위해서 컴파일 옵션만 바꾸면 UNICODE로 컴파일되도록 코드를 작성합니다.

컴파일 옵션은 단지 UNICODE, _UNICODE 매크로를 추가하는 것뿐입니다.

컴파일 옵션 설정은 아래와 같습니다.

 

VC++2008의 _MBCS와 _UNICODE 설정 속성 페이지의 '구성 속성'의 '문자 집합'을 선택합니다.

 Unicode_설정.png

두 설정을 바꾸면 아래처럼 컴파일 옵션 설정이 바뀌게 됩니다.

_MBCS로 설정

Unicode_설정(_MBCS).png 

 

_UNICODE로 설정

Unicode_설정(_Unicode).png

 유니코드로 설정하면 _UNICODE와 UNICODE 옵션이 모두 포함됩니다. C런타임 라이브러리의 전처리 매크로는 _UNICODE를 윈도우 라이브러리는 UNICODE를 필요로 하기 때문입니다.

 

3, MBCS, UNICODE 문자와 문자열 코드

 

MBCS 문자와 문자열 예제입니다.

#include <stdio.h>

void main( )
{
    char c = 'A';
    char *str= "ABC";

    printf("%c\n", c);
    printf("%s\n", str);
}
  1. A
    ABC

 지금까지 배운 내용처럼 출력하면 MBCS 방식 문자, 문자열 출력입니다.

 

UNICODE 문자와 문자열 예제입니다.

#include <stdio.h>

void main( )
{
    wchar_t c = L'A';
    wchar_t *str= L"ABC";

    wprintf(L"%c\n", c);
    wprintf(L"%s\n", str);
}
  1. A
    ABC

 모든 유니코드 문자와 문자열은 L자를 붙입니다. 또 2byte의 문자를 저장하기 위해 wchar_t라는 자료형(unsigned short형과 같은) 변수에 저장합니다. 함수는 printf() 대신 wprintf()를 사용합니다.

 

만약 컴파일 옵션을 사용하여 MBCS와 UNICODE에 따라 코드를 변환하려면 호환가능한 type과 문자열을 사용하면 됩니다.

#include <stdio.h>
#include <tchar.h>

void main( )
{
    TCHAR c = _T('A');
    TCHAR *str= _T("ABC");

    _tprintf(_T("%c\n"), c);
    _tprintf(_T("%s\n"), str);
}
  1. A
    ABC

#include <tchar.h>를 포함하고 자료형을 TCHAR로 합니다. 문자나 문자열은 _T()나 _TEXT()로 감쌉니다. 함수는 _tprintf()로 바꿉니다.

이제 위 코드는 컴파일 옵션에 따라 MBCS나 UNICODE로 컴파일됩니다.

 

4, 주요 매크로 정의

실제 TCHAR와 _T(), _tprintf()의 정의를 볼까요?

#include <stdio.h>
#include <tchar.h>

#ifdef  _UNICODE
  typedef wchar_t     TCHAR;
  #define _T(x)      L ## x
  #define _tprintf        wprintf
#else
  typedef char            TCHAR;
  #define _T(x)      x
  #define _tprintf        printf
#endif

 컴파일 옵션을 설정하면 _UNICODE라는 매크로가 컴파일 옵션에 정의되며 매크로 정의 여부에 따라 문자와 문자열 처리가 달라지는 것을 볼 수 있습니다.

 

 5, PSTR, PCSTR  : PWSTR, PCWSTR : PTSTR, PCTSTR

 

마지막으로 windows.h(winnt.h)에는 사용 편의를 위해 여러가지 typedef와 define이 정의되어 있습니다.

 

char* 예제입니다.

#include <stdio.h>
#include <windows.h>

void main( )
{
    char *str= "ABC";
}
void main( )
{
    CHAR *str= "ABC";
}
void main( )
{
    PCHAR str= "ABC";
}
void main( )
{
    PSTR str= "ABC";
}

 위 main()은 모두 같은 코드입니다.

 

 const char* 예제입니다.

#include <stdio.h>
#include <windows.h>

void main( )
{
    const char *str= "ABC";
}
void main( )
{
    const CHAR *str= "ABC";
}
void main( )
{
    const PCHAR str= "ABC";
}
void main( )
{
    PCSTR str= "ABC";
}

 위 main()은 모두 같은 코드입니다.

 

 wchar_t* 예제입니다.

#include <stdio.h>
#include <windows.h>

void main( )
{
    wchar_t *str= L"ABC";
}
void main( )
{
    WCHAR *str= L"ABC";
}
void main( )
{
    PWCHAR str= L"ABC";
}
void main( )
{
    PWSTR str= L"ABC";
}

 위 main()은 모두 같은 코드입니다.

 

 const wchar_t* 예제입니다.

#include <stdio.h>
#include <windows.h>

void main( )
{
    const wchar_t *str= L"ABC";
}
void main( )
{
    const WCHAR *str= L"ABC";
}
void main( )
{
    const PWCHAR str= L"ABC";
}
void main( )
{

    PCWSTR str= L"ABC";
}

 위 main()은 모두 같은 코드입니다.

 

 TCHAR* 예제입니다.

#include <stdio.h>
#include <windows.h>

void main( )
{
    TCHAR *str= TEXT("ABC");
}
void main( )
{
    PTCHAR str= TEXT("ABC");
}
void main( )
{
    PTSTR str= TEXT("ABC");
}

 

 

 const TCHAR* 예제입니다.

#include <stdio.h>
#include <windows.h>

void main( )
{
    const TCHAR *str= TEXT("ABC");
}
void main( )
{
    const PTCHAR str= TEXT("ABC");
}
void main( )
{
    PCTSTR str= TEXT("ABC");
} 

 위 main()은 모두 같은 코드입니다.

출처 : http://blog.daum.net/coolprogramming/87

Posted by pkss
,

흠...
확실히 CImage 클래스는 쓸만한 구석이 많다.
CImage 를 이용하면 이미지 로딩은 물론 이고
지정한 포맷의 이미지 파일을 만드는것 또한 간단히 할수 있다.
더 이상 이미지 포맷 변경에 알씨( ALSee )를 사용하지 않아도 된다는 거다!!!
- 알씨에 악 감정이 있는 건 아니다. 쩝...

제목은 일단 'CImage 를 이용한 이미지 파일 포맷 변환' 이라 적어 두었는데
사실 여기서 다룰 내용은

1. 이미지 파일 를 로딩하고
2. 로딩한 이미지의 특정 영역을 지정한뒤
3. 그것을 다시 또 다른 이미지 파일에 저장하는 것이다.



//--------------------------------------------------------------------------------------------
// 원본이미지의 특정 영역을 하나의 이미지로 만든다
//--------------------------------------------------------------------------------------------
BOOL MakeCellFrameImage( LPCTSTR InSourceImageFileName, LPCTSTR InDestImageFileName,
                                          const CRect& InTagetRect, REFGUID InImageFormatToMake  )
{
    CImage    TempSourceImage;
    CImage    TempDestImage;
   
    CRect    TempTargetRect = InTagetRect;
    //-------------------------------------------------
    // 1. 원본 이미지를 TempSourceImage에 로딩
    //-------------------------------------------------
    TempSourceImage.Load( InSourceImageFileName );
    CDC* pSourceDC    = CDC::FromHandle( TempSourceImage.GetDC() );    // 원본 이미지의 DC를 얻는다

    //-------------------------------------------------
    // 2. 파일로 만들 이미지 객체 TempDestImage 생성
    //-------------------------------------------------
    int BitPerPixel = pSourceDC->GetDeviceCaps( BITSPIXEL );
    TempDestImage.Create( TempTargetRect.Width(), TempTargetRect.Height(), BitPerPixel );
    CDC* pDestDC    = CDC::FromHandle( TempDestImage.GetDC() );

    if( !pSourceDC || !pDestDC )
    {    return FALSE;    }
   //---------------------------------------------------------------------
    // 3. 타겟 DC( 만들 이미지의 DC )에 원본 이미지 DC 의 내용을 를 쓴다
    //--------------------------------------------------------------------
    pDestDC->BitBlt( 0, 0, TempTargetRect.Width(), TempTargetRect.Height(),
                                     pSourceDC, TempTargetRect.left, TempTargetRect.top, SRCCOPY );
   
    TempDestImage.ReleaseDC();
    TempSourceImage.ReleaseDC();
    //--------------------------------------------------------
    // 4. 이미지 파일로 저장
    //-------------------------------------------------------
    TempDestImage.Save( InDestImageFileName, InImageFormatToMake );

    return TRUE;
}


테스트 삼아 만든 함수인데 보다시피 별것 없다.

하여간 함수 마지막 부분에 이미지를 저장할때 호출하는 CImage::Save() 함수가 나오는데
이때 이 함수의 2번째 인자로 어떤 이미지 포맷으로 저장할지를 결정할수 있다.


The file type to save the image as. Can be one of the following:

  • ImageFormatBMP    An uncompressed bitmap image.

  • ImageFormatPNG     A Portable Network Graphic (PNG) compressed image.

  • ImageFormatJPEG   A JPEG compressed image.

  • ImageFormatGIF      A GIF compressed image.


만일 BMP 포맷의 이미지 파일을 만들고 싶다면 다음과 같이 하면된다.

...
Image.Save( "Test", Gdiplus::ImageFormatBMP );
...

하여간 이상.







[ 출처 ] MSDN

http://blog.naver.com/kzh8055?Redirect=Log&logNo=140100162253
http://msdn.microsoft.com/en-us/library/bwea7by5%28VS.80%29.aspx

Posted by pkss
,