Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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

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++ C++;:使用std::字符串在内存中移动jpeg是否安全?_C++_String_Jpeg - Fatal编程技术网

C++ C++;:使用std::字符串在内存中移动jpeg是否安全?

C++ C++;:使用std::字符串在内存中移动jpeg是否安全?,c++,string,jpeg,C++,String,Jpeg,我有一个external\u jpeg\u func(),它接受字符数组中的jpeg数据来处理它。我无法修改此函数。为了向其提供char数组,我执行了如下操作: //what the funcs take as inputs std::string my_get_jpeg(); void external_jpeg_func(const char* buf, unsigned int size); int main () { std::string myString = my_get

我有一个
external\u jpeg\u func()
,它接受字符数组中的jpeg数据来处理它。我无法修改此函数。为了向其提供char数组,我执行了如下操作:

//what the funcs take as inputs
std::string my_get_jpeg();
void external_jpeg_func(const char* buf, unsigned int size);


int main ()
{
    std::string myString = my_get_jpeg();
    external_jpeg_func(myString.data(), myString.length() );
}

我的问题是:使用字符串传输字符数组是否安全?jpeg(或者任何二进制文件格式)是否有遇到“\0”这样的字符并导致数据丢失的风险?

我认为最好使用字符数组char[]或std::vector。这是保存图像的标准方法。当然,二进制文件可能包含0个字符。

std::string
不会特别处理空字符,除非您没有为其指定明确的字符串长度。因此,您的代码可以正常工作

尽管在C++03中,字符串在技术上不需要存储在连续内存中。实际上,您会发现几乎每个
std::string实现都会以这种方式存储它们,但这在技术上不是必需的。C++11纠正了这个问题


因此,我建议您在本例中使用
std::vector
std::string
std::vector
上买不到任何东西,更明确的是,这是一个字符数组,不可能是可打印的字符串。

在这种情况下,我的建议是使用
std::vector
,而不是
std::string
std::string
的危险在于它提供了一个
c_str()
函数,大多数开发人员都认为
std::string
的内容是NUL终止的,即使
std::string
提供了一个
size()
函数,该函数返回的值可能与在NUL停止时得到的值不同。也就是说,只要您始终小心地使用接受大小参数的构造函数,并且小心地不将
.c_str()
传递给任何对象,那么在这里使用字符串就没有问题


虽然使用
std::vector
比使用
std::string
没有任何技术优势,但我觉得它能更好地与其他开发人员沟通,将内容解释为任意字节序列,而不是以NUL结尾的文本内容。因此,为了增加可读性,我会选择前者。也就是说,我使用了大量使用
std::string
存储任意字节的代码。事实上,C++生成了这样的代码(虽然我应该补充,我认为这不是一个很好的选择,因为我提到的可读性)。可能但这是误导。如果您只需要一个连续的字节缓冲区,我建议使用向量。从char*加载时,字符串将停止在空字符处,因此不安全。@Dani:如果给定了显式长度,则不安全。@okorz001直到我阅读了其他答案后才明白您的意思@Dani@Nicolabolas我知道给它一个明确的长度很重要。但是,如果字符数组中的某个地方碰巧有空字符,则通常的
string.length()
strlen()
方法似乎会失败。有什么提示吗?@Morpork:
strlen
在处理可能包含nul字符的二进制数据时不应被视为“常用方法”。这就是为什么显式长度很重要,因为
strlen
只告诉你第一个数字的位置。+1:但我更喜欢
std::vector
char
仍然传达一些与字符相关的语义(glyph,text),而
无符号char
更接近于
字节
的概念。@6502:如果您使用的API是按照
char
来指定的,您只需咬紧牙关……@6502,在这种情况下我不同意;大多数需要字节缓冲区的POSIX函数采用“char*”或“void*”类型;这种函数采用“unsigned char*”类型的情况非常少见。为了避免潜在的混淆或危险的强制转换,我更愿意与这些保持一致,并使用“char”。@Matthieu,Micheal Aaron Safyan:我错过了一个部分,它说,
外部jpeg_函数
不能被触摸。当然,如果它想要一个
char*
,那么
std::vector
是我的最佳选择。@6502:是的,不幸的是,在
char
中指定了这么多“字节”API,当
char
可以根据编译器的设置进行签名或取消签名时:/std::vector的规范实际上规定,对象内部的内存必须是连续的。如果你有一个std::vector图像(10);然后使用“&image[0]”返回一个至少10字节长的内存数组。假设说来,我创建了一个jpeg图像向量,一个接一个地输入到
external\u jpeg\u func()
中。建议使用字符向量吗?