Эффективное средство нулевого завершения беззнакового буфера символов в функции добавления строки?

Я писал служебный модуль «Byte Buffer» — просто набор функций для личного использования в низкоуровневой разработке.

К сожалению мой 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';
}

Большое спасибо всем, кто внес свой вклад в это.

1

Решение

Похоже, ваша проблема вызвана повреждением памяти.

Вы должны решить следующие три проблемы:

1 проверка, достаточно ли выделенного пространства

if ( destBuffer->capacity < byteLength || destBuffer->length >= sourceLength )

неправильно проверяет необходимость перераспределения буфера,
заменить

if ( destBuffer->capacity <= destBuffer->length+byteLength )

2 выделяя достаточно места

destBuffer->capacity += byteLength;

лучше стать

destBuffer->capacity = destBuffer->length + byteLength + 1;

3 правильно нулевого окончания

destBuffer->data[ destBuffer->length - 1 ] = '\0';

должен стать

destBuffer->data[ destBuffer->length ] = '\0';
2

Другие решения

В C / C ++ список charкончается '\0' это строка Есть набор строковых функций, таких как strcpy(), strcmp(), они взяли char * в качестве параметра, и когда они находят '\0', они там заканчиваются. В твоем случае, printf("%s", buf) обрабатывает buf как строку, поэтому, когда он находит '\0', перестает печатать.

Если вы делаете буфер, это означает, что любые данные включают '\0' нормальные данные в буфере. Поэтому вам следует избегать использования строковых функций. Чтобы напечатать буфер, вам нужно реализовать свою собственную функцию.

2

По вопросам рекламы [email protected]