从字符串流中的偏移量读取
Reading from offset in stringstream
我需要将读取的 header 和有效负载拆分为字符串流。
我在字符串流中找到了有效负载的开始位置。
可以通过以下方式阅读 header:
// 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>& std::basic_istream<_CharT, _Traits>::read(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits]'
的参数 1
我猜测 str() 命令 returns 是一个临时命令,由字符串流的内部缓冲区构建。
所以我想我可以将 ssPayload 复制到一个字符串,然后做一个 substr,但是有没有更有效的方法来实现这个,或者 stringstream 是不适合这项工作的工具?
您猜对了,是的,stringstream 是错误的工具。
通常我们读入一个固定的缓冲区,重复将其内容复制到任何你想要的地方,直到所有内容都被读取。
是的,这很糟糕。
您可以使用流迭代器和 std::copy
。
如果数据(header 和有效负载)是文本,则使用普通 std::string
并使用 substr
提取 header 和有效负载。
如果数据是二进制的,那么您可以使用 std::vector<uint8_t>
(或 std::vector<int8_t>
)并使用例如提取数据std::copy_n
。但是,如果数据是二进制的,为什么不简单地使用包含所需确切数据的压缩结构,包括 header(可能使用两种结构,一种用于 header,一种用于有效载荷)?
我需要将读取的 header 和有效负载拆分为字符串流。
我在字符串流中找到了有效负载的开始位置。
可以通过以下方式阅读 header:
// 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>& std::basic_istream<_CharT, _Traits>::read(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits]'
的参数 1
我猜测 str() 命令 returns 是一个临时命令,由字符串流的内部缓冲区构建。
所以我想我可以将 ssPayload 复制到一个字符串,然后做一个 substr,但是有没有更有效的方法来实现这个,或者 stringstream 是不适合这项工作的工具?
您猜对了,是的,stringstream 是错误的工具。
通常我们读入一个固定的缓冲区,重复将其内容复制到任何你想要的地方,直到所有内容都被读取。
是的,这很糟糕。
您可以使用流迭代器和 std::copy
。
如果数据(header 和有效负载)是文本,则使用普通 std::string
并使用 substr
提取 header 和有效负载。
如果数据是二进制的,那么您可以使用 std::vector<uint8_t>
(或 std::vector<int8_t>
)并使用例如提取数据std::copy_n
。但是,如果数据是二进制的,为什么不简单地使用包含所需确切数据的压缩结构,包括 header(可能使用两种结构,一种用于 header,一种用于有效载荷)?