WinAPI CryptBinaryToString без нулевого терминатора - PullRequest
0 голосов
/ 05 августа 2020

Я использую строку как в качестве буфера, так и в качестве вывода для WinAPI CryptBinaryToString. Когда функция записывает в буфер, она записывает дополнительный нулевой терминатор для выделения (и нуждается в нем как таковом).

DWORD size;
CryptBinaryToString(..., &size, ...);

std::string buf;
buf.resize(size);
CryptBinaryToString(..., &buf[0], &size, ...);

return buf.erase(buf.size()-1);

Как я могу его вызвать, чтобы она не пыталась добавить нулевой терминатор ? Это кажется ненужным, поскольку нам предоставлен размер.

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

1 Ответ

0 голосов
/ 05 августа 2020

Невозможно попросить CryptBinaryToString() пропустить вывод нулевого терминатора.

Однако изменение размера std::string для удаления завершающих символов (независимо от того, используете ли вы resize(), erase(), pop_back(), et c) не будет перераспределять данные std::string, он просто уменьшит значение его size(), так что последующие операции с std::string будут игнорировать эти символы в памяти.

Лучшим вариантом является просто опустить нулевой терминатор при первоначальном определении размера std::string. В C ++ 11 и более поздних версиях, по крайней мере, std::string требуется для выделения места для нулевого терминатора, даже если он не включен в size(), а запись в char по индексу size() является четко определен, пока новое значение - только char(0).

DWORD size;
if (!CryptBinaryToString(..., &size, ...)) // <-- size will include the null terminator
{
    // error handling...
}

std::string buf;

if (size > 1) // <-- is not an "empty" (null terminator only) string?
{
    buf.resize(size-1); // <-- ignore the null terminator, though it will still be present in memory

    if (!CryptBinaryToString(..., &buf[0], &size, ...))
    {
        // error handling...
    }
}

return buf;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...