2

最近,我尝试使用 boost::spirit::qi 二进制字节序解析器来解析一些二进制数据,这取决于平台的字节序。有一个简单的例子,如下所示:

使用声明和变量:

使用 boost::spirit::qi::little_word;
使用 boost::spirit::qi::little_dword;
使用 boost::spirit::qi::little_qword;

boost::uint16_t 我们;
升压::uint32_t ui;
boost::uint64_t ul;

little endian 二进制解析器的基本用法:

test_parser_attr("\x01\x02", little_word, us); assert(us == 0x0201);
test_parser_attr("\x01\x02\x03\x04", little_dword, ui); assert(ui == 0x04030201);
test_parser_attr("\x01\x02\x03\x04\x05\x06\x07\x08", little_qword, ul);
assert(ul == 0x0807060504030201LL);

test_parser("\x01\x02", little_word(0x0201));
test_parser("\x01\x02\x03\x04", little_dword(0x04030201));
test_parser("\x01\x02\x03\x04\x05\x06\x07\x08",
    little_qword(0x0807060504030201LL));

它工作得很好。boost::uint16_t但是我的问题来了,为什么我们需要boost::uint32_t在这里使用一些数据类型?我可以使用unsigned longunsigned int在这里吗?如果我想解析doublefloat数据类型,我应该使用什么提升数据类型?请告诉我 boost 在哪里定义了上述这些类型?

4

2 回答 2

6

存在诸如 uint16_t 或 uint32_t 之类的类型,因此您可以将变量声明为具有特定位宽。你不能用像“long”这样的普通类型来做到这一点,因为它们在不同的架构和/或实现上是不同的大小。上述类型通常是通过预处理器计算派生的,从而导致实现/架构特定类型的 typedef 以获得特定大小。

于 2010-05-10T18:16:41.927 回答
3

该文件<boost/cstdint.hpp>包含所有boost::(u)int(8|16|32|64)_t定义。提供这主要是因为 MSVC 不附带<cstdint>. 在也是 C 编译器(如 gcc)的 C++ 编译器上,<boost/cstdint.hpp>只需导入<cstdint>到 boost 命名空间。

另见:stdint.h

于 2010-05-10T18:34:38.963 回答