将东西复制到char *

时间:2013-04-01 19:09:25

标签: c++ string char

我有一个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;
}

3 个答案:

答案 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;