Wednesday, October 25, 2006
한글 확장 완성형 문자열 헥사 덤프, 16진수로 변환; Hangul Hex Dump
한글 확장완성형(euc-kr; cp949; ks_c_5601-1987) 문자열을 헥사 즉 16진수 값으로 변환하는 예제입니다. 완성형 코드를 분석할 때 필요한 것입니다.
완성형에서 "가"는 B0 A1 이라는 2바이트로 파일에 기록됩니다. 그러나 메모리에서는 바이트 순서가 바뀌어 A1 B0 이렇게 됩니다. 즉 파일에서는 빅 엔디언(BE)으로 0xB0A1 이렇게 순서대로 기록되고, 메모리에서는 리틀 엔디언(LE)으로 0xA1B0 이렇게 기록됩니다.
소스 파일명: strdump_to_word.cpp
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
실행 결과:
▶▶ C언어] 영문 문자열 헥사(Hex) 덤프, 16진수로 변환 출력; String Dump
▶▶ C언어,비트연산] 바이트 순서 바꾸기 함수, short의 byte 위치를 Byte Swap
▶▶ C언어,비트연산] unsigned short의 좌측, 우측 바이트만 얻기 - Left Byte, Right Byte
▶▶ Perl, 한글 확장완성형 코드표 생성기 - Hangul Wansung Code Table Generator
완성형에서 "가"는 B0 A1 이라는 2바이트로 파일에 기록됩니다. 그러나 메모리에서는 바이트 순서가 바뀌어 A1 B0 이렇게 됩니다. 즉 파일에서는 빅 엔디언(BE)으로 0xB0A1 이렇게 순서대로 기록되고, 메모리에서는 리틀 엔디언(LE)으로 0xA1B0 이렇게 기록됩니다.
한글 완성형을 Hex(헥사)로 변환 예제 소스
소스 파일명: strdump_to_word.cpp
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
#include <stdio.h>
unsigned short byteSwap(unsigned short n);
unsigned char getLeftByte(unsigned short n);
unsigned char getRightByte(unsigned short n);
// 한글 완성형 문자열 헥사 덤프.
// 영문 등의 1바이트 글자가 섞여 있으면 처리 못하는 한계 있음
void main(void) {
char s[] = "가나다라똠방각하";
size_t charCount = sizeof(s) / 2; // 한글 글자 개수 구하기
unsigned short char16;
printf("배열의 바이트 수: %d\n", sizeof(s));
printf("배열의 한글 개수: %d\n", charCount);
for (size_t i = 0; i < charCount; i++) {
char16 = *((unsigned short *)s+i);
printf("[%d] %c%c = (LE) 0x%04X, (BE) 0x%04X\n", i, getRightByte(char16), getLeftByte(char16), char16, byteSwap(char16));
}
}
unsigned short byteSwap (unsigned short n) {
return ((n >> 8) | (n << 8));
}
unsigned char getLeftByte(unsigned short n) {
return (unsigned char) (n >> 8) ;
}
unsigned char getRightByte(unsigned short n) {
return (unsigned char) (n & 0xFF);
}
unsigned short byteSwap(unsigned short n);
unsigned char getLeftByte(unsigned short n);
unsigned char getRightByte(unsigned short n);
// 한글 완성형 문자열 헥사 덤프.
// 영문 등의 1바이트 글자가 섞여 있으면 처리 못하는 한계 있음
void main(void) {
char s[] = "가나다라똠방각하";
size_t charCount = sizeof(s) / 2; // 한글 글자 개수 구하기
unsigned short char16;
printf("배열의 바이트 수: %d\n", sizeof(s));
printf("배열의 한글 개수: %d\n", charCount);
for (size_t i = 0; i < charCount; i++) {
char16 = *((unsigned short *)s+i);
printf("[%d] %c%c = (LE) 0x%04X, (BE) 0x%04X\n", i, getRightByte(char16), getLeftByte(char16), char16, byteSwap(char16));
}
}
unsigned short byteSwap (unsigned short n) {
return ((n >> 8) | (n << 8));
}
unsigned char getLeftByte(unsigned short n) {
return (unsigned char) (n >> 8) ;
}
unsigned char getRightByte(unsigned short n) {
return (unsigned char) (n & 0xFF);
}
실행 결과:
D:\Z>cl strdump_to_word.cpp && strdump_to_word.exe
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
strdump_to_word.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.
/out:strdump_to_word.exe
strdump_to_word.obj
배열의 바이트 수: 17
배열의 한글 개수: 8
[0] 가 = (LE) 0xA1B0, (BE) 0xB0A1
[1] 나 = (LE) 0xAAB3, (BE) 0xB3AA
[2] 다 = (LE) 0xD9B4, (BE) 0xB4D9
[3] 라 = (LE) 0xF3B6, (BE) 0xB6F3
[4] 똠 = (LE) 0x638C, (BE) 0x8C63
[5] 방 = (LE) 0xE6B9, (BE) 0xB9E6
[6] 각 = (LE) 0xA2B0, (BE) 0xB0A2
[7] 하 = (LE) 0xCFC7, (BE) 0xC7CF
D:\Z>
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
strdump_to_word.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.
/out:strdump_to_word.exe
strdump_to_word.obj
배열의 바이트 수: 17
배열의 한글 개수: 8
[0] 가 = (LE) 0xA1B0, (BE) 0xB0A1
[1] 나 = (LE) 0xAAB3, (BE) 0xB3AA
[2] 다 = (LE) 0xD9B4, (BE) 0xB4D9
[3] 라 = (LE) 0xF3B6, (BE) 0xB6F3
[4] 똠 = (LE) 0x638C, (BE) 0x8C63
[5] 방 = (LE) 0xE6B9, (BE) 0xB9E6
[6] 각 = (LE) 0xA2B0, (BE) 0xB0A2
[7] 하 = (LE) 0xCFC7, (BE) 0xC7CF
D:\Z>
▶▶ C언어] 영문 문자열 헥사(Hex) 덤프, 16진수로 변환 출력; String Dump
▶▶ C언어,비트연산] 바이트 순서 바꾸기 함수, short의 byte 위치를 Byte Swap
▶▶ C언어,비트연산] unsigned short의 좌측, 우측 바이트만 얻기 - Left Byte, Right Byte
▶▶ Perl, 한글 확장완성형 코드표 생성기 - Hangul Wansung Code Table Generator
tag: cpp
C언어 | C/C++ (Visual C++)
<< Home