4

注意:我知道这已经被问过很多次了,但是没有一个问题有一个链接到一个具体的、可移植的、维护的库。

我需要一个实现 Python/Ruby/Perl 之类的pack/unpack函数的 C 或 C++ 库。有这样的图书馆吗?

编辑:因为我发送的数据很简单,所以我决定只使用memcpy、 指针和hton*函数。我是否需要以char任何方式操纵 a 以与平台无关的方式通过网络发送它?(char仅用作字节,不用作字符)。

4

3 回答 3

6

在 C/C++ 中,您通常只需struct按照正确的顺序编写包含各种成员的 a(正确的打包可能需要编译器特定的编译指示),然后使用原始fwrite/ fread(或read/write在处理 C++ 流时)将其转储/读取到文件中/从文件中读取) . 实际上,pack生来unpack就是为了阅读用这种方法生成的东西。

如果您需要将结果保存在缓冲区而不是文件中,那就更容易了,只需将结构复制到带有memcpy.

如果表示必须是可移植的,那么您主要关心的是字节顺序和字段打包;第一个问题可以通过各种hton*函数来解决,而第二个问题可以通过编译器特定的指令来解决。

特别是,许多编译器都支持该#pragma pack指令(参见这里的 VC++,这里的 gcc),它允许您管理编译器可能插入的(不需要的)填充,struct以使其字段在方便的边界上对齐。

但是请记住,在某些架构上,如果特定类型的字段未在其自然边界上对齐,则不允许访问它们,因此在这些情况下,您可能需要执行一些手动操作memcpy来将原始字节复制到正确对齐。

于 2012-03-02T00:08:39.503 回答
5

为什么不提高序列化协议缓冲区

于 2012-03-02T04:23:29.233 回答
2

是:使用std::copyfrom<algorithm>对变量的字节表示进行操作。每个变量T x;都可以通过char * p = reinterpret_cast<char*>(&x);作为字节数组访问。并且p可以被视为指向数组第一个元素的指针char[sizeof(T)]。例如:

char buf[100];
double q = get_value();

char const * const p = reinterpret_cast<char const *>(&q);
std::copy(p, p + sizeof(double), buf);

// more stuff like that

some_stream.write(buf) //... etc.

并返回:

double r;

std::copy(data, data + sizeof(double), reinterpret_cast<char *>(&r));

简而言之,您不需要 C++ 中的专用pack/ unpack,因为该语言已经允许您访问其变量的二进制表示作为该语言的标准部分。

于 2012-03-02T00:06:48.810 回答