1

特定のパケット プロトコルに一致する必要があるデータがあります。上記のデータを std::string として取得しています。

いくつかの整数値を取り、特定の場所の文字列に入れる必要があります。整数を文字列値に変換したくありません。実際のバイト値をコピーしたい。

たとえば、私の文字列が「abcdefg」で、1 番目の位置に配置したい 25 の値を持つ 2 バイトのショートがある場合、「a25defg」は必要ありません。"a" + 0x00 + 0x19 + "defg" が必要です (そのことを許してください。これが、私が望むものを説明するための最良の方法でした)。

通常の C++ 文字列を使用してこれを行う巧妙な方法はありますか? システム要件のため、ここではブーストは可能ではありません。

私が見たところ、stringstreamが役立つかもしれませんが、私が見るすべての例は、数値/短/整数をASCIIバージョンに変換していますが、それは私が望むものではありません.

これはchar配列で簡単に実行できますが、文字列で実行できるかどうか疑問に思っていました。

ありがとう。

4

3 に答える 3

2

推奨されませんが、再解釈できます。

short something = 25;
string something_string(reinterpret_cast<unsigned char*>(&something),
                        sizeof(something));
// something_string == 19 00

ただし、エンディアンに注意する必要があります(のようにhton

于 2012-06-07T20:36:03.290 に答える
2

char 配列を使うと簡単だとおっしゃっていますが、std::strings でも同じくらい簡単です。

std::string str = "abcdef";
short val = 25;
str[1] = val>>8;
str[2] = val&255;

それはあなたが望むように機能します。プロトコルがビッグエンディアンの場合。

編集:
これは、文字列内の既存の文字を置き換えたい場合にのみ機能します。新しい文字列を最初から作成するか、最後に値を追加するには、Dani の回答を参照してください。

于 2012-06-07T20:39:20.297 に答える
0
template<size_t N>
void cram_helper( unsigned long long value, char* const dst )
{
    char* p = dst + N;
    while (p > dst) { *--p = value & 0xFF; value >>= 8; }
}

template<typename T>
void cram( T t, char* dst )
{
    cram_helper<sizeof(T)>(t, dst);
}

char buffer[] = { "abcdefg" };
short s = 25;
cram(s, buffer+1);

string buffer1 = "abcdefg";
cram(s, &buffer[1]);

template<size_t N, typename Container>
void cram_helper( unsigned long long value, Container& dst, int initial_index )
{
    char index = initial_index + N;
    while (index > initial_index) { dst[--index] = value & 0xFF; value >>= 8; }
}

template<typename T, typename Container>
void cram( T t, Container& dst, size_t initial_index = 0 )
{
    cram_helper<sizeof(T)>(t, dst, initial_index);
}

std::string buffer2 = "abcdefg";
short s = 25;
cram(s, buffer2, 1);
于 2012-06-07T20:38:18.517 に答える