Я хочу сохранить изображение JPEG в Redis как одну пару ключ-значение. Из OpenCV я получаю std::vector<unsigned char> jpeg
от imencode()
Теперь я конвертирую этот вектор в std::string
и SET
с помощью Hiredis. Проблема в том, что вектор jpeg
содержит NUL
символов (ANSII == 0
), а функция Hiredis SET
получает value.c_str()
. .c_str()
усекает строку после первого вхождения NUL
, поэтому в БД сохраняется только эта подстрока.
Мой вопрос: как я могу SET
и GET
std::vector<unsigned char>
(содержащий NUL
) с Hiredis? (Минимизация времени выполнения имеет решающее значение.)
Вот мой код:
// Create vector of uchars, = From CV [Disregard inefficiency here]
std::vector<unsigned char> jpeg;
jpeg.push_back( 'a' );
jpeg.push_back( 'b' );
jpeg.push_back( (unsigned char) 0 );
jpeg.push_back( 'c' );
jpeg.push_back( 'd' );
// Convert to string
std::string word = "";
for (int i=0; i<jpeg.size(); ++i)
{
word.push_back(jpeg[i]);
}
std::cout << "word = " << word << std::endl;
std::cout << "word.c_str() = " << word.c_str() << std::endl;
// connect redis
std::string hostname = "127.0.0.1";
int port = 6379;
timeval timeout = { 1, 500000 }; // 1.5 seconds
redisContext* context = redisConnectWithTimeout(hostname.c_str(), port, timeout);
// set redis
std::string key = "jpeg";
redisReply* reply = (redisReply *)redisCommand(context, "SET %s %s", key.c_str(), word.c_str() );
freeReplyObject( (void*) reply);
// get redis
reply = (redisReply *)redisCommand(context, "GET %s", key.c_str() );
std::string value = reply->str;
freeReplyObject((void*) reply);
std::cout << "returned value = " << value << std::endl;
// Convert back to vector of uchars (this should be the same as the original jpeg) [Disregard inefficiency here]
std::vector<unsigned char> jpeg_returned;
for (int i=0; i<value.size(); ++i)
{
jpeg_returned.push_back(value[i]);
// std::cout << "value[i] = " << value[i] << std::endl;
}
std::string
может хранить произвольные данные, вы действительно не можете использовать строковые функции при работе с двоичными данными (что и представляет собой изображение JPEG). Разве в Redis нет какого-то двоичного типа blob? - person Some programmer dude   schedule 15.03.2017c_str()
, который усекает строку, это функции, которым вы даетеc_str()
, которые останавливаются на первом NULL. См. документацию по c_str(). Например, ваше использованиеcout
не будет работать таким образом, так как вам нужно будет использоватьcout.write(word.c_str(), word.size())
для правильного вывода всей строки. - person PaulMcKenzie   schedule 15.03.2017