注意:我知道这已经被问过很多次了,但是没有一个问题有一个链接到一个具体的、可移植的、维护的库。
我需要一个实现 Python/Ruby/Perl 之类的pack
/unpack
函数的 C 或 C++ 库。有这样的图书馆吗?
编辑:因为我发送的数据很简单,所以我决定只使用memcpy
、 指针和hton*
函数。我是否需要以char
任何方式操纵 a 以与平台无关的方式通过网络发送它?(char
仅用作字节,不用作字符)。
注意:我知道这已经被问过很多次了,但是没有一个问题有一个链接到一个具体的、可移植的、维护的库。
我需要一个实现 Python/Ruby/Perl 之类的pack
/unpack
函数的 C 或 C++ 库。有这样的图书馆吗?
编辑:因为我发送的数据很简单,所以我决定只使用memcpy
、 指针和hton*
函数。我是否需要以char
任何方式操纵 a 以与平台无关的方式通过网络发送它?(char
仅用作字节,不用作字符)。
在 C/C++ 中,您通常只需struct
按照正确的顺序编写包含各种成员的 a(正确的打包可能需要编译器特定的编译指示),然后使用原始fwrite
/ fread
(或read
/write
在处理 C++ 流时)将其转储/读取到文件中/从文件中读取) . 实际上,pack
生来unpack
就是为了阅读用这种方法生成的东西。
如果您需要将结果保存在缓冲区而不是文件中,那就更容易了,只需将结构复制到带有memcpy
.
如果表示必须是可移植的,那么您主要关心的是字节顺序和字段打包;第一个问题可以通过各种hton*
函数来解决,而第二个问题可以通过编译器特定的指令来解决。
特别是,许多编译器都支持该#pragma pack
指令(参见这里的 VC++,这里的 gcc),它允许您管理编译器可能插入的(不需要的)填充,struct
以使其字段在方便的边界上对齐。
但是请记住,在某些架构上,如果特定类型的字段未在其自然边界上对齐,则不允许访问它们,因此在这些情况下,您可能需要执行一些手动操作memcpy
来将原始字节复制到正确对齐。
是:使用std::copy
from<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
,因为该语言已经允许您访问其变量的二进制表示作为该语言的标准部分。