Невозможно попросить 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;