Каков размер области памяти, на которую указывает беззнаковый символ *? - PullRequest
3 голосов
/ 24 июня 2009

Хорошо, я знаю, что об этом уже спрашивали, но после поиска я не смог найти правильный ответ.

Мне нужно преобразовать буфер (unsigned char *) в base64, использующаяся функция base64 принимает в качестве параметров:

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

, где int srclen - длина строки src.

Мой вопрос: как мне определить длину моего буфера? Нет, это не нулевое окончание. Нет, я не хочу sizeof(BYTE). Мне просто нужно знать, что передать как srclen, чтобы я мог преобразовать этот буфер в base64.

EDIT

Вот код, показывающий, что я делаю:

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);
    }
}

Ответы [ 4 ]

4 голосов
/ 24 июня 2009

Если он не завершен как NULL или что-то завершено, единственный способ узнать размер - это отслеживать его при первом получении.

Как вы получаете буфер в первую очередь? Что бы это ни было, это, вероятно, дает вам метод получения длины буфера.

EDIT

Ваш комментарий:

У меня есть размер памяти, что данные берет. Я пытался играть с этим но это не правильная информация по-видимому.

В этом случае возьмите ваш необработанный размер и разделите его на размер каждого элемента, чтобы получить количество элементов:

unsigned numelem = size / sizeof(unsigned char)

Спасибо Тодду Гарднеру за указание на то, что sizeof (unsigned char) определено стандартом равным 1, поэтому количество элементов в вашем буфере равно количеству пространство, которое использует ваш буфер.

«Деление на размер элемента» является более общим решением для любого типа элемента.

3 голосов
/ 24 июня 2009
if (pBytes = (unsigned char *) GlobalLock(hMem))

В этом случае у вас есть дескриптор hMem для блока глобальной памяти. Этот дескриптор должен быть получен путем вызова GlobalAlloc () или GlobalReAlloc (). При выполнении одного из этих вызовов вы должны знать объем памяти. Это длина байтов, которую вы ищете.

3 голосов
/ 24 июня 2009

К сожалению, на этот вопрос нет общего ответа. В C / C ++ невозможно просто узнать, сколько элементов указывает конкретный указатель. Ответственность за сохранение этих знаний лежит на коде, который поддерживает указатель.

Вам придется пропустить эту информацию из ближайшей точки, где вы знаете размер указателя.

2 голосов
/ 24 июня 2009

С массивом в стиле c вы уже должны знать размер или иметь массив, оканчивающийся на страже (например, NULL). Механизм времени выполнения имеет доступ к количеству выделенной памяти, но нет безопасного и портативного способа доступа к нему.

...