我试图创建一个应用程序,其中OpenCV中的Mat图像使用cv::imencode
编码为base64字符串。为此,我必须将vector<unsigned char>
转换为const unsigned char*
。
我该怎么做?
vector<unsigned char> buffer;
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PXM_BINARY);
compression_params.push_back(0);
if(!cv::imencode(".ppm", desc, buffer, compression_params)){
printf("Image encoding failed");
}
// This generates a error
string output = base64_encode(buffer.data(), buffer.size());
printf("Output: %s", output.c_str());
这是我得到的错误:EXC_BAD_ACCESS (code=1, address=0x2ffd7000)
现在它不再产生任何错误了,但在转换的某个地方出错了;我解码后的输出和输入不一样,它主要由一个字符组成。这是当前脚本:
vector<unsigned char> buffer;
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PXM_BINARY);
compression_params.push_back(1);
if(!cv::imencode(".pgm", desc, buffer, compression_params)){
printf("Image encoding failed");
}
string output = base64_encode(buffer.data(), buffer.size());
printf("Output: %s", output.c_str());
我不认为这应该是另一个问题,因为我的猜测是向量到const unsigned char之间的转换会弄乱结果;
标题>一个主要问题是:
const char* s = base64_encode(reinterpret_cast<const unsigned char*>(buffer.data()), buffer.size()).c_str();
这里,base64_encode
函数返回的是std::string
。然后调用c_str()
方法,该方法返回一个指向底层缓冲区的指针。然而,std::string
随后立即超出作用域,给您留下一个悬空指针。
此外,根本不需要reinterpret_cast。由于悬空指针,您将遇到未定义行为,这与强制转换无关。
应该改成
std::string s = base64_encode(buffer.data(), buffer.size());