본문 바로가기

쓰기

LPSTR ConvertHex(LPCSTR source){
    size_t Len=strlen(source);

    char Temp[2048]="";
    BYTE szBuf[3] = { '', };

    int j=0;

    for(size_t i=0;i<Len;i++){

        szBuf[0]=(BYTE) source[i];
        szBuf[1]=(BYTE) source[i+1];

        if(szBuf[0]<0x80){ //1바이트 코드라면
            j += sprintf(Temp+j,"%02X ",szBuf[0]);
        }
        else{ //2바이트라면
            j += sprintf(Temp+j,"%02X%02X ",szBuf[0],szBuf[1]);
            i++;
        }
    }
    LPSTR Temp2=Temp;
    return Temp2;
}

이렇게 완성을 했는데,
출력이 안됩니다.[...]
문제가 있는걸까요
분류 :
Talk
조회 수 :
7561
등록일 :
2008.08.02
20:09:43
엮인글 :
https://arallab.hided.net/3538/5fb/trackback
게시글 주소 :
https://arallab.hided.net/board_devtalk/3538

whoami

2008.08.02
20:34:58

Hide_D군님은 변수의 범위랄까.. scope 라고 하는데.. 그것에 대한 개념이 잡히지 않으셨군요.

int *SomeFunc()
{  // 블럭 1
   int i = 3; // 변수 i 생성
   int *pi = &i;  // pi 는 i 를 가리키는 포인터. 예를 들어 i 가 1000번지에 있다고 하면 pi = 1000 (번지)

   {  // 블럭 2
      int j = 4;  // 변수 j 생성

      {  // 블럭 3
         int i = 5;  // 새로운 변수 i 생성. 이 단계에서 윗부분의 i 와 이 i 는 서로 다름.
        printf("i=%dn", i); // i = 5

      } // 블럭 3의 끝. 이걸 넘어가면서 두번째 i 는 사라짐. 곧 두번째 i 는 블럭 3에서만 통용되는 변수
      printf("i = %dn", i); // i = 3
   }  // 블럭 2의 끝. 이걸 넘어가면 j 는 사라짐.
  
   printf("j = %dn", j); // 에러. j 가 사라졌음.

   return pi;
} // 블럭 1의 끝. 여기서 첫번째 i 는 사라짐.

int main()
{
  int *pi;

  pi = SomeFunc(); // 여기서 pi = 1000 (번지).

  printf("i = %d", *pi); // 분명히 pi 는 1000번지의 i 를 가리키고 있었지만 SomeFunc() 가 끝나는 시점에 i 는 삭제.
  // 따라서 i = 3 이 나올 거라 생각했지만 실제로는 그렇게 나오지 않는다.
}

whoami

2008.08.02
20:39:32
따라서.. 위와 같이 하면 안되고요.

방법 1. static 혹은 전역변수를 사용하는 방법 (비추)
LPSTR ConvertHex(LPCSTR source){
    ....
    static char Temp[2048]=""; // static 변수
    return Temp;
}
혹은
char Temp[2048]; // 전역변수
LPSTR ConvertHex(LPCSTR source){
    ....
    return Temp;
}

방법 2. 버퍼를 부르는 측에서 같이 보내는 방법 (추천)
LPSTR ConvertHex(LPCSTR source, LPSTR Temp)
{
  ...
  return Temp;
}

int main()
{
   char Temp[2048];
   ....
   ConvertHex(source, Temp);
}

Hide_D

2008.08.02
20:41:16
감사합니다. 매번 이것때메 고생하네요

Hide_D

2008.08.02
20:48:12
LPSTR ConvertHex(LPCSTR source,LPSTR complete){
    size_t Len=strlen(source);

    char Temp[2048]="";
    BYTE szBuf[3] = { '', };

    int j=0;

    for(size_t i=0;i<Len;i++){
        szBuf[0]=(BYTE) source[i];
        szBuf[1]=(BYTE) source[i+1];
        if(szBuf[0]<0x80){ //1바이트 코드라면
            j += sprintf(Temp+j,"%02X ",szBuf[0]);
        }
        else{ //2바이트라면
            j += sprintf(Temp+j,"%02X%02X ",szBuf[0],szBuf[1]);
            i++;
        }
    }
    complete=Temp;
    return complete;
}

이렇게 바꿔도 안나오네요;

Hide_D

2008.08.02
20:51:48
... 그냥 complete=Temp를 주면
complete의 포인터가 Temp를 가리켜버리니까
의미가 없는행동이군요.

strcpy(complete,Temp);
return complete;
가 답이군요

whoami

2008.08.02
21:00:05

물론.. 이렇게 해도 됩니다; 단지 complete 가 이미 할당된 버퍼라는 것이 확실하면 일부러 Temp 라는 버퍼를 새로 할당해서 다시 복사할 필요는 특별히 없지요.

whoami

2008.08.02
20:56:49
그러니까..

LPSTR ConvertHex(LPCSTR source,LPSTR complete){

    char Temp[2048]=""; // Temp 변수 (2048개짜리 char 배열) 가 생성

    ... 중략 ...
  
    complete=Temp; // complete 는 Temp 라는 배열을 가리킴
    return complete;  // complete 라는 변수의 내용 (Temp배열이 *있던* 자리를 가리키고 있음) 만 넘겨줌
}  // 여기서 Temp 라는 배열 그 자체가 없어짐 = 중간에 했던 모든 Hex 변환 작업 자체가 사라진다는 뜻임.

고치려면..
LPSTR ConvertHex(LPCSTR source,LPSTR Temp){
    size_t Len=strlen(source);

    // char Temp[2048]=""; // 이걸 지웁니다.
    BYTE szBuf[3] = { '', };

    int j=0;

    for(size_t i=0;i<Len;i++){
        szBuf[0]=(BYTE) source[i];
        szBuf[1]=(BYTE) source[i+1];
        if(szBuf[0]<0x80){ //1바이트 코드라면
            j += sprintf(Temp+j,"%02X ",szBuf[0]);
        }
        else{ //2바이트라면
            j += sprintf(Temp+j,"%02X%02X ",szBuf[0],szBuf[1]);
            i++;
        }
    }
    return Temp;
}

void SomeFunc()
{
    // ... 생략 ...

    char complete[2048] = ""; // 여기서 버퍼의 실체를 생성
    ConvertHex(source, complete);
    // 이제 complete 내에 ConvertHex 내에 작업한 모든 데이타가 담겨있음.
}
List of Articles
번호 제목 글쓴이 조회 수 추천 수 날짜 최근 수정일sort
공지 Talk [필독] 테스트필터 사용시 주의사항 라파에 155439   2008-08-03 2008-12-16 00:03
89 Talk SMSTR 의 부가옵션에 대한 토론.. [4] whoami 3800   2012-02-14 2012-07-12 19:27
ATCode 테스트버전 120207 의 댓글이 너무 복잡하게 꼬여서 이쪽으로 뺍니다. 현재 120207 에서 SMSTR 은 기본적으로 피시님 버전의 OVERWRITE(IGNORE,BUFCHANGE) 모드로만 돌아가도록 만들어져 있습니다. 그런데 피시님께서 부가기능이 필요하시다고 하셨는데...  
88 Archive [소스, 플러그인] ATCode 테스트 버전 120225 file whoami 3212   2012-02-25 2012-06-17 14:31
 
87 Archive [소스, 플러그인] ATCode 테스트 버전 120301 [17] file whoami 3360   2012-03-01 2012-06-17 14:29
 
86 Archive [소스, 플러그인] ATCode 테스트 버전 120304 [1] file whoami 2675   2012-03-04 2012-03-05 05:43
 
85 Archive [소스, 플러그인] ATCode 120310 [14] file whoami 3592   2012-03-10 2012-04-01 01:56
 
84 Archive [소스, 플러그인] ATCode 120401 [1] file whoami 5061   2012-04-01 2012-04-01 08:44
 
83 Talk ATCode 새로운 기능 추가. [5] EroGame 2518   2012-04-01 2012-04-03 19:19
제가 시간만 된다면 약간의 데모스럽게 소스라도 올려드리는데.. 좀 여의치 않군요. 일단 생각한 방안입니다. 예전부터 필요한 기능이라 생각했는데 이래저래 고민 끝에 해결방안이 나왔습니다. 현재 ATCode의 후킹 방식은 한 함수 내에 후킹 지점부터 리턴 포...  
82 Archive ATCTNR (AralTrans) 120407 [1] file whoami 2085   2012-04-07 2012-04-07 23:10
 
81 Archive [소스, 플러그인] ATCode 120407 [9] file whoami 2856   2012-04-07 2012-05-08 15:56
 
80 Talk 어김없이 기능추가 건의입니다. [3] EroGame 1865   2012-04-22 2012-05-05 09:15
그 뭐냐. 스마트 기능이 어째 제대로 빛을 발휘하지 못하고 있습니다. 왜그런가 되돌아서 생각해보니 발더스카이 개조할때 구현한 기능중 하나가 스마트에서 빠졌다는겁니다;; 그래서 요번 기가 사에서 나온 게임들 전부가 에러 팅팅 거리면서 꺼지더군요. OTL...  
79 Talk 픽스라인 추가기능 건의. EroGame 1799   2012-04-29 2012-04-29 15:18
현재 픽스라인에 버그도 버그가 많지만.. 일단 부가적으로 추가할 기능 몇개 끄적여 놓고 갑니다. (까먹을까봐) 1.패턴 중 인자값에서 번역 인자로 지정할때(임의의 길이 설정시) 공백 제거 기능 추가 말 그대로 임의 길이로 지정하여 번역함으로 해놓고 그 부...  
78 Talk LEN 기능에서 체크기능 제거 및 투가기능. EroGame 1766   2012-05-10 2012-05-10 10:37
현재 LEN 기능으로 길이 연산 체크를 할때 -1이나 0의 범위까지 0x00인 NULL 문자로 길이 체크를 하잖아요? 그렇지 않은 경우도 있네요. 길이는 있으나 해당 번역문+길이 위치에 NULL문자가 없는 형태의 길이 교체형태도 추가주세요. (그때는 길이값만 변하도...  
77 Archive [소스, 플러그인] ATCode 120521 [9] file EroGame 2065   2012-05-21 2012-06-10 13:17
 
76 Talk XP에서 번역시 단순에 의한 띄어쓰기 처리... [3] EroGame 1798   2012-05-28 2012-05-30 09:05
xp 에서 간혹 이지트랜스의 단순 딕을 사용시 나오는 하나의 버그가 있습니다. 예를 들면 @np20003이것은 대사입니다.%K 라는 대사가 있다고 가정할때 윈7에서는 필터 없이 그냥 번역을 거처도 앞뒤에 있는 1바이트 명령어에 아무런 변질도 되지 않고 나오게 ...  
75 Talk 스마트와 조금 다른 엔진의 처리...(알고보니 유리스엔진) [3] EroGame 1906   2012-05-30 2012-06-09 23:37
예전에 그 아랄과 최악의 상성으로 불리던 처리 방식이 KLEIN 사의 青空と雲と彼女の恋 여기서도 사용되네요. 그냥 포기할까 하다가... 스마트 방식과는 별개로 처리 방식을 하나 만들어야 될것 같습니다. (아래와 같은 처리를 한걸 여럿 보아왔기 때문에.. 스...  
74 Archive [소스, 플러그인] ATCode 120610 테스트 버전 [5] file EroGame 2067   2012-06-10 2012-06-11 00:17
 
73 Archive [소스, 플러그인] ATCode 120613 [1] file EroGame 1740   2012-06-13 2012-07-12 19:27
 
72 Archive [소스, 플러그인] ATCode 120618 [2] file EroGame 1634   2012-06-14 2012-06-18 00:48
 
71 Talk ATCode에 추가했던 ASLR 있잖아요. [2] EroGame 1767   2012-06-18 2012-08-03 08:38
http://lab.aralgood.com/index.php?document_srl=49989 이때 추가한건데 이거 따로 분리해서 사용 유무 지정하는게 좋을것 같네요. (xp에서는 무반응으로 처리하고) 특정 게임에서 연산중 뻗는 경우 발견되었습니다. 더미다 같은경우는 굳이 연산안들어가고 ...  
70 Archive [소스, 플러그인] ATCode 120725 [22] file EroGame 1702   2012-07-25 2012-07-30 08:14