C++ 使用ASCII 26字符的istringstream

C++ 使用ASCII 26字符的istringstream,c++,ascii,istringstream,C++,Ascii,Istringstream,我有一个相当简单的问题,但我在任何地方都找不到任何帮助,所以我希望得到一些帮助。我正在使用一些C++ String流,我有字符串数据,导致我的流失败。具体来说,当我遇到Ctrl-Z字符(26或0x1A)时,流失败,这并不特别令人惊讶 首先,我有一个表示图像的数据字符串,从这个意义上说,字符串的每个字节(或字符)表示某个图像的某个RGB值(确切的图像结构并不重要)。从这个字符串中,我想重建它所表示的RGB值的图像。我采用的方法是将字符串转换为stringstream,以便更好地解析数据,因为起始字

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

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

有点像这样:

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

我所做/研究的内容

字符串
数据
超出了我的控制范围。我无法更改它是什么,但理论上,一旦检索到它,我可以更改它的值,因为它是原始图像数据的副本。一般来说,它应该是特定格式的图像数据,因此在其标头之外,字节值可以是任何内容,甚至ASCII 26

我看到的许多建议都说使用
std::ios::binary
打开流,但这也不起作用。进一步的研究表明,stringstreams不存在这种模式,但文件流确实存在这种模式。理论上,如果数据来自文件流而不是stringstream,那么就不会有问题。不幸的是,数据必须以字符串的形式输入,因此这超出了我的控制范围。从那以后,我就不知道是否有办法将stringstream读取为真正的二进制文件,我就是搞不懂

最大的问题是:是否有一种方法可以以二进制模式从stringstream读取单个字节,从而使ASCII字符26不会引起问题,或者是否有一种更好的方法来管理字符串
数据
,使其不成为问题


谢谢你的阅读

我建议完全避免使用
std::istringstream
。因为您似乎一次只处理一个字符,所以只需在字符串上迭代,并根据需要处理每个字符

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

我建议完全避免使用
std::istringstream
。因为您似乎一次只处理一个字符,所以只需在字符串上迭代,并根据需要处理每个字符

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

有趣的是,我无法重现您的问题,无论是Windows上的Visual Studio还是Linux上的Visual Studio。你确定你的分析是正确的吗?我尝试将<代码>数据<代码>直接设置到字符串<代码>“ABC \032 DEF”< /代码>(嵌入的ASCII 26),并且读取流不会在中间停止。是否已经在字符26处截断了
数据
?或者循环体终止于该字符?在任何情况下,您似乎可以直接使用字符串,而不是通过流(如其中一个答案中所建议的那样)。@DanielJunglas直接使用字符串似乎更可取。如果我错了,请纠正我;
\0
不是ASCII 0的空字符吗?我遇到了一个关于替代角色的问题。@JoshB<代码>\032是八进制
32
即十进制
26
@dxiv Oops!我的错。谢谢有趣的是,我无法重现您的问题,无论是Windows上的Visual Studio还是Linux上的Visual Studio。你确定你的分析是正确的吗?我尝试将<代码>数据<代码>直接设置到字符串<代码>“ABC \032 DEF”< /代码>(嵌入的ASCII 26),并且读取流不会在中间停止。是否已经在字符26处截断了
数据
?或者循环体终止于该字符?在任何情况下,您似乎可以直接使用字符串,而不是通过流(如其中一个答案中所建议的那样)。@DanielJunglas直接使用字符串似乎更可取。如果我错了,请纠正我;
\0
不是ASCII 0的空字符吗?我遇到了一个关于替代角色的问题。@JoshB<代码>\032是八进制
32
即十进制
26
@dxiv Oops!我的错。谢谢或者,如果存储是一个普通的旧字符数组,只需
for(inti=0;data[i];i++){…}
看起来使用普通字符串是一种方法。出于好奇,既然我很天真,stringstream比普通的字符串有什么优势?如果我们从网络或类似的地方读取数据,它是否提供了更好的方法?因为从这个角度看,解析字符串流似乎只会让我们头疼。@JoshB。如果您希望收到一个字符串,该字符串可以包含您需要读取的数字,那么最好使用
istringstream
。您不想编写代码来解析应用程序中的传入字符串。让
istringstream
为您处理好它。@RSahu太棒了,非常感谢!或者,如果存储是一个普通的旧字符数组,只需
for(inti=0;data[i];i++){…}
看起来使用普通字符串是一种方法。出于好奇,既然我很天真,stringstream比普通的字符串有什么优势?如果我们从网络或类似的地方读取数据,它是否提供了更好的方法?因为从这个角度看,解析字符串流似乎只会让我们头疼。@JoshB。如果您希望收到一个字符串,该字符串可以包含nu