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

strlen は、ヌル バイト (\0) が見つかるまで文字列を調べます。パスカル文字列をまとめようとしています。組み込みの strlen を使用する場合は、ポインター sizeof(string_length_type) を進める必要があります。

于 2013-04-01T19:12:47.017 に答える
1

あなたの場合、coutを直接印刷するために使用bufferすることはできず、どちらも使用できませんstrlen。問題は、バイナリ データを格納していることです。

関数はstrlen、バッファで見つかった最初の 0x00 バイトで停止します。

は、cout印刷できない値のガベージを印刷します。

buffer印刷する前に、16 進値の ASCII バージョンに 変換する必要があります。

何かのようなもの:

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