메모리 직접 접근의 유용성 (memcpy)


Before
전형적인 막장짓..
초기화 -> 거꾸로 값 받아서 배열에 삽입 -> 포맷에 맞게 sprintf를 써서 -> 문자열로 만들고
-> 그걸다시 sscanf써서 -> 정수로 변환후 -> 리턴..
unsigned int  atox(char *string)

     unsigned int ret;

     sscanf(string,"%x",&ret);

    return ret;
}

 unsigned int get_value(unsigned char *segment,int offset,int size)
{
    int i;
    char temp[size * 2 + 1];
    unsigned char dt[size];
    temp[size * 2] = '\0';

    for(i = 0;i < size;i ++)
        /* 리틀 엔디언 */
        dt[size - i - 1] = *(segment + offset + i);

    if(size == 1)
        sprintf(temp,"%02x",dt[0]);
    else if(size == 2)
        sprintf(temp,"%02x%02x",dt[0],dt[1]);
    else if(size == 3)
        sprintf(temp,"%02x%02x%02x",dt[0],dt[1],dt[2]);
    else if(size == 4)
        sprintf(temp,"%02x%02x%02x%02x",dt[0],dt[1],dt[2],dt[3]);

    return atox(temp);
}

After
몰라 걍 직접 집어넣어 버려....; 왜 진작 이걸 생각 못했을까?
역시 메모리에 직접 접근해서 하는게 더 편하다.
unsigned int get_value(unsigned char *segment,int offset,int size)
{
    int ts = 0;
  
    memcpy(&ts,segment + offset,size);

    return ts;
}

비슷하게 잘 작동하는듯 하다.... 좀 이상한가... 바꾸고 나니 왠지 불안하다...
값은 제대로 찍히는거 같은데.................

아 size가 클경우 overflow가 일어날수도 있을거 같은데.. 그거 처리도 해야하나?
근데...귀차나연...ㅋ
Trackback 0 Comment 3
  1. Favicon of http://blog.naver.com/khmirage.do BlogIcon 환상경 2007.07.02 07:12 address edit & del reply

    엔디안!!!
    전 엔디안 아무리봐도 이해가 안되던데 T^T

    • lowid 2007.07.03 00:44 address edit & del

      저도 엔디언이 cpu가 읽는 순서차이인거 밖에 몰라요..
      Big은 우리들이 읽는 순서 Little은 그 반대..
      저의 지식은 여기까지..(근데 이것도 맞는건가?)

    • Favicon of https://heizelnut.tistory.com BlogIcon Heizelnut 2007.07.08 20:56 신고 address edit & del

      제가 알기로도
      Big은 정상 입력 Little은 거꾸로
      빅 엔디언은 ABC 이면 CPU에서 읽는것도 ABC고
      리틀 엔디언은 CBA 로 CPU가 읽는다고 알고있음.ㅋ

      putchar(); 함수로 ABC 출력해보면 빅이면 A만 나오고
      리틀이면 C가 출력되겠죠.ㅋㅋ

prev 1 ··· 8 9 10 11 12 13 14 15 16 ··· 22 next