Я писал «служебный модуль« Байт-буфер »- всего лишь набор функций для личного использования при разработке на низком уровне.Эффективное средство нулевого завершения беззнакового буфера символов в функции добавления строки?
К сожалению, моя функция ByteBuffer_Append(...)
не работает должным образом, когда она завершает символ символа в конце и/или добавляет дополнительную комнату для символа нулевого завершения. Один из результатов, когда это делается, заключается в том, когда я вызываю printf()
на данные буфера (выполняется приведение к (char*)
): я получу только часть строки, так как будет найден первый символ нулевой остановки в буфере.
Итак, то, что я ищу, - это средство включения в функцию какой-то нулевой функции завершения, но я как бы рисую пробел с точки зрения того, что было бы хорошим способом обойти это, и может использовать точку в правильном направлении.
Вот код, если это помогает:
void ByteBuffer_Append(ByteBuffer_t* destBuffer, uInt8* source, uInt32 sourceLength)
{
if (!destBuffer)
{
puts("[ByteBuffer_Append]: param 'destBuffer' received is NULL, bailing out...\n");
return;
}
if (!source)
{
puts("[ByteBuffer_Append]: param 'source' received is NULL, bailing out...\n");
return;
}
size_t byteLength = sizeof(uInt8) * sourceLength;
// check to see if we need to reallocate the buffer
if (destBuffer->capacity < byteLength || destBuffer->length >= sourceLength)
{
destBuffer->capacity += byteLength;
uInt8* newBuf = (uInt8*) realloc(destBuffer->data, destBuffer->capacity);
if (!newBuf)
{
Mem_BadAlloc("ByteBuffer_Append - realloc");
}
destBuffer->data = newBuf;
}
uInt32 end = destBuffer->length + sourceLength;
// use a separate pointer for the source data as
// we copy it into the destination buffer
uInt8* pSource = source;
for (uInt32 iBuffer = destBuffer->length; iBuffer < end; ++iBuffer)
{
destBuffer->data[ iBuffer ] = *pSource;
++pSource;
}
// the commented code below
// is where the null termination
// was happening
destBuffer->length += sourceLength; // + 1;
//destBuffer->data[ destBuffer->length - 1 ] = '\0';
}
Большое спасибо кто внося свой вклад в это.
Так что ваш закомментирована код не добавляет нулевой терминатор в нужном месте или ? В чем проблема с этой линией? – Nobilis
Эта проверка не в порядке: 'if (destBuffer-> capacity length> = sourceLength)'; должен быть длиной + byteLength> = capacity –
bbonev
У вас не может быть байтового буфера * и * null завершения, если только ваш буфер не должен содержать нули. – juanchopanza