Я писал служебный модуль «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 проверка, достаточно ли выделенного пространства
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';
В C / C ++ список char
кончается '\0'
это строка Есть набор строковых функций, таких как strcpy()
, strcmp()
, они взяли char *
в качестве параметра, и когда они находят '\0'
, они там заканчиваются. В твоем случае, printf("%s", buf)
обрабатывает buf как строку, поэтому, когда он находит '\0'
, перестает печатать.
Если вы делаете буфер, это означает, что любые данные включают '\0'
нормальные данные в буфере. Поэтому вам следует избегать использования строковых функций. Чтобы напечатать буфер, вам нужно реализовать свою собственную функцию.