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';
}

非常感谢任何对此提供意见的人。

4

2 回答 2

2

在 C/C++ 中,以 achar结尾的 s列表'\0'是一个字符串。有一组字符串函数,例如strcpy(), strcmp(),它们char *作为参数,当它们找到 a 时'\0',它们的字符串就在那里结束。在您的情况下,printf("%s", buf)将 buf 视为字符串,因此当它找到 a 时'\0',它会停止打印。

如果你正在做一个缓冲区,这意味着任何包含'\0'的数据都是缓冲区中的正常数据。所以你应该避免使用字符串函数。要打印缓冲区,您需要实现自己的功能。

于 2013-07-11T05:18:34.697 回答
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';
于 2013-07-11T05:41:22.883 回答