2013-07-11 4 views
1

Я писал «служебный модуль« Байт-буфер »- всего лишь набор функций для личного использования при разработке на низком уровне.Эффективное средство нулевого завершения беззнакового буфера символов в функции добавления строки?

К сожалению, моя функция 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'; 
} 

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

+0

Так что ваш закомментирована код не добавляет нулевой терминатор в нужном месте или ? В чем проблема с этой линией? – Nobilis

+0

Эта проверка не в порядке: 'if (destBuffer-> capacity length> = sourceLength)'; должен быть длиной + byteLength> = capacity – bbonev

+0

У вас не может быть байтового буфера * и * null завершения, если только ваш буфер не должен содержать нули. – juanchopanza

ответ

2

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

Вы должны исправить следующие три задачи:

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'; 
+0

Awesome. Спасибо, это действительно помогло. – zeboidlund

2

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

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

+0

Вы бы порекомендовали мне придумать мой собственный разделитель какого-то рода? – zeboidlund

 Смежные вопросы

  • Нет связанных вопросов^_^