我正在尝试创建一个应用程序,其中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)
现在它不再产生任何错误,但在转换的某个地方出了问题;输出与我解码后的输入不一样,它主要由A字符组成。这是当前的脚本:
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之间的转换会导致结果混乱; base64_encode上一次工作。
答案 0 :(得分:3)
一个主要问题是:
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());