Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::string存储二进制数据是否不合适?_C++_String_Binary - Fatal编程技术网

C++ 使用std::string存储二进制数据是否不合适?

C++ 使用std::string存储二进制数据是否不合适?,c++,string,binary,C++,String,Binary,我很惊讶地看到,有人修改了一个工作片段,只是因为,正如第二个答案的作者所说: 在我看来,使用二进制数据是不合适的 存储在std::string对象中 是否有理由不这样做?对于二进制数据,我认为最好的选择是std::vector 在技术上可行的情况下使用std::string会向用户发送错误的消息,即正在处理的数据是文本 另一方面,能够接受字符串中的任何字节很重要,因为有时您知道内容是文本,但编码未知。强制std::string只包含有效和解码的文本对于实际使用来说是一个很大的限制 这种限制是我不

我很惊讶地看到,有人修改了一个工作片段,只是因为,正如第二个答案的作者所说:

在我看来,使用二进制数据是不合适的 存储在std::string对象中


是否有理由不这样做?

对于二进制数据,我认为最好的选择是
std::vector

在技术上可行的情况下使用
std::string
会向用户发送错误的消息,即正在处理的数据是文本

另一方面,能够接受字符串中的任何字节很重要,因为有时您知道内容是文本,但编码未知。强制
std::string
只包含有效和解码的文本对于实际使用来说是一个很大的限制


这种限制是我不喜欢
QString
的少数几件事之一:例如,如果文件名的编码“错误”(意外),或者编码实际上无效(包含错误),这种限制使您无法使用文件选择对话框打开文件。

您这样做的原因是什么,不使用,比如说,
std::vector
?在这种情况下,是的:代码段正在工作,为什么要更改它?因为
std::string
可以在C++03中进行写时复制,并在数据块的末尾添加一个
\0
?它不是为存储任意二进制数据块而设计的。它是为了实现字符串的概念而设计的。@juanchopanza COW(由少数人完成,在这里被证明是最糟糕的)在C++11中不再被允许,添加的零终止符如何阻碍我?唯一的好处是在没有真实文本时不使用字符串。@重复数据消除,因为如果要存储二进制数据,通常需要完全控制存储内容。为什么要在末尾添加额外的
\0
?这是没有意义的。也许还要补充一点,他们只能接受正确分类的特定超集,因为他们不支持UTF-8?@Deduplicator:QString不是由字节组成的,而是由unicode字符组成的。问题是,有时无法从字节转换为unicode字符,因为您不知道编码。Linux文件系统编码不可知,因此您可以在同一目录中同时使用iso-8859和utf-8编码的文件名。这当然不是完美的(无论您尝试什么,您都会在屏幕上看到奇怪的字符),但由于无法将文件名存储在字符串中而无法打开文件更糟糕。UTF-8允许您通过假装输入有效来忽略这种情况。好吧,在一个例子中,这只是一个枝节问题,所以不是很重要。@Deduplicator:我指的是unicode,因为QString的限制是它只接受解码文本作为内容。不管是16位还是32位。问题是,有时会向您提供表示无法解码的文本的字节(例如,因为您不知道所使用的编码,或者因为存在编码错误)。对于许多操作来说,这是完全不相关的(例如,将这些字节作为文件名传递给
fopen
),需要解码文本只会造成可用性问题。例如,用qt编写grep将是困难的,因为regexp只与qstring一起工作。