我正在使用C++ msgpack实现.关于如何打包二进制数据,我遇到了障碍.在二进制数据方面,我有一个以下类型的缓冲区:
unsigned char* data;
Run Code Online (Sandbox Code Playgroud)
的数据变量指向的数组,其实际上是一个图像.我想要做的是使用msgpack打包.似乎没有关于如何实际打包二进制数据的示例.从格式规范支持原始字节,但我不知道如何使用该功能.
我尝试使用如下字符指针的向量:
msgpack::sbuffer temp_sbuffer;
std::vector<char*> vec;
msgpack::pack(temp_sbuffer, vec);
Run Code Online (Sandbox Code Playgroud)
但这会导致编译器错误,因为T = std :: vector没有函数模板.
我还试过以下几点:
msgpack::pack(temp_sbuffer, "Hello");
Run Code Online (Sandbox Code Playgroud)
但这也会导致编译错误(即没有T = const char的函数模板[6]
因此,我希望有人能就如何使用msgpack C++打包表示为char数组的二进制数据给出建议.
Josh提供了一个很好的答案,但它需要将字节缓冲区复制到字符向量。我宁愿尽量减少复制并直接使用缓冲区(如果可能)。以下是替代解决方案:
查看源代码并尝试确定如何根据我遇到的规范打包不同的数据类型msgpack::packer<>::pack_raw(size_t l)和msgpack::packer<>::pack_raw_body(const char* b, size_t l). 虽然似乎没有这些方法的文档,但这就是我对它们的描述。
以下是如何打包字符数组的简单示例:
msgpack::sbuffer temp_sbuffer;
msgpack::packer<msgpack::sbuffer> packer(&temp_sbuffer);
packer.pack_raw(5); // Indicate that you are packing 5 raw bytes
packer.pack_raw_body("Hello", 5); // Pack the 5 bytes
Run Code Online (Sandbox Code Playgroud)
上面的例子可以扩展到打包任何二进制数据。这允许直接从字节数组/缓冲区打包,而不必复制到中间(即字符向量)。
如果您可以将图像存储在 avector<unsigned char>而不是原始数组中unsigned char,那么您可以将其打包vector:
#include <iostream>
#include <string>
#include <vector>
#include <msgpack.hpp>
int main()
{
std::vector<unsigned char> data;
for (unsigned i = 0; i < 10; ++i)
data.push_back(i * 2);
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, data);
msgpack::unpacked msg;
msgpack::unpack(&msg, sbuf.data(), sbuf.size());
msgpack::object obj = msg.get();
std::cout << obj << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这只适用于unsigned char. 如果您尝试打包一个缓冲区char(甚至单个缓冲区char),它将无法编译。