C++的打包/解包功能
pack/unpack functions for C++
注意:我知道这之前已经问过很多次了,但是没有一个问题链接到一个具体的、可移植的、维护的库。
我需要一个C或C++库来实现Python/Ruby/Perl,如pack
/unpack
函数。这样的库存在吗?
编辑:因为我发送的数据很简单,所以我决定只使用memcpy
,指针和hton*
函数。我是否需要以任何方式操纵char
以与平台无关的方式通过网络发送它?(char
仅用作字节,不用作字符(。
> 在 C/C++ 中,通常您只需以正确的顺序编写包含各种成员的struct
(正确的打包可能需要特定于编译器的编译指示(,并使用原始fwrite
/fread
(或在处理C++流时read
/write
(将其转储/读取到/从文件中读取(。实际上,pack
和unpack
天生就是为了阅读用这种方法生成的东西。
而不是文件中生成结果,那就更容易了,只需使用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
,因为该语言已经允许您访问其变量的二进制表示作为语言的标准部分。
- 非拖动功能模板参数包的合法使用
- 功能模板参数包,然后是模板参数和专业化
- 功能采用variadic模板包将std :: strings转换为const char *
- 指向成员功能的功能指针
- 单个功能中的多个参数包
- 参数包和功能声明
- 代码由编译器代替,用于成员功能的功能指针
- 特殊模板功能的功能
- C 如何将数组传递到功能内部功能
- 功能包如何运作?
- C 过载功能和功能模板 - 不同的行为
- 是否有Visual Studio 2013的功能包
- VS2008的简单C++正则表达式库,无功能包
- 如何在 MFC 功能包中获取功能区控件以处理ID_WINDOW_TILE_VERT
- 该程序应该在课堂上展示建设性和破坏性功能的功能
- C++的打包/解包功能
- 正在更新到MFC功能包
- 如何在MFC功能包应用程序中禁用菜单栏项中的文本恢复
- 如何在MFC功能包中动态添加带有图像的菜单项
- 正在将注册表访问转换为MFC功能包中的数据库调用