我有一个char*
类型的缓冲区和一个string
。我想在缓冲区内放置string
长度+ string
。
我编写了以下代码来完成此操作,但它不起作用,因为std::cout<<strlen(buffer)
打印“1”无论我传递什么字符串作为函数的参数。
int VariableLengthRecord :: pack (const std::string strToPack)
{
int strToPackSize = strToPack.length();
if (sizeof(strToPackSize) + strToPackSize > maxBytes - nextByte)
return RES_RECORD_TOO_LONG; // The string is too long
int start = nextByte;
// Copy the string length into the buffer
copyIntToBuffer((buffer+start),strToPackSize);
// Copy the string into the buffer
strcpy((buffer+start+sizeof(strToPackSize)),strToPack.c_str());
// Move the buffer pointer
nextByte += sizeof(strToPackSize) + strToPackSize;
// Update buffer size
bufferSize = nextByte;
std::cout << "Size of buffer = " << strlen(buffer) << std::endl;
return RES_OK;
}
void copyIntToBuffer (char* buffer, int integer)
{
buffer[0] = integer & 0xff;
buffer[1] = (integer >> 8) & 0xff;
buffer[2] = (integer >> 16) & 0xff;
buffer[3] = (integer >> 24) & 0xff;
}
答案 0 :(得分:3)
strlen
不适用于二进制数据(长度字段为二进制)。跟踪实际长度,或使用5 + strlen(buffer+4)
仅测量文本部分。
或者,利用将长度存储在缓冲区内的事实,并从那里读取长度。
答案 1 :(得分:1)
strlen将遍历字符串,直到找到空字节(\ 0)。您正在尝试组合一个pascal字符串。如果你想使用内置的strlen,你需要提前指针sizeof(string_length_type)
答案 2 :(得分:1)
在您的情况下,您无法使用cout
直接打印buffer
,也无法使用strlen
。问题是您正在存储二进制数据。
strlen
函数将在缓冲区中找到的第一个0x00字节处停止。
cout
将为不可打印的值打印垃圾。
在打印之前,您需要将buffer
转换为ASCII版本的十六进制值。
类似的东西:
for (i = 0; i < BUFFER_SIZE; i ++)
{
cout << hex << buffer[i];
}
cout << endl;