C++的打包/解包功能

pack/unpack functions for C++

本文关键字:功能 包功能 C++      更新时间:2023-10-16

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

我需要一个C或C++库来实现Python/Ruby/Perl,如pack/unpack函数。这样的库存在吗?

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

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

如果您需要在缓冲区

而不是文件中生成结果,那就更容易了,只需使用memcpy将结构复制到缓冲区即可。

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

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

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

为什么不提升序列化或协议缓冲区?

是:使用 <algorithm> 中的std::copy对变量的字节表示进行操作。每个变量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,因为该语言已经允许您访问其变量的二进制表示作为语言的标准部分。