У меня есть некоторые данные, которые были упакованы с msgpack с использованием API C/C++ следующим образом:Получить указатель и длину элемента в msgpack массив из C/C++
msgpack::sbuffer sbuf;
msgpack::packer<msgpack::sbuffer> pk(&sbuf);
int var1 = 10;
std::string var2 = "test";
double var3 = 3.14159; // could be any type
pk.pack_array(3);
pk.pack(var1);
pk.pack(var2);
pk.pack(var3);
На более позднем этапе мне нужно распаковать этот массив, но нужен прямой доступ к третьему элементу, поэтому я могу сохранить файл/db/redis/memcached/etc. Хотя первые два элемента массива являются фиксированными типами, третий может быть любым типом, приемлемым для msgpack (int, string, vector, map и т. Д.).
size_t off = 0;
msgpack::unpacked result = msgpack::unpack(sbuf.data(), sbuf.len(), off);
msgpack::object obj = result.get();
int var1;
obj.via.array.ptr[0].convert(&var1);
std::string var2;
obj.via.array.ptr[1].convert(&var2);
// now here I want to get a pointer & len to the 3rd item so I can persist
// this value that is already msgpack'd.
const char* dataptr = reinterpret_cast<const char*>(&obj.via.array.ptr[2]);
// now what is the length of the data pointed to by dataptr?
Потенциально я мог бы сделать reinterpret_cast на obj.via.array.ptr [2], как показано выше, но в случае двоичных данных или msgpack'd структуры, простые StrLen() Wouldn» t получить меня длина, и я не вижу, где можно получить длину элемента. Я знаю, что во многих типах существует переменная размера, но не верю, что это точно, когда этот элемент является массивом или картой.
Большое спасибо, это будет работать хорошо для меня. Не передумал разбить массив и использовать смещение, чтобы смотреть мимо него. – mr19