我需要将我读过的标题和有效负载拆分成字符串流。
我在字符串流中找到了有效载荷开始的位置。
可以通过以下方式读取标题:
// where ss is the source stringstream
ssHeader.read(ss.str(), nDataStartPos-1);
现在我想将余数读入有效载荷字符串流。
ssPayload.read(ss.str()+nDataStartPos, nTotalBytesRed);
此操作失败,并出现以下错误:
错误:从'const char *'无效转换为'char *'
初始化'std :: basic_istream< _CharT,_Traits>&的参数1 std :: basic_istream< _CharT,_Traits> :: read(_CharT *,std :: streamsize)[with _CharT = char,_Traits = std :: char_traits]'
我猜测str()命令返回一个临时的,从stringstream的内部缓冲区构造。
所以我想我可以将ssPayload复制到一个字符串,然后做一个substr,但有没有更有效的方法来实现这个,或者stringstream是错误的工具?
答案 0 :(得分:2)
你猜错了,是的,字符串流是错误的工具。
一般来说,我们会读入固定缓冲区,反复将其内容复制到您想要的内容中,直到读完所有内容。
是的那种糟透了。
您可以使用流迭代器和std::copy
。
答案 1 :(得分:1)
如果数据(标头和有效负载)是文本,则使用普通std::string
并使用substr
来提取标头和有效负载。
如果数据是二进制的,那么您可以使用std::vector<uint8_t>
(或std::vector<int8_t>
)并使用例如数据提取数据std::copy_n
。但是,如果数据是二进制的,为什么不简单地使用包含所需精确数据的打包结构,包括标题(可能使用两个结构,一个用于标题,一个用于有效负载)?