1

我正在尝试创建一个应用程序,其中 OpenCV 中的 Mat 图像使用cv::imencodebase64 字符串进行编码。为此,我必须将 a 转换vector<unsigned char>为 a 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());

我不认为这应该是另一个问题,因为我的猜测是 vector 到 const unsigned char 之间的转换会弄乱结果;base64_encode上次工作。

4

1 回答 1

3

一个主要问题是:

const char* s = base64_encode(reinterpret_cast<const unsigned char*>(buffer.data()), buffer.size()).c_str();

在这里,base64_encode函数返回一个std::string. 然后调用该c_str()方法,该方法返回一个指向底层缓冲区的指针。但是,std::stringthen 立即超出范围,给您留下一个悬空的指针。

此外,根本不需要 reinterpret_cast。由于悬空指针,您遇到了未定义的行为,这与演员表无关。

你应该把它改成

std::string s = base64_encode(buffer.data(), buffer.size());
于 2013-03-08T14:48:32.633 回答