가령 char는 1바이튼데, int 는 4바이트다. 아직까지 4바이트 워드인 컴터가 많으니까, char 형 데이타 네개를 묶어서 int로 처리하면 한번에 처리할수 있다.

char 형이 int 로 승격될때, 4바이트 중에 하위 1바이트에 들어가기 때문에, 비트연산자로 8비트씩 위로 밀어주면서 글자를 넣어주면 된다.

언패킹 할때도 마찬가지다. int에서 char형으로 캐스트되면 하위1바이트만 받아들인다.

따라서, 간단히 생각할때, 언패킹하는 함수를 만들자면, 패킹된 int 와, 몇번째 바이트를 꺼낼지를 나타내는 수를 하나 받아서, 원하는 바이트가 하위바이트로 오도록 하면된다.

---------------------------------------------------------------------------------------------

예. packing

int pack;

pack = 'm';
pack = ( pack << 8 ) | 'a' ;
pack = ( pack << 8 ) | 't' ;
pack = ( pack << 8 ) | 'h' ;


이제, pack 을 이진수로 찍어보면 다음과 같다.

01101101 01100001 01110100 01101000
이것은 m a t h 의 아스키코드들이다.


언패킹 하는 함수는 간단히 다음과 같이 만들수 있다.

char unpack(int p,int k)
{
       return ( p>>((4-k)*8) );
}


마스크를 써도 되는데, 이때는 마스크를 8개의 연속하는 1 ( 즉, 1바이트 모두가 1 ) 과 나머지 3바이트의 0 으로 마스크를 만든다. 그리고 비트이동 연산자를 사용해서비트이동 연산자를 사용해서 꺼내고자 하는 바이트위로 8개의 1이 위치하도록 만들고, 비트 논리곱을 쓰면, 해당 바이트는 그대로 유지가 되고 나머지 바이트는 0으로 없어진다. 그리고 다시 해당바이트를 최하위 바이트로 이동시켜서 char 로 리턴시키면 된다.

어차피 값에의한 호출을 하기때문에 함수의 몸체안에서 쓸데없는 값을 다 0으로 없애도 원래의 퍀킹된 정보는 손실되지 않는다.

아래 그림은, int 변수 하나에 문자 네개 m, a, t, h 를 패킹한후에, 위의 언패킹 함수로 각각 꺼낸모습이다.

사용자 삽입 이미지



----------------------------------------------------------------------------------------------------

다중바이트 문자
위에서, 1바이트 char 형 문자4개를,  4바이트 int 형에 패킹하는 모습을 보았다.
ANSI C 에서는 다중바이트 문자로 이러한 패킹을 직접 제공한다.

가령, int a = 'math' ;  라고 하면, 'm' , 'a', 't', 'h' 가 패킹된다.

패킹방식은 시스템 의존적이다. 내 경우에는 'math' 에서 m 부터 하위바이트로 들어가서 상위로 밀어내며 이후 문자들을 패킹되는 것을 확인할 수 있었다. 즉, 위의 실행결과와 같았다. 가령, a = 'mat' 라고 하면, 하위 3개 바이트에 패킹되었다.

사이즈보다 큰 다중바이트 문자가 패킹시도되면 에러가 난다.