2015-05-03 3 views
2

Я использовал cv::imencode для кодирования cv::Mat, как image/jpeg в vector<uchar> теперь я хочу, чтобы преобразовать этот вектор к типу char *.станд :: вектор <uchar> на символ * потери данных

vector<uchar> buf; 

// print buf to stdout to ensure that data is valid here 
for (auto c : buf) 
    cout << c << endl; 

// cast vector to char 
char *ch = reinterpret_cast<char*>(buf.data()); 

// print out value of char pointer 
for(int i = 0; ch[i] != '\0'; i++) 
    printf("log: %c\n", ch[i]); 

для цикла над вектором берется из this question. Отливка от std::vector<T> до char * взята из this question.

Проблема заключается в том, что при преобразовании типов, по-видимому, наблюдается некоторая потеря данных. В то время как buf содержит действительные данные, я всегда получаю только значение ???? от ch.

Любые идеи, что здесь произошло?

+1

Уверены, что в буфере есть только печатные символы? –

+0

Зачем бросать в 'char *' not 'unsigned char *'? Какие данные находятся в 'buf'? Что вы на самом деле пытаетесь сделать или это просто вопрос интереса? – ilent2

+0

Это часть модуля [cgo] (https://golang.org/cmd/cgo/), который выполняет некоторую обработку изображений с помощью [opencv] (http: // http: //opencv.org). Таким образом, 'buf' содержит это обработанное изображение как jpeg. Однако я думаю, что вставка полного файла будет отвлекать от реальной проблемы. – bodokaiser

ответ

3

Когда вы работаете с вектором, все отлично, так как вектор à представляет собой динамический массив с явным размером. Так может содержит нулевые значения.

Но в дальнейшем вы используете нулевой символ без знака. Таким образом, он останавливается с первым нулевым символом. Это даже явно в вашем коде.

for(int i = 0; ch[i] != '\0'; i++) 
    printf("log: %c\n", ch[i]); 

(соответствующая часть является ch[i] != 0)

Вот почему вы теряете все после первого нулевого символа.

Смежные вопросы