C언어 unpack함수 작성요

여리왕자의 이미지

#include <stdio.h>
#include <limits.h>
#include <conio.h>


int pack( char, char, char, char );
void unpack( int, char *, char *, char *, char * );
void bit_print( int );

void main (void) {
	int num=3, i;
	int packed_num = pack('a','b','c','d');
	
	printf("abcd= ");
	
	bit_print( packed_num );
	
	unpack( packed_num, &(packed_num >> CHAR_BIT),  &(packed_num >> CHAR_BIT*2), 
			&(packed_num >> CHAR_BIT*3), &(packed_num >> CHAR_BIT)*4 );
	

	putchar ('\n');
	getch();
}


int pack(char a, char b, char c, char d)
{
	int p = a; 

	p = (p << CHAR_BIT) | b;
	p = (p << CHAR_BIT) | c;
	p = (p << CHAR_BIT) | d;

	return p;
}

void unpack(int p, char *pa, char *pb, char *pc,char *pd ) {
	unsigned mask = 255;

	p & mask;
	p & mask;
	p & mask;
	p & mask;
}

void bit_print( int a )
{
	int i;
	int n = sizeof(int) * CHAR_BIT;
	int mask = 1 << (n - 1);
 
	for (i = 1; i <= n; ++i) {
		putchar(((a & mask) == 0) ? '0' : '1');
		a <<= 1;
		if (i % CHAR_BIT == 0 && i < n)
		putchar(' ');
	}
}

[문제]
-----------------------------------------------------------------------
위에서 나타난 unpack 함수를 전체 바이트들을 한꺼번에
unpack 하도록 다시 작성하라. 4-바이트 워드를 사용하는 컴퓨터인 경우 이 함수는 다음과 같이 시작하게 하라.

void unpack(int p, char *pa, char *pb, char *pc,char *pd)
{
unsigned mask=255;
....

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

위의 소스는 제가 임의로 생각나는 대로 작성했다가 에러가 난 소스인데요... 두 정수를 매개 변수로 받아오는 경우는은 차례로 CHAR_BIT에 1,2,3,4를 곱해서 8bit씩 나눠서 unpack하는것은 알겠거든요...

근데 char의 포인터 값을 받아와서 하라는건... 잘 모르겠네요...
생각나는건... 그냥 각 포인터 매개변수에 int p의 값을 8, 16, 32이렇게... 쉬프트 시킨 주소값을 넘겨 받아서 8bit의 11111111 과 &연산을 해야겠다는 막연한 생각은 나는데요..

포인터의 개념도 제대로 잡혀있지 않은 상태라...

고수님들... 조금만 도와주세요... ㅠㅠ;;

대강 방법이라도...

냐옹이의 이미지

비트연산자에 대해서 별루 관심이 없었는데... 재미있군요.
근데... 꼭 숙제같은 그런 뉘양스가...
unpack함수에서 *가 아니라 &를 써야 하지 않을까요???
main함수에서 받아 쓰실려구 하신다면...
아니라면 void unpack(int)이정도로도 좋지 않을까요???
안에서 for문 써서 쉬프트해줬는데 잘 되더군요.

근데 정수의 가의 가운데 주소를 가져와서 마스크 씌운다는게 좀 이상하네요.
0xff으로 마스크를 씌우면 뒷쪽 8(CHAR_BIT)비트만 가져오게 되는데 앞이 얼마이든 상관이 없지 않나요??? 앞부터 가져오기 할려면 마스크값을 계속 거기에 맞게 변경 시켜줘야 할것 같은데요.
아~ 그리고 포인터에서 +연산을 하면 선언한 형만큼 띄워지는것으로 알고 있는데요. 일정 비트만큼 띄운 주소를 얻기라... 이거 가능한건지 모르겠네요. 아시는분 답변좀... ㅡ,.ㅡ;;; :oops:

------------------------
냐옹~~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.