我有一些必须匹配某个数据包协议的数据。我将数据称为std :: string。
我需要取一些整数值并将它们放在某些位置的字符串中。我不想将整数转换为字符串值;我想复制实际的字节值。
所以例如,如果我的字符串是“abcdefg”,并且我有一个2字节的短片,其值为25,我想放入第一个位置,我不想要“a25defg”。我想要“一个”+ 0x00 + 0x19 +“defg”(请原谅我。这是我能想到的最好的方式来说明我想要的东西。)
使用常规C ++字符串有一种灵巧的方法吗?由于系统需求,我在这里不可能提升。
从我看到的,stringstream可能会有所帮助,但我看到的所有示例都是将数字/短/整数转换为它的ascii版本,而这不是我想要的。
我可以使用char数组轻松完成此操作,但我想知道我是否可以使用字符串。
感谢。
答案 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);