如何使用 yaml-cpp 发出和解析原始二进制数据
Posted
技术标签:
【中文标题】如何使用 yaml-cpp 发出和解析原始二进制数据【英文标题】:How-to emit and parse raw binary data using yaml-cpp 【发布时间】:2010-10-28 19:13:23 【问题描述】:是否可以发出和读取(解析)二进制数据(图像、文件等)? 像这样显示在这里: http://yaml.org/type/binary.html 如何在 yaml-cpp 中执行此操作?
【问题讨论】:
【参考方案1】:截至revision 425,是的! (用于发射)
YAML::Emitter emitter;
emitter << YAML::Binary("Hello, World!", 13);
std::cout << emitter.c_str();
输出
--- !!binary "SGVsbG8sIFdvcmxkIQ=="
语法是
YAML::Binary(const char *bytes, std::size_t size);
我不确定如何传递字节数组:char
不一定是一个字节,所以我不确定该算法的可移植性如何。你的字节数组通常是什么格式的?
(问题是uint8_t
还不是标准的C++,所以我有点担心使用它。)
至于解析,yaml-cpp
肯定会将数据解析为字符串,但目前还没有解码算法。
【讨论】:
有没有办法先不 base64编码?我希望用户能够指定短二进制字符串而无需执行这些额外步骤 @endolith,“没有base64编码”是什么意思?能给我举个例子吗? (也许打开一个新问题要问?)SGVsbG8sIFdvcmxkIQ==
是 base64 编码的。我希望它的编码更像48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21
@endolith:没关系。 !!binary
标签需要 base64,但您可以定义自己的标签并根据需要解释它们。我使用add_implicit_resolver
来处理没有任何标签的十六进制字符串。【参考方案2】:
这里回答了如何使用 yaml-cpp 库从 yaml 文件中读取/解析二进制数据。
此答案假定您能够从 yaml 文件加载 YAML::Node 节点对象 - 在 yaml-cpp 教程中进行了说明:https://github.com/jbeder/yaml-cpp/wiki/Tutorial)。
从 yaml 节点解析二进制数据的代码是:
YAML::Binary binary = node.as<YAML::Binary>();
const unsigned char * data = binary.data();
std::size_t size = binary.size();
然后你有一个已知大小“大小”的字节数组“数据”。
【讨论】:
以上是关于如何使用 yaml-cpp 发出和解析原始二进制数据的主要内容,如果未能解决你的问题,请参考以下文章