我有一个external_jpeg_func()在char数组中使用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() );
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:使用字符串传输char数组是否安全?jpeg(或者任何二进制文件格式)是否有可能遇到像'\ 0'这样的字符并导致数据丢失?
Mic*_*yan 10
我的建议是在这种情况下使用std::vector<char>,而不是std::string; 危险std::string在于它提供了一个c_str()函数,并且大多数开发人员都认为a的内容std::string是NUL终止的,即使它std::string提供的size()函数可以返回与你在NUL停止时获得的值不同的值.也就是说,只要你小心总是使用带有size参数的构造函数,并且你小心不要传递.c_str()给任何东西,那么在这里使用字符串没有问题.
虽然使用std::vector<char>over a 没有技术优势std::string,但我认为与其他开发人员进行通信时,内容将被解释为任意字节序列而不是NUL终止的文本内容.因此,我会选择前者以增加可读性.也就是说,我使用了大量std::string用于存储任意字节的代码.事实上,C++ 原型编译器生成了这样的代码(但是,我应该补充一点,我认为这不是我提到的可读性原因的好选择).
std::string不会特别处理空字符,除非您没有给它一个明确的字符串长度.所以你的代码会正常工作.
虽然,在C++ 03中,字符串在技术上不需要存储在连续的内存中.几乎所有std::string你会发现的实现都会以这种方式存储它们,但技术上并不需要它.C++ 11纠正了这一点.
所以,我建议你std::vector<char>在这种情况下使用a .std::string不会给你买任何东西std::vector<char>,而且更明确的是这是一个字符数组而不是可打印的字符串.