使用带有 ASCII 26 字符的 istringstream

Using an istringstream With ASCII 26 Character

我有一个相当简单的问题,但我无法在任何地方找到任何帮助,所以我希望得到一些帮助。我正在使用一些 C++ stringstreams 并且我有导致我的流失败的字符串数据。具体来说,当我遇到 Ctrl-Z 字符(26 或 0x1A)时流失败,这并不特别令人惊讶。

首先,我有一个代表图像的数据字符串,从这个意义上说,字符串的每个字节(或字符)都代表某处图像的某些 RGB 值(确切的图像结构并不重要) .从这个字符串,我想重建它所代表的 RGB 值的图像。我采用的方法是将字符串转换为字符串流,以便更好地解析数据,因为开始字节包含我需要的 header 信息。

看起来像这样:

std::string data = getImageData(); // Get the image from somewhere
std::istringstream ss(data);
char byte = ' ';
while (ss.get(byte)) {
   // PROCESS THE BYTE
}

这工作得很好,直到它不可避免地到达某个 ASCII 值为 26 的字节,这通常是一个 EOF 标记,并且流抛出它的标志并将其标记为失败。一旦发生这种情况,流就会终止,我无法再从流中读取数据。我想知道如何绕过这个错误并继续阅读直到流为空。

我有什么Done/Researched

字符串data不在我的控制范围内。我无法更改它的内容,但理论上我可以在检索到它后更改它的值,因为它是原始图像数据的副本。通常,它应该是特定格式的图像数据,因此超出其 header 字节值可以是任何内容,甚至是 ASCII 26。

我看到的许多建议都说用 std::ios::binary 打开流,但这也不起作用。进一步的研究表明,字符串流不存在这种模式,但文件流 存在。理论上,如果数据来自文件流而不是字符串流,那么就不会有问题。不幸的是,数据必须以字符串形式输入,所以这超出了我的控制范围。从那里开始,如果有一种方法可以将字符串流读取为真正的二进制文件,我只是一无所知,我就是想不通。

最大的问题是:有没有办法以二进制模式从字符串流中读取单个字节,这样 ASCII 字符 26 就不会引起问题,或者是否有更好的方法来管理字符串 data 放在第一位,所以这不是问题?

感谢阅读!

我建议完全避免使用 std::istringstream。由于您似乎一次只处理一个字符,因此只需遍历字符串并按您认为合适的方式处理每个字符。

std::string data = getImageData();
for (char ch : data)
{
   // Use ch
}