gpt4 book ai didi

c++ - 从 C/C++ 获取指向 msgpack 数组中元素的指针和长度

转载 作者:行者123 更新时间:2023-11-30 03:48:18 29 4
gpt4 key购买 nike

我有一些使用 C/C++ api 使用 msgpack 打包的数据,如下所示:

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);

稍后我需要解压缩该数组,但需要直接访问第三个元素,以便我可以持久保存到 file/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?

如上所示,我可能可以在 obj.via.array.ptr[2] 上执行 reinterpret_cast,但是对于二进制数据或 msgpack 的结构,简单的 strlen() 不会让我得到长度,我看不到从哪里获取项目的长度。我知道许多类型都有一个大小变量,但当该项目是数组或映射时,我不相信这是准确的。

最佳答案

这是 msgpack-c 的内存模型: https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_unpacker#memory-management

I know there is a size variable in many of the types but don't believe this is accurate when that item is an array or map.

没错。 obj 已经解压。不适合执着。我认为直接存储 msgpack 格式的二进制数据是更好的方法。首先,将 msgpack 分为前两个和第三个。然后,将前两个打包为一个数组。最后,简单地打包第三个值。即打包过程。

    pk.pack_array(2); // for the first two
pk.pack(var1);
pk.pack(var2);
pk.pack(var3); // for the thrid one

解包时,解包前两个带偏移量的数据。

    // Unpacking
size_t off = 0;
msgpack::unpacked result = msgpack::unpack(sbuf.data(), sbuf.size(), off);
// off has been set

解包后,offset已经设置好了。这样就可以得到第三个数据的起点。然后,存储msgpack格式的二进制数据。

    std::string store; // file/db/redis/memcached/etc
std::copy(sbuf.data() + off, sbuf.data() + sbuf.size(), std::back_inserter(store));

即存储过程。

当您从存储中获取 msgpack 格式的二进制数据时,解压缩它们。

这是一个完整的代码示例:

#include <msgpack.hpp>

#include <iostream>
#include <string>
#include <algorithm>

int main() {
msgpack::sbuffer sbuf;
msgpack::packer<msgpack::sbuffer> pk(&sbuf);

int var1 = 10;
std::string var2 = "test";
double var3 = 3.14159; // could be any type

// Separate the data into the two msgpacks
pk.pack_array(2); // for the first two
pk.pack(var1);
pk.pack(var2);
pk.pack(var3); // for the thrid one

// Unpacking
size_t off = 0;
msgpack::unpacked result = msgpack::unpack(sbuf.data(), sbuf.size(), off);
msgpack::object obj = result.get();

auto converted = obj.as<std::tuple<int, std::string>>();
std::cout << std::get<0>(converted) << std::endl;
std::cout << std::get<1>(converted) << std::endl;

// Storing the thrid one
std::cout << "off: " << off << std::endl;
std::string store; // file/db/redis/memcached/etc
std::copy(sbuf.data() + off, sbuf.data() + sbuf.size(), std::back_inserter(store));

{
// Unpack the thrid one from store
msgpack::unpacked result = msgpack::unpack(store.data(), store.size());
msgpack::object obj = result.get();
if (obj.type == msgpack::type::FLOAT) {
auto f = obj.as<float>();
std::cout << f << std::endl;
}
}
}

您可以在此处检查上面代码的行为: http://melpon.org/wandbox/permlink/uFfRGKQLqnIIiDrv

关于c++ - 从 C/C++ 获取指向 msgpack 数组中元素的指针和长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33272500/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com