Character Sets

Programming 2010. 5. 16. 14:27

  Character Sets(문자 집합)이란 약속된 문자의 표현 방법으로 어떠한 코드로 저장할 것인가에 대한 정의를 의미한다.


1. SBCS, Single Btye Character Set  (ASCII CODE )
  미국에서 표준화가된 코드로서 26개의 대,소 알파벳과 몇몇 확장 문자 및 기호를 포함해서 총 128개의 문자(확장되어 최대 256개)가 정의 되어 있다.  숫자 65를 문자 A에, 97를 a에... 등등 숫자를 문자에 맵핑시켜서 문자를 표현한다.
  ASCII 코드는 8비트를 가지고 문자들을 표현하며, 프로그램에서는 1byte의 크기인 char형를 사용하여 표현을 한다.


사용자 삽입 이미지
(표1) ASCII Code






2. WBCS, Wide Btye Character Set (UNICODE )
  영어가 아닌 다른 나라 국가에서 사용하는 모든 문자들을 표현할 수 있는 문자 코드 체계이다.
16비트면 65,536개를 표현 할 수 있는데, 이 정도면 모든 언어를 충분히 표현 할 수 있다. 각 국가별로 코드 영역이 구분되어 있기 때문에 코드 페이지를 변경할 필요가 없다.
  유니코드는 NULL문자까지 2byte 처리된다.
  - UTF-16 : 한자는 약 55000자 정도로서 옛한자까지 포함하면 16비트로는 부족한데, Surrogate라는 확장 코드를 정의함으로써 더 많은 문자를 표현할 수 있다.  
  - UTF-8 : 가변 길이로서 표현하고자하는 코드에 따라 여러 바이트를 사용하여 합리적으로 설계된 인코딩 방식.

 (참고. 유니코드로 컴파일된 프로그램은 유니코드를 지원하지 않는 윈95/98에서 실행되지 않는다.)

<ANSI 에서 유니코드 지원을 위해서 정의한 표준>
typedef unsigned short  wchar_t;     //char는 1바이트만 할당되지만 wchar_t는 2byte가 할당.

wchar_t  str[ ]= L"ABC";                //※문자 L은 ""문자열을 유니코드 기반으로 표현한다는 의미.

 

(* 헤더파일 포함 관계 :  winnt.h  ⊂  windef.h  ⊂ windows.h )
<winnt.h>

typedef long          LONG;
typedef char         CHAR;
typedef wchar_t    WCHAR;

typedef CHAR*      LPSTR;
typedef CONST CHAR*  LPCSTR;

typedef WCHAR*   LPWSTR;
typedef CONST WCHAR*  LPCWSTR;


ref. >
typedef CHAR      *PCHAR,  *LPSTR, *PSTR;
typedef CONST CHAR      *LPCCH, *LPCSTR, *PCSTR;
typedef WCHAR    *NWPSTR, *LPWSTR, *PWSTR;
typedef CONST WCHAR    *LPCWCH, *LPCWSTR, *PCWSTR;


<windef.h>

#define CONST       const
typedef unsigned char   BYTE;
typedef unsigned short  WORD;
typedef unsigned long   DWORD;
typedef int                    BOOL;
typedef float                 FLOAT;


( TextOut함수 정의 )
<WinGDI.h>

WINGDIAPI BOOL   WINAPI TextOutA ( __in HDC hdc, __in int x, __in int y, __in_ecount(c) LPCSTR lpString, __in int c);
WINGDIAPI BOOL   WINAPI TextOutW( __in HDC hdc, __in int x, __in int y, __in_ecount(c) LPCWSTR lpString, __in int c);

#ifdef UNICODE
#define TextOut  TextOutW              //W는 Wide의 약자.
#else
#define TextOut  TextOutA              //A는 ANSI의 약자.
#endif // !UNICODE



<완전한 유니코드를 기반으로한 소스>

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

int wmain(int argc, wchar_t* argv[])    
{
      WCHAR str[]=L"한글 출력";
      int len = wcslen(str);

      _wsetlocale(LC_ALL, L"korean");
      wprintf(L"%s \n", str);
      fputws(str, stdout);

      return 0;
}

wmain은 프로그램 실행시 전달되는 문자열을 유니코드기반으로 구성한다는 말이다.
    ex) 실행파일이 main.exe
         c:\> main ABC DEF                 //L"ABC"  L"DEF" 형태의 인자를
  **argv가 가리키게 된다.

wprintf, fputws 등의 함수들을 통해서 유니코드 기반으로 한글을 출력하려면  _wsetlocale(LC_ALL, L"korean") 함수가 호출되어야 한다.  _wsetlocale 는 locale.h 에 정의되어 있다.








3. MBSC, Multi Byte Character Set
  문자를 표현하는데 있어서 동일한 바이트 수를 적용하는 것이 아니라, 다양한 바이트 수를 사용해서 문자를 표현하는 방식이다. 그래서 대부분의 문자들은 1byte로 처리하되(SBCS), 아스키코드에서 정의하지 않는 다른 문자를 표현할 때만 2btye(유니코드)로 처리하게 된다.
  상당히 효율적이지만 프로그램을 구현하는데 있어서 세심한 주의가 필요하다.

▷ MBCS의 문제점

char str[]=“한글입니다”;

for(i=0; i<5; i++)
  fputc (str[i], stdout);                                             // 한글 ←출력값

             //실제 문자열의 길이는 5이지만 한글은 2byte이므로 함수를 10번 호출해야 전부다 출력이 됨.

char str[]="ABC한글"

int len = strlen(str);

printf("배열 크기 %d\n", sizeof(str));                         // 8

printf("문자열 길이 %d\n", len);                               // 7            cf. strlen은 NULL값 제외

               //실제 문자열의 길이는 5이지만 한글은 2byte로 인식하고 있기 때문에 7 출력

모든 문자열을 2byte로 처리하는 WBCS방식을 사용하면 문제점을 해결할 수 있다.








□ WBCS와 MBCS를 동시에 지원하기 위한 매크로
  MBCS기반의 프로그램을 유니코드기반의 프로그램으로 변경하는 경우 문자열앞에 L을 붙이고, 함수들도 모두  변경을 해주어야 한다.
  하지만 UNICODE, _UNICODE 매크로에 의해서 동시에 지원이 가능한 프로그램을 만들 수 있다.

<tchar.h>
  #ifdef UNICODE
    typedef WCHAR     TCHAR;
    typedef LPWSTR    LPTSTR;
    typedef LPCWSTR  LPCTSRT;
  #else
    typedef CHAR      TCHAR;
    typedef LPSTR     LPTSTR;
    typedef LPCSTR   LPCTSTR;
  #endif



#idef _UNICODE
  #define __T(x)    L##x
#else
  #define __T(x)    x
#endif

#define _T(x)       __T(x)
#define _TEXT(x)  __T(x)


#ifdef _UNICODE
  #define _tmain      wmain                                     //유니코드 버전
  #define _tcslen     wcslen                                  
  #define _tcscat     wcscat
  #define _tcscpy    wcscpy
  #define _tcsncpy  wcsncpy
  #define _tcscmp   wcscmp
  #define _tcsncmp wcsncmp
  #define _tprintf     wprintf
  #define _tscanf    wscanf
  #define _fgetts     fgetws
  #define _fputts     fputws
#else
  #define _tmain       main                                     //ANSI 버전
  #define _tcslen     strlen
  #define _tcscat     strcat
  #define _tcscpy     strcpy
  #define _tcsncpy   strncpy  
  #define _tcscmp    strcmp
  #define _tcsncmp  strncmp
  #define _tprintf      printf
  #define _tscanf     scanf
  #define _fgetts      fgets
  #define _fputts      fputs
#endif
//DLL을 만들어서 배포한다고 할때 두 버전의 함수를 제공해야 활용도가 높아진다.


cf.
  이 밖에 운영체제가 제공하는 (API)함수인 lstrlen, lstrcpy, lstrcat, lstrcmp, lstrcmpi, wsprintf 함수가 있다.
  API 함수는 운영체제가 제공하므로 별도의 용량을 차지하지 않고, 이미 메모리에 올라와 있기 때문에 가급적이면 API함수를 사용하는 것이 좋다.
// wsprintf함수는 %f서식을 지원하지 않고, 버퍼 길이가 1024까지만 지원됨. (그래서 _sprintf를 쓰기도 함.)

  #ifdef UNICODE 이라면 WBCS기반의 문자열 저장을 가능하게 하고, UNICODE가 정의되어 있지 않다면 MBCS타입의 문자열로 저장한다.


<WBCS와 MBCS를 모두 지원하는 소스>

      /* 유니코드를 설정해주면 WBCS가 되고, 설정하지 않으면 MBCS가 된다.*/
#include
<stdio.h>
#include <tchar.h>
#include <windows.h>

int _tmain(int argc, TCHAR* argv[])
{
      LPTSTR str1= _T("MBCS 혹은 WBCS 1");
      TCHAR str2[]= _T("MBCS 혹은 WBCS 2");
      TCHAR Input[50];
      LPCTSTR p=str1;

      _tprintf( _T(
"string length %d\n"), _tcslen(p));
      _tprintf( _T("Arr size %d\n"), sizeof(str2));

      _tprintf( _T("Arr size %d\n"), sizeof(Input));          // W 100    M 50

      _tscanf( _T(
"%s"), Input);
      _fputts(Input, stdout);
       return 0;
}

           // W 14                          M 16 ASCII코드에서 정의하지 않는 문자만 2byte
           // W 30 모두2byte취급하니까      M 17                상동




   참고로 유니코드 지원을 위한 프로그램코딩시 유니코드 선언이 헤더파일 전에 선언이 되어야 효과를 볼 수 있다. UNICODE에 선언된 매크로에 따라서 헤더파일의 자료형이 결정되기 때문이다.
  혹은 Visual Studio의 경우 프로젝트 설정(Alt+F7)에서 「Character Set - Use Unicode Character Set」으로 설정해주면 따로 UNICODE선언을 해줄 필요가 없다. 프로젝트 설정에 따라서 D "UNICODE", D "_UNICODE"될 수도 있고, D "_MBCS"가 될 수도 있기때문이다.

  다시 정리하면 WBCS를 위해서 1) #define UNICODE    #define _UNICODE  혹은
                                             2) 프로젝트 설정에서 「Character Set - Use Unicode Character Set」으로 설정.




<참고문헌>
김상형, 윈도우즈 API정복.
윤성우, 뇌를 자극하는 윈도우즈 시스템 프로그래밍.

Posted by 넷지
,

IEEE 802.2 LLC

Network 2010. 4. 23. 23:10


802.2 LLC (Logical Link Control)

  데이터링크 계층에서 수행하는 기능은 MAC, LLC 두 개로 세분화하여 구분할 수 있다. MAC은 물리 계층과의 통신을 담당하고, LLC는 상위 네트워크 계층과 통신을 담당한다.

사용자 삽입 이미지

(그림1) LLC PDU


  LLC PDU는 Ethernet MAC Frame에 포함된다. DSAP(목적지 서비스 액세스 포인트) 첫 번째 1bit가 0이면 Unicast Frame, 1이면 Multicast Frame을 나타내고, 나머지 7bit는 상위계층인 프로토콜을 식별하기 위해서 사용된다.
  SSAP(원천 서비스 액세스 포인트) 처음 1bit는 0이면 명령 PDU, 1이면 응답 PDU이고, 나머지는 마찬가지로 SAP이다. 그 밖에 Control 필드는 HDLC의 제어 필드와 동일하고, Information은 데이터이다.
  보통 Control 필드는 LLC Frame의 종류를 표시하며 대부분은 0x03값(UI)을 가진다


사용자 삽입 이미지

(그림2) Control field

// HDLC와 마찬가지로 3가지 형태가 있다.

// 첫bit가 0 이면 I-Frame, 처음 두bit가 10 이면 S-Frame, 처음 두bit가 11 이면 U-Frame 이다.
// N(S),(R) 은 순서 번호
// S, M은 command와 response 타입을 정의한다. =>자세한 것은 문서나 기타 서적을 참고해주세요.
// X는 사용안함 (예약된 필드)
// P/F필드는 1일때만 poll혹은final 두 가지 의미를 갖는다.


사용자 삽입 이미지
<Protocol Type>





SNAP(Sub Network Access Protocol)

  SNAP(Sub-Network Access Protocol)는 LLC가 다중의 여러 가지 망계층 프로토콜을 사용할 수 있도록 802.2 LLC 헤더를 확장할 수 있게 한 프로토콜로서 OUI와 PID필드로 구성된다.

-OUI(Organizationally Unique Identifier) : 제조사 코드를 나타내는 OUI값으로 24bit이다. (보통NULL)
-PID(Protocol Identifier): Ethernet의 Type과 같다. 크기는 16bit이다.



사용자 삽입 이미지
  예를 위해서 임의로 데이터값을 적어보았다.




<참고문헌>
- TCP/IP Protocol Suite, 3rd Edition
-
http://standards.ieee.org/getieee802/download/802.2-1998.pdf

'Network' 카테고리의 다른 글

FCAPS  (0) 2013.06.08
시스코 자격증 배송  (0) 2011.04.16
NS-2 설치  (0) 2010.12.10
SCTP 상태 천이도  (0) 2010.10.28
해밍코드 원리  (6) 2007.12.14
Posted by 넷지
,

공부??

아무거나 2010. 3. 8. 00:34


사용자 삽입 이미지


사용자 삽입 이미지



  웹서핑 좀 하다가 우연히 발견했다.
이건 뭐~ 평생 공부만 하라는 소리네. (-_-;)  근데 어째 틀린 이야기가 아닌듯~

  책 표지보고 간만에 좀 웃었다 -0-ㅋ



'아무거나' 카테고리의 다른 글

연애 심리 테스트  (2) 2011.04.09
씨게이트 SATA 하드디스크  (0) 2008.02.11
SCX-1730  (5) 2007.08.31
계획하지 않고 성공을 꿈꾸지 마라!  (0) 2006.12.03
VGA Cooler  (0) 2006.11.21
Posted by 넷지
,


[이 글은 제가 예전에 SENS4U 카페에 작성했던 글임을 알려드립니다.]


 


사용자 삽입 이미지

사용자 삽입 이미지

  Vista로 부팅한 상태에서 윈도7 시디를 넣으면 삼성 upgarde 프로그램에 의해서 다음과 같은 창이 뜹니다. 이때 Easy upgrade를 선택하시면 기존의 사용자 데이터를 백업해놨다가 윈도7을 설치한 후 다시 기존의 데이터를 자동으로 유지시켜 줍니다. 가장 간편하게 설치할 수 있는 방법이지만 컴터쓰시는 분이 컴맹이 아닌 이상 개인적으로는 그리 좋은 방법은 아니라고 생각합니다.

  전 이왕이면 포맷을 한다음 새로 설치를 해주시는게 성능면에서나 더 좋다고 생각을 합니다. 기존의 Vista를 삭제하고 새롭게 Windows7을 설치하기 위해서는 윈도7 CD로 부팅을 해야 합니다.



사용자 삽입 이미지

  윈도우 7 CD로 부팅을 하면 다음과 같은 화면이 뜹니다. 다음을 눌러서 넘어가세요.


사용자 삽입 이미지

사용자 삽입 이미지

  여기서 클린 설치를 위해서 사용자 지정(고급)을 선택 합니다.


사용자 삽입 이미지

  이 부분이 가장 중요 합니다. 맨 위에 보이시는 삼성 Recovery 파티션과 다른 파티션은 손대지 마시고 C드라이브에 해당되는 파티션을 선택합니다. (위의 사진에서는 파티션 2가 되겠네요.) 그리고 포맷을 클릭하셔서 포맷을 하시면 됩니다. 만약 다른 드라이브를 건드리시면 난감한 상황이 일어나므로 정확히 확인하셔서 포맷을 해주셔합니다. 이때 포맷을 당하는 C드라이브에 중요한 자료들은 미리 옮겨 두셔야 하겠지요. 또한 혹시 모를 정전에 대비하여서 노트북에 배터리를 장착한 후 설치작업을 해주시기를 바랍니다.


사용자 삽입 이미지

사용자 삽입 이미지

  CD에서 하드로 파일을 복사한 후 설치를 하게 됩니다.


사용자 삽입 이미지

  설치가 끝난 후 자동으로 재부팅을 하게 됩니다.


사용자 삽입 이미지

  마치 설치가 끝난 것처럼 보이지만 아직 몇 가지를 더 설치후 다시 재부팅을 하게 됩니다.



사용자 삽입 이미지

사용자 삽입 이미지

  재부팅 과정을 거친후 설치를 마무리하기 위한 작업을 하게 됩니다.


사용자 삽입 이미지

사용자 삽입 이미지

   암호는 입력하셔도 되고 안하셔도 됩니다. 일단 입력하셨다가 나중에 필요없으시면 해제도 가능 합니다.
  기타 시디키 입력과 다른 설정은 사진상에서는 생략했습니다.


사용자 삽입 이미지

  설치가 완료된 후 바탕화면이 나오기 전 모습입니다.


사용자 삽입 이미지


  설치 시간은 세팅(파티션 및 시디키 등)하는 시간까지 포함해서 약30분 정도 걸린 것 같네요. 인터페이스는 처음 본 순간 왠지 X-Windows느낌이 나더군요. 뭐 에어로 효과랑 그런거는 완전 틀리기는 하지만요.ㅎㅎ

  부팅시간은 비스타보다 살짝 빠르기는 하지만 삼성 드라이버랑 소프트웨어 설치하니까 별 차이가 없더군요. 제 데탑 컴퓨터가 E4300에 945G내장그래픽으로 XP를 사용하고 있는데, (윈도7 컴터 사양이 더 높음에도 불구하고) 부팅시간은 아무 프로그램도 설치하지 않은 윈도7보다 빠릅니다. 하지만 성능면에서는 확실히 윈도7이 Vista보다는 가볍습니다.
  XP의 경우에는 부팅된 후 바탕화면이 나온 뒤에 최초 실행되는 process의 시간이 약간 걸립니다. 예를 들면, 부팅된 다음 최초로 i익스플로러 process를 실행할 경우 메모리에 load되어 execution되는 시간이 쫌 걸립니다. 하지만 윈도 7의 경우에는 그런 delay현상이 약간 줄어든 것 같습니다. (물론 사양 높은 컴퓨터에서 해당되는 사항이 아니겠지만요 -0-)

  지금까지 MS의 운영체제를 써오면서 느낀거지만 새로 출시된 MS의 OS는 항상 그 전의 OS보다 덩치가 컸습니다. Win95를 쓰다가 Win98을, 그리고 Win98에서 Win Me, NT4.0에서 Win2000을 설치한 뒤에 모두 느려짐을 느꼈습니다. 이는 어찌보면 당연한 결과입니다. 여러가지 추가적인 사항과 변화가 있다보니까 덩치가 커지기 마련입니다. 단지 얼마만큼 최적화가 됬냐의 차이가 있겠지만요.

  하지만 부팅시간은 좀 실망스럽더군요. Win ME와 같이 패스트한 부팅을 기대했건만 Vista보다 살짝 빠른 정도의 수준 같습니다.

  이상입니다. 도움이 되셨길 바라며 글을 마치겠습니다.


Posted by 넷지
,
SEGATE SATA HDD

사용자 삽입 이미지


  기존에 쓰던 E-IDE 방식의 하드디스크에서 SATA로 갈아타기 위해서 얼마전에 씨게이트 하드를 구입하게 되었다. TB급의 HDD가 생산되는 시대가 되서 그런지 320GB 이하의 하드디스크들은 값이 상당히 저렴해졌다.

사용자 삽입 이미지


  위의 사진처럼 점퍼를 꽂으면 1.5G로 동작하는 STAT-I 이 되고, 점퍼를 빼면 3G로 작동하는
SATA-II 모드가 되는 것이다. 소음에 민감하다면 회전속도(동작속도)를 낮춰서 소음을 조금 줄일 수 있다.
  그 밖에 SATA에서는 기존의 IDE 방식과는 다르게 점퍼로 Master / Slave 설정을 할 필요가 없다. 보시다시피 전송모드를 위한 점퍼만 존재하고 다른 것은 없는 것을 볼 수가 있다.

  아래의 그림은 SATA의 파워와 신호케이블의 연결 모습을 보여주고 있다.

사용자 삽입 이미지



  예전부터 씨게이트 하드디스크를 쓰면서 저소음에 만족하며 사용해왔었다. 그런데 씨게이트 하드가 SATA 160GB가 넘어서면서부터 예전의 E-IDE 방식만큼 조용하지 못한것 같다.
(아니 시끄럽다 -_-;) 물론 뽑기(?)를 잘해서 조용할 수도 있다. 성능보다 소음에 민감하신 분들은 다른 하드를 사기를 권장한다.

'아무거나' 카테고리의 다른 글

연애 심리 테스트  (2) 2011.04.09
공부??  (0) 2010.03.08
SCX-1730  (5) 2007.08.31
계획하지 않고 성공을 꿈꾸지 마라!  (0) 2006.12.03
VGA Cooler  (0) 2006.11.21
Posted by 넷지
,