C++ 在C++;

C++ 在C++;,c++,string,casting,byte,stringstream,C++,String,Casting,Byte,Stringstream,我有一些数据必须与特定的数据包协议相匹配。我得到的数据是std::字符串 我需要取一些整数值,并将它们放在字符串中的某些位置。我不想将整数转换为字符串值;我想复制中的实际字节值 例如,如果我的字符串是“abcdefg”,我有一个2字节的短值25,我想放在第一个位置,我不想要“a25defg”。我想要“a”+0x00+0x19+“defg”(请原谅,这是我能想到的最好的方式来说明我想要什么) 有没有使用普通C++字符串的方法?由于系统需求,我不可能在这里使用boost 据我所见,stringstr

我有一些数据必须与特定的数据包协议相匹配。我得到的数据是std::字符串

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

例如,如果我的字符串是“abcdefg”,我有一个2字节的短值25,我想放在第一个位置,我不想要“a25defg”。我想要“a”+0x00+0x19+“defg”(请原谅,这是我能想到的最好的方式来说明我想要什么)

有没有使用普通C++字符串的方法?由于系统需求,我不可能在这里使用boost

据我所见,stringstream可能会有所帮助,但我看到的所有示例都是将number/short/integer转换为ascii版本,这不是我想要的

我可以很容易地用字符数组实现这一点,但我想知道是否可以用字符串实现


谢谢

不建议这样做,但您可以重新解释:

short something = 25;
string something_string(reinterpret_cast<unsigned char*>(&something),
                        sizeof(something));
// something_string == 19 00
short某物=25;
字符串某物(重新解释施法(&S),
(某物)的尺寸;
//something_string==19 00

不过,您需要注意词尾(如
hton

不建议这样做,但您可以重新解释它:

short something = 25;
string something_string(reinterpret_cast<unsigned char*>(&something),
                        sizeof(something));
// something_string == 19 00
short某物=25;
字符串某物(重新解释施法(&S),
(某物)的尺寸;
//something_string==19 00
不过,您需要注意endianess(比如
hton

模板
void cram_helper(无符号长值,char*const dst)
{
char*p=dst+N;
而(p>dst){*--p=value&0xFF;value>>>=8;}
}
样板
无效填充(T,char*dst)
{
cram_助手(t,dst);
}
字符缓冲区[]={“abcdefg”};
短s=25;
cram(s,缓冲器+1);
字符串buffer1=“abcdefg”;
cram和缓冲区[1];

模板
void-cram_-helper(无符号长值、容器和dst、int-initial_索引)
{
char index=初始索引+N;
而(索引>初始索引){dst[--index]=value&0xFF;value>>=8;}
}
样板
空隙填充(T T,容器和dst,尺寸初始指数=0)
{
cram_助手(t,dst,初始索引);
}
std::string buffer2=“abcdefg”;
短s=25;
cram(s,buffer2,1);
模板
void cram_helper(无符号长值,char*const dst)
{
char*p=dst+N;
而(p>dst){*--p=value&0xFF;value>>>=8;}
}
样板
无效填充(T,char*dst)
{
cram_助手(t,dst);
}
字符缓冲区[]={“abcdefg”};
短s=25;
cram(s,缓冲器+1);
字符串buffer1=“abcdefg”;
cram和缓冲区[1];

模板
void-cram_-helper(无符号长值、容器和dst、int-initial_索引)
{
char index=初始索引+N;
而(索引>初始索引){dst[--index]=value&0xFF;value>>=8;}
}
样板
空隙填充(T T,容器和dst,尺寸初始指数=0)
{
cram_助手(t,dst,初始索引);
}
std::string buffer2=“abcdefg”;
短s=25;
cram(s,buffer2,1);

您说使用字符数组很容易,但使用std::strings也很容易

std::string str = "abcdef";
short val = 25;
str[1] = val>>8;
str[2] = val&255;
这是你想要的方式。如果协议是big-endian

编辑:

仅当您要替换字符串中的现有字符时,此操作才有效。要从头开始创建新字符串,或在末尾添加值,请参见Dani的答案。

您说使用字符数组很容易,但使用std::strings也很容易

std::string str = "abcdef";
short val = 25;
str[1] = val>>8;
str[2] = val&255;
这是你想要的方式。如果协议是big-endian

编辑:

仅当您要替换字符串中的现有字符时,此操作才有效。要从头开始创建新字符串,或在末尾添加值,请参见Dani的答案。

有许多因素会影响该问题。第一个问题是协议是否使用
std::string
,因为它是基于文本的协议,或者
std::string
是否滥用
std::vector
,协议是否会处理字符串中的NUL字符?协议中字符串的大小是固定的吗?是的,让我们假设。在这段代码被命中之前检查endianness。问得好。根据协议的定义,字符串的大小是固定的。是的,协议确实需要空字符并且可以处理它们,这也是使用std::string的原因之一。我知道如何使用字符数组来实现这一点。我真的很好奇如何用std::string来完成它。@DavidRodríguez dribeas是的,std::string可以包含
\0
字符。这是std::strings相对于C类型字符串的许多优点之一!协议在备用位置使用大量0x00作为占位符。0x00是合法的。有很多事情会影响这个问题。第一个问题是协议是否使用
std::string
,因为它是基于文本的协议,或者
std::string
是否滥用
std::vector
,协议是否会处理字符串中的NUL字符?协议中字符串的大小是固定的吗?是的,让我们假设。在这段代码被命中之前检查endianness。问得好。根据协议的定义,字符串的大小是固定的。是的,协议确实需要空字符并且可以处理它们,这也是使用std::string的原因之一。我知道如何使用字符数组来实现这一点。我真的很好奇如何用std::string来完成它。@DavidRodríguez dribeas是的,std::string可以包含
\0
字符。这是std::strings相对于C类型字符串的许多优点之一!协议在备用位置使用大量0x00作为占位符。0x00是合法的。不使用char*或char数组是否可以执行此操作?使用对std::string或std::string库的直接访问?这可以在不使用char*或char数组的情况下完成吗?使用对std::string或std::string库的直接访问?这是