0

我有一个类型的缓冲区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;
}
4

3 回答 3

3

strlen不适用于二进制数据(长度字段是二进制的)。跟踪实际长度,或5 + strlen(buffer+4)仅用于测量文本部分。

或者,利用您将长度存储在缓冲区中的事实,并从那里读取长度。

于 2013-04-01T19:11:49.937 回答
1

在您的情况下,您不能使用cout直接打印buffer,也不能使用strlen。问题是您正在存储二进制数据。

strlen函数将在缓冲区中找到的第一个 0x00 字节处停止。

cout将为不可打印的值打印垃圾 。

在打印它们之前,您需要将它们转换buffer为十六进制值的 ASCII 版本。

就像是:

for (i = 0; i < BUFFER_SIZE; i ++)
{
    cout << hex << buffer[i];
}
cout << endl;
于 2013-04-01T19:20:22.027 回答
1

strlen 将遍历字符串,直到找到一个空字节 (\0)。您正在尝试组合一个帕斯卡字符串。如果你想使用内置的 strlen,你需要提前指针 sizeof(string_length_type)

于 2013-04-01T19:12:47.017 回答