서명되지 않은 char *가 지적한 메모리 영역의 크기는 얼마입니까?

StackOverflow https://stackoverflow.com/questions/1035222

  •  10-07-2019
  •  | 
  •  

문제

좋아, 나는 이것이 전에 묻는 것을 알고 있지만 검색 후에는 적절한 대답을 찾을 수 없었다.

버퍼 (부호없는 char *)를 Base64로 변환해야합니다.

void Base64Enc(const unsigned char *src, int srclen, unsigned char *dest)

어디 int srclen 의 길이입니다 src 끈.

내 질문은 버퍼의 길이를 어떻게 얻습니까? 아니요, 널 끝나지 않습니다. 아니, 나는 원하지 않는다 sizeof(BYTE). 나는 단지 무엇을 전달 해야할지 알아야합니다 srclen 따라서 해당 버퍼를 Base64로 변환 할 수 있습니다.

편집하다:

다음은 내가하고있는 일을 보여주는 몇 가지 코드입니다.

unsigned char *pBytes;
unsigned char *B64Encoded;
int b64size = 0;

if (pBytes = (unsigned char *) GlobalLock(hMem))
{
    DWORD size = (DWORD)GlobalSize(hMem);
    b64size = size / sizeof(unsigned char);
    Base64Enc(pBytes, b64size, B64Encoded);

    // in this case save the buffer to a file just for testing
    if (fp = fopen("ububub.txt", "wb"))
    {   
        printf("data: %s\n", B64Encoded);
        fwrite(B64Encoded, strlen(B64Encoded), 1, fp);
        fclose(fp);
    }
}
도움이 되었습니까?

해결책

널 종료되지 않았거나 종료되지 않은 경우, 크기를 알 수있는 유일한 방법은 처음에 그것을 얻었을 때 그것을 추적하는 것입니다.

처음에 버퍼를 어떻게 얻습니까? 그것이 무엇이든, 아마도 당신에게 버퍼의 길이를 얻는 방법을 줄 것입니다.

편집하다

귀하의 의견 :

데이터가 취하는 메모리의 크기가 있습니다. 나는 그것을 가지고 놀았지만 그것은 정확한 정보가 아닙니다.

이 경우 원시 크기를 가져 와서 각 요소의 크기로 나누어 요소 수를 얻습니다.

unsigned numelem = size / sizeof(unsigned char)

감사합니다 토드 가드너 그것을 지적하기 위해 크기 (서명되지 않은 숯) 표준에 의해 1으로 정의되므로 버퍼의 요소 수는 버퍼가 사용하는 공간의 양입니다.

"요소 크기별로 나누기"는 모든 유형의 요소에 대한보다 일반적인 솔루션입니다.

다른 팁

불행히도이 질문에 대한 일반적인 답은 실제로 없습니다. C/C ++에서는 특정 포인터가 가리키는 요소의 수를 간단히 알 수 없습니다. 이 지식을 유지하기 위해 포인터를 유지하는 것은 코드의 책임입니다.

포인터의 크기를 아는 가장 가까운 지점 에서이 정보를 삭제해야합니다.

if (pBytes = (unsigned char *) GlobalLock(hMem))

이 경우 전역 메모리 블록에 대한 HMEM 핸들이 있습니다. 이 핸들은 GlobalAlloc () 또는 GlobalRealLoc ()에 대한 호출에 의해 얻어야합니다. 이 전화 중 하나를 만들 때 메모리 크기를 알고 있어야합니다. 이것은 당신이 찾고있는 바이트의 길이입니다.

C 스타일 배열을 사용하면 크기를 이미 알고 있거나 Sentinel이 종료 된 (NULL) 배열이 있어야합니다. 런 타임 컴퓨터는 할당 된 메모리의 양에 액세스 할 수 있지만이를 액세스 할 수있는 안전하고 휴대용 방법은 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top