注意: 我知道这个问题已经被问了很多次,但是没有一个问题有一个指向具体、可移植、维护的库的链接。
我需要一个实现 Python/Ruby/Perl 类似的 pack
/unpack
函数的 C 或 C++ 库。这样的库是否存在?
编辑: 因为我发送的数据很简单,所以我决定只使用 memcpy
、指针和 hton*
函数。我需要以平台无关的方式操作字符以便将其发送到网络上吗?(该 char
仅用作字节而非字符。)
注意: 我知道这个问题已经被问了很多次,但是没有一个问题有一个指向具体、可移植、维护的库的链接。
我需要一个实现 Python/Ruby/Perl 类似的 pack
/unpack
函数的 C 或 C++ 库。这样的库是否存在?
编辑: 因为我发送的数据很简单,所以我决定只使用 memcpy
、指针和 hton*
函数。我需要以平台无关的方式操作字符以便将其发送到网络上吗?(该 char
仅用作字节而非字符。)
struct
,并使用原始的fwrite
/fread
(或read
/write
处理C++流)将其转储/从文件中读取。实际上,pack
和unpack
是为了读取使用此方法生成的内容而产生的。memcpy
将结构复制到缓冲区中。hton*
函数解决,而第二个问题可以通过特定于编译器的指令解决。#pragma pack
指令(有关VC++的请参见此处,有关gcc的请参见此处),它允许您管理编译器可能在struct
中插入的(不必要的)填充,以便将其字段对齐到方便的边界。memcpy
操作,将原始字节复制到正确对齐的变量中。#pragma
吗?我使用的是GCC。 - Linuxios#pragma pack
的链接。 - Matteo Italia是的:使用来自<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));
buf [0] = n%256; buf [1] =(n / 256)%256;
等)读取/写入无符号整数。(在这种情况下,您需要无符号字符。)是的,这仅适用于基本类型(甚至不是POD)。 - Kerrek SB
pack
/unpack
是什么意思吗? - user541686sprintf
的东西,只不过格式说明符是用于二进制数据的。就像一个巨大的switch
语句一样。 - Linuxios