C++ 在字符串附加函数中,空终止无符号字符缓冲区的有效方法?
我一直在写一个“字节缓冲区”实用程序模块——只是一组供个人在低级开发中使用的函数 不幸的是,当myC++ 在字符串附加函数中,空终止无符号字符缓冲区的有效方法?,c++,c,buffer,bytearray,null-terminated,C++,C,Buffer,Bytearray,Null Terminated,我一直在写一个“字节缓冲区”实用程序模块——只是一组供个人在低级开发中使用的函数 不幸的是,当myByteBuffer\u Append(…)函数以null结尾终止字符和/或为null结尾字符添加额外空间时,该函数无法正常工作。尝试此操作时的一个结果是,我对缓冲区的数据调用printf()(执行对(char*)的转换):我将只获得字符串的一部分,因为将找到缓冲区中的第一个空终止字符 所以,我想要的是一种在函数中加入某种空终止功能的方法,但我在这方面有点空白,这是一种很好的方法,并且可以在正确的方
ByteBuffer\u Append(…)
函数以null结尾终止字符和/或为null结尾字符添加额外空间时,该函数无法正常工作。尝试此操作时的一个结果是,我对缓冲区的数据调用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';
}
void ByteBuffer\u Append(ByteBuffer\u t*destBuffer,uInt8*source,uInt32 sourceLength)
{
如果(!destBuffer)
{
puts(“[ByteBuffer\u Append]:收到的参数'destBuffer'为空,正在退出…\n”);
返回;
}
如果(!源)
{
puts(“[ByteBuffer\u Append]:接收到的参数'source'为空,正在退出…\n”);
返回;
}
size_t ByTeleLength=sizeof(uInt8)*源长度;
//检查是否需要重新分配缓冲区
if(destBuffer->capacitylength>=sourceLength)
{
destBuffer->capacity+=ByTeleLength;
uInt8*newBuf=(uInt8*)realloc(destBuffer->data,destBuffer->capacity);
如果(!newBuf)
{
Mem_BadAlloc(“ByteBuffer_Append-realloc”);
}
destBuffer->data=newBuf;
}
uInt32 end=destBuffer->length+sourceLength;
//对源数据使用单独的指针作为
//我们将其复制到目标缓冲区中
uInt8*pSource=源;
对于(uInt32 iBuffer=destBuffer->length;iBufferdata[iBuffer]=*pSource;
++pSource;
}
//下面是注释代码
//零终止在哪里
//发生了什么
destBuffer->length+=sourceLength;//+1;
//destBuffer->data[destBuffer->length-1]='\0';
}
非常感谢提供此信息的任何人。在C/C++中,以
'\0'
结尾的字符列表是一个字符串。有一组字符串函数,例如strcpy()
,strcmp()
,它们将char*
作为参数,当它们找到一个'\0'
时,字符串结束于此。在您的例子中,printf(“%s”,buf)
将buf视为字符串,因此当它找到一个“\0”
时,它停止打印
如果正在执行缓冲区,则意味着任何包含'\0'
的数据都是缓冲区中的正常数据。所以你应该避免使用字符串函数。要打印缓冲区,您需要实现自己的功能。在C/C++中,以'\0'
结尾的字符列表是一个字符串。有一组字符串函数,例如strcpy()
,strcmp()
,它们将char*
作为参数,当它们找到一个'\0'
时,字符串结束于此。在您的例子中,printf(“%s”,buf)
将buf视为字符串,因此当它找到一个“\0”
时,它停止打印
如果正在执行缓冲区,则意味着任何包含'\0'
的数据都是缓冲区中的正常数据。所以你应该避免使用字符串函数。要打印缓冲区,您需要实现自己的功能。看起来您的问题是由内存损坏引起的
您必须解决以下三个问题:
1检查分配的空间是否足够
if ( destBuffer->capacity < byteLength || destBuffer->length >= sourceLength )
最好是成为
destBuffer->capacity = destBuffer->length + byteLength + 1;
3正确的空终止
destBuffer->data[ destBuffer->length - 1 ] = '\0';
应该成为
destBuffer->data[ destBuffer->length ] = '\0';
看起来您的问题是由内存损坏引起的
您必须解决以下三个问题:
1检查分配的空间是否足够
if ( destBuffer->capacity < byteLength || destBuffer->length >= sourceLength )
最好是成为
destBuffer->capacity = destBuffer->length + byteLength + 1;
3正确的空终止
destBuffer->data[ destBuffer->length - 1 ] = '\0';
应该成为
destBuffer->data[ destBuffer->length ] = '\0';
因此,您的注释掉的代码没有在正确的位置添加空终止符,或者?该行有什么问题?此检查不正常:如果(destBuffer->capacitylength>=sourceLength)
;应该是length+bytellength>=capacity您不能有字节缓冲区和空终止,除非您的缓冲区不应该包含任何零。当空终止n
由p
指向的字节时,代码应该是p[n]=0
;另外,您没有计算reallock中的0终止字节,因此您注释掉的代码没有在正确的位置添加空终止符,或者?该行有什么问题?此检查不正常:如果(destBuffer->capacitylength>=sourceLength)
;应该是length+bytellength>=capacity您不能有字节缓冲区和空终止,除非您的缓冲区不应该包含任何零。当空终止n
由p
指向的字节时,代码应该是p[n]=0
;此外,您也不计算reallock中的0终止字节。谢谢,这真的很有帮助。太棒了。谢谢,这真的很有帮助。那么,你会建议我用我自己的某种定界符吗?那么,你会建议我用我自己的某种定界符吗?