Каков размер области памяти, на которую указывает беззнаковый символ *?

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

  •  10-07-2019
  •  | 
  •  

Вопрос

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

Мне нужно преобразовать буфер (беззнаковый символ *) в base64, функция 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);
    }
}
Это было полезно?

Решение

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

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

РЕДАКТИРОВАТЬ

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

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

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

unsigned numelem = size / sizeof(unsigned char)

Благодаря Тодд Гарднер за то, что указал на это sizeof(беззнаковый символ) по стандарту определяется как 1, поэтому количество элементов в вашем буфере — это просто объем пространства, который использует ваш буфер.

«Разделение по размеру элемента» — это более общее решение для любого типа элемента.

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top