'엔디안'에 해당되는 글 2건

  1. 2009.01.02 코드에서 엔디안을 감지하는 방법
  2. 2008.05.07 BOM이 뭔지 알고 지나가자.


코드에서 엔디안을 감지하는 방법은 아주 간단하다.
원리는 2바이트 이상을 사용하는 정수형에 값을 부여한다.
예를 들어 2바이트형 정수에 1이라는 값을 할당했다하면 한바이트는 0x00일 것이고, 나머지 바이트는 0x01일 것이다.
앞의 바이트가 0x01인지, 0x00인지만 살펴보면 된다.


그래서 일반적인 코드를 작성하게 되면 다음과 같다.


int x = 0x01;
if (*(char*)&x == 0x1) {
// little endian
}else{
// big endian
}



그런데 C에서는 더 간단한(?) 방법이 있다. 원리는 동일!
union을 이용하는 방법이다.


union {
int value;
char endian;
}checkEndian;

checkEndian.value=1;
if (checkEndian.endian) {
// little endian
}else {
//big endian
}



복잡해 보이네 :)

여하튼 union개념까지 아는지 여부를 체크해보라면 저런식으로 작성할 수 있겠지.
의외로 구조체(struct)와 공용체(union)의 차이를 잘 모르는 개발자들도 많다.

더 간단(?)한 방법은 #ifdef로 플랫폼별로 endian을 지정해 줘버리는 방법도 있다.
꼭 코드에서 감지할 필요는 없다. :)

Posted by NeoZest

눈큰아이입니다.

의외로 신입 개발자들을 만나다보면 문자셋이나 파일처리를 힘들어하는것 같더군요.
특히 텍스트 파일중 유니코드 파일이냐, 아스키파일이냐, UTF-8이냐를 구분하는 방법과, 리틀엔디안이냐, 빅엔디안이냐에 따라 달라지는 것들을 잘 이해하지 못하더군요.

우선 이 글에서는 BOM에 대해서만 소개해 봅니다.

BOM이란 Byte Order Marker의 약자입니다.
텍스트 파일을 처음 만들었을때에는 인코딩이라는게 개념이 약했지요.
그래서 ASCII Text파일에는 BOM이 없습니다.
점차 다국어를 지원하기 위해서 유니코드가 등장하고, 유니코드 중에서 UTF-8, UTF-16, UTF-32등 다양한 인코딩방식이 제안되었습니다.
그러다보니 이 파일이 어떤 인코딩을 사용했다하는 정보를 적을 필요가 있겠지요. 그래서 만들어진 것이 바로 BOM입니다.
텍스트 파일의 맨 앞부분에 지정된 패턴을 넣어둠으로써 이를 이용해서 인코딩방식을 감지하는 것이지요.

현재 지정된 표준은 다음과 같습니다.

텍스트 인코딩 BOM
UTF-8 EF BB BF
UTF-16BE FE FF
UTF-16LE FF FE
UTF-32BE 00 00 FE FF
UTF-32LE FF FE 00 00
ASCII no BOM


따라서 텍스트파일을 읽는 프로그램을 작성하는 경우라면 적어도 4바이트 정도 읽어서 특정 패턴이 있는지 없는지를 확인한 다음 처리하면 되겠습니다.

그럼 질문!
아무 내용도 없는 UTF-16 Big Endian형식의 파일 크기는 얼마일까요?
그렇죠. 2바이트입니다.

아무 내용이 없어도(empty string, "") BOM은 들어갑니다.

백문이 불여일견. 확인해 보세요.
메모장을 여시고, 저장할때 '새이름으로 저장'을 선택해서.
인코딩형식을 바꿔보세요. 그리고 탐색기에서 파일 속성창을 열어보세요.

BOM...이제 감이 오시나요?

도움이 되었으면 좋겠군요.
Posted by NeoZest