2012-04-18 6 views
0

처음에이 uint8_t 배열을 char 배열로 변환하고 싶습니다. 나는이 문제를 해결하려고 조금 더 붙어 있었다. 나의 첫 번째 대안은 다른 유형의 값을 임시 값으로 복사하고 tmp 값을 쓰기 가능한 char으로 복사 한 다음 메모리에서 tmp 값을 제거하는 것입니다. 그런데 블레이크 해시 함수를 동반하는 데 사용됩니다. 여기 내 코드는 다음과 같습니다 uint8_t 배열을 C의 문자 배열로 변환

char * bl(char *input) 
{ 
    uint8_t output[64]; 
    char msg[]= ""; 
    char *tmp; 

    int dInt; 

    memset(output,0,64); 
    tmp = (char*) malloc(64); 
    if (!tmp){ 
      exit(1); 
    } 

    dInt = strlen(input); 

    if (dInt > 0xffff){ 
      exit(1); 
    } 
    uint8_t data[dInt]; 

    memset(data,0, dInt); 
    strlcpy(data,input,dInt); 
    uint64_t dLen =dInt; 
    blake512_hash(output, data,dLen); 

    int k; 
    for (k=0;k<64;k++){ 
      tmp[k] = output[k]; //does this "copy" is buggy code? 
    } 

    memcpy(msg, tmp,64); 
    //so here I can to delete tmp value 
    // I dont want there were left unused value in memory 
    // delete tmp; 
    free(tmp); 

    return msg; 
} 

나는 위의 코드는 여전히 효율적이지라고 생각합니다, 그래서 당신의 의견, 힌트 및 수정 프로그램은 무엇인가? 대단히 감사합니다!

답변

5

우선 변수가 함수가 종료 될 때까지 소멸되므로 로컬 변수에 대한 포인터를 반환하면 안됩니다. 출력 배열을 bl 함수에 전달하고이를 사용하여 문자열을 출력해야합니다.

대부분의 경우 (일반적으로 uint8_t IS char 인 경우) memcpy(msg, output, 64)이면 충분합니다. 만약 당신이 그것에 대해 엄격하게하고 싶다면 (blake512_hashchar 배열을 출력으로 항상 기대하고 있다면 은 uint8_t 배열을 반환하지 않아야한다.) for 루프에서 msg[k] = (char)tmp[k]을 호출하고 memcpy을 제거하면된다.

+0

나중에이 함수를 사용하여 파이썬에서 호출하고자합니다.이 함수가 나중에 문자열 값을 반환 할 것으로 기대하고 있습니다. – hafidh

+0

@ user1309539 예.하지만 내 대답에서 언급 한 문제를 해결해야합니다. 포인터를 로컬 변수로 리턴 할 수 없습니다. – JosephH

+0

이면 tmp 변수는 쓸모가 없습니다. tmp 변수는 출력 된 것이 아니라 char 만 할당 되었기 때문에 tmp 변수에서 복사 할 대상은 무엇입니까? – hafidh

0

여기서 많은 부분이 잘못되었습니다.

dInt = strlen(input) + 1; // dInt is the size of the string including the terminating '\0'. 

실제로 strlen이 아닌 크기를 사용합니다.

msg = tmp; tmp를 해제하지 않습니다. msg는 const char * ""(C++ 용어로)입니다.

+0

음, 네. 고맙습니다. 더 이상 다시 틀린, 위의 코드에 대한 귀하의 제안을주세요, 감사합니다 :) – hafidh

관련 문제