msgpack-c は、質問と回答が投稿された後に更新されました。現在の状況をお知らせしたいと思います。
msgpack-c バージョン 2.0.0 以降、C スタイルの配列がサポートされています。https://github.com/msgpack/msgpack-c/releasesを参照してください
msgpack-c は、"hello" などの const char 配列をパックできます。型変換ルールはhttps://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_adaptor#predefined-adaptorsに記載されています。
char 配列は STR にマップされます。STR の代わりに BIN を使用する場合は、でラップする必要がありますmsgpack::type::raw_ref
。以上が梱包概要です。
解凍と変換の説明は次のとおりです:
https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_object#conversion
msgpack::object
アンパックとは、MessagePack 形式のバイト ストリームから作成することを意味します。Convert とは、 から C++ オブジェクトに変換することを意味しますmsgpack::object
。
MessagePack 形式のデータが STR で、変換対象の型が char 配列の場合、データを配列にコピーし、配列に余分な容量がある場合は、'\0' を追加します。MessagePack 形式のデータが BIN の場合、'\0' は追加されません。
元の質問に基づくコード例を次に示します。
#include <msgpack.hpp>
#include <iostream>
inline
std::ostream& hex_dump(std::ostream& o, char const* p, std::size_t size ) {
o << std::hex << std::setw(2) << std::setfill('0');
while(size--) o << (static_cast<int>(*p++) & 0xff) << ' ';
return o;
}
int main() {
{
msgpack::sbuffer temp_sbuffer;
// since 2.0.0 char[] is supported.
// See https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_adaptor#predefined-adaptors
msgpack::pack(temp_sbuffer, "hello");
hex_dump(std::cout, temp_sbuffer.data(), temp_sbuffer.size()) << std::endl;
// packed as STR See https://github.com/msgpack/msgpack/blob/master/spec.md
// '\0' is not packed
auto oh = msgpack::unpack(temp_sbuffer.data(), temp_sbuffer.size());
static_assert(sizeof("hello") == 6, "");
char converted[6];
converted[5] = 'x'; // to check overwriting, put NOT '\0'.
// '\0' is automatically added if char-array has enought size and MessagePack format is STR
oh.get().convert(converted);
std::cout << converted << std::endl;
}
{
msgpack::sbuffer temp_sbuffer;
// since 2.0.0 char[] is supported.
// See https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_adaptor#predefined-adaptors
// packed as BIN
msgpack::pack(temp_sbuffer, msgpack::type::raw_ref("hello", 5));
hex_dump(std::cout, temp_sbuffer.data(), temp_sbuffer.size()) << std::endl;
auto oh = msgpack::unpack(temp_sbuffer.data(), temp_sbuffer.size());
static_assert(sizeof("hello") == 6, "");
char converted[7];
converted[5] = 'x';
converted[6] = '\0';
// only first 5 bytes are written if MessagePack format is BIN
oh.get().convert(converted);
std::cout << converted << std::endl;
}
}
デモの実行:
https://wandbox.org/permlink/mYJyYycfsQIwsekY