使用带有 ASCII 26 字符的 istringstream

问题描述

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

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

看起来像这样:

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 标记,并且流抛出它的标志并将其标记为失败。一旦发生这种情况,流将终止,我无法再从流中读取数据。我想知道如何绕过此错误并继续阅读,直到流为空。

我做了什么/研究了什么

字符串 data 超出了我的控制范围。我不能改变它是什么,但理论上我可以在检索到它后改变它的值,因为它是原始图像数据的副本。一般来说,它应该是特定格式的图像数据,所以除了它的头之外,字节值可以是任何东西,甚至是 ASCII 26。

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

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

感谢阅读!

解决方法

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

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