1

我有一些必须匹配某个数据包协议的数据。我将所说的数据作为 std::string 获取。

我需要取一些整数值并将它们放在特定位置的字符串中。我不想将整数转换为字符串值;我想复制实际的字节值。

例如,如果我的字符串是“abcdefg”,并且我有一个 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 回答