对象不会打包数据
object won't pack data
我正在尝试将数据打包在c ++结构中。
我的结构具有以下布局:
struct structName
{
int16_t member1;
int32_t member2;
uint32_t member3;
uint32_t member4;
uint32_t member5;
etc
}__attribute__((packed));
使用 offsetof($structname, $membername)
我得到了数据的正确偏移量 (0,2,6,10,14 . .) 但是当我按成员名称访问数据时,我得到 4 字节偏移量 (0,4,8,12,16 . .) 的数据,就好像结构没有打包一样。
是
} __attribute__((packed));
包装结构的正确方法是什么? . .
更新:mydogisbox 写道:
根据记录,
__attribute__((packed))
、#pramga pack(1)
和#pragma pack(push, 1)
都有效。
__attribute__((packed))
是受支持的 gcc 扩展。
clang文档说它也支持#pragma pack(...)
指令:
Clang对Microsoft扩展有一些实验性支持 视觉C++;若要启用它,请使用 -fms-extensions 命令行选项。 这是 Windows 目标的默认设置。请注意,支持是 不完全的;启用Microsoft扩展将静默删除某些 构造(包括__declspec和Microsoft样式的 ASM 语句)。
CLANG 支持用于控制记录布局的Microsoft
#pragma pack
功能。
来源: http://clang.llvm.org/docs/UsersManual.html
只需说:
#pragma pack(1)
struct my_struct {
int16_t x;
// etc.
};
看看它是否有效(如果不使用 Windows,则使用 -fms-extensions
编译)。
注意以上都是非标准扩展,新的C++11标准有一个新的alignas
关键词:http://en.cppreference.com/w/cpp/language/alignas
struct alignas(1) my_struct {
int16_t x;
// etc.
};
但它的支持仍然有点粗略。
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 使用C++将UDP数据包存储在Structure中
- FFmpeg av_read_frame从音频流返回数据包
- Windivert-修改数据包数据/有效载荷内容
- 使用 libpcap 读取数据包数据
- SDL_net UDP 数据包数据
- 从Qt应用程序获取原始数据包数据
- 将libpcap数据包数据从const u_char*复制到另一个const u_car*
- 无法弄清楚为什么此代码在发送数据包数据时会导致 SIGSEGV
- 在c++中使用SFML将数据包数据复制到另一个数据包