如何使用 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 发出和解析原始二进制数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 yaml-cpp 发出复杂的数据结构?

如何使用 yaml-cpp 发出带引号的字符串?

无法使用 yaml-cpp 发出空值

如何在不知道终端标量的映射和类型中的键的情况下使用 yaml-cpp 库解析任意 yaml 文件?

yaml-cpp 发出的结果字符串 (!<!>) 是啥?

你如何防止 yaml-cpp 解析器删除所有注释?