在C ++中将整数填充/嵌入到字符串中

时间:2012-06-07 20:32:32

标签: c++ string casting byte stringstream

我有一些必须匹配某个数据包协议的数据。我将数据称为std :: string。

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

所以例如,如果我的字符串是“abcdefg”,并且我有一个2字节的短片,其值为25,我想放入第一个位置,我不想要“a25defg”。我想要“一个”+ 0x00 + 0x19 +“defg”(请原谅我。这是我能想到的最好的方式来说明我想要的东西。)

使用常规C ++字符串有一种灵巧的方法吗?由于系统需求,我在这里不可能提升。

从我看到的,stringstream可能会有所帮助,但我看到的所有示例都是将数字/短/整数转换为它的ascii版本,而这不是我想要的。

我可以使用char数组轻松完成此操作,但我想知道我是否可以使用字符串。

感谢。

3 个答案:

答案 0 :(得分:2)

不推荐,但你可以重新解释一下:

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

你需要照顾结束,(如hton

答案 1 :(得分:2)

你说使用char数组很容易,但使用std :: strings也很容易!

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

这可以按照你想要的方式工作。如果协议是big-endian。

修改
仅当您要替换字符串中的现有字符时,此方法才有效。要从头开始创建新字符串,或在结尾添加值,请参阅Dani的答案。

答案 2 :(得分: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);