请问#pragma pack是什么意思?
请问#pragma pack(1)预编译命令是什么意思?起什么具体作用? 问题点数:30、回复次数:4Top
1 楼eggplant(拉拉)回复于 2001-05-29 08:23:00 得分 15
主要用来设置结构定义的字节对齐方式,比如是单字节对齐,双字节对齐等,比如如果是双字节对齐,那么结构的成员变量的地址必须是2的整数倍,这就造成了字节补齐,但是提高了访问速度。单字节呢,就是没有补齐,成员变量的地址是连续的,其他依次类推,通常是4,8等。通常用于网络传输数据,特别是传输整个结构时,必须采取单字节对齐,这样才可以直接把结构地址,以及结构长度,作为Send的参数发送整个结构,否则只能依次发送结构的成员,要不然会出现结构解释的差异。
另外,在Project->Setting->C/C++->Code Generation->Struct member alignment中可以设置结构的对齐方式。
其他的你就自己慢慢看吧。 Top
2 楼verybigbug(等待中)回复于 2001-05-29 08:52:00 得分 15
传输结构时和pack无关,只要Recv端定义的结构和Send方一样就没问题了。
pack多用于Hook程序,比如Hook Api技术,因为需要硬编码,所以必须将结构
压缩,将内容补齐!
比如:
ASM_STRUCT{
BYTE bJmp;
DWORD dwDes;
}a;
如果不用Pack时,编译为:
a.bJmp = 0xEB; // jmp的编码
a.dwDes = 0x00410123; // jmp 0x00410123
不用pack的话,内存内容为 0xEB XX XX XX 23 01 41 00 // 共8BYTE
其中XX为不定值,用pack后 0xEB 23 01 41 00 // 共5BYTE
这样,在Hook时运行这些指令,就必须用#parama pack(1) // 1 BYTE方式对齐。
Top
3 楼eggplant(拉拉)回复于 2001-05-29 23:19:00 得分 0
如果直接把结构地址,以及结构长度,作为Send的参数发送整个结构,难道不需要pack吗?请教verybigbug()兄。Top
4 楼verybigbug(等待中)回复于 2001-05-30 09:21:00 得分 0
不需要。
send(struct, sizeof(struct));就可以了,如果两个程序都没有pack的话,
相同的结构体在接收数据时就没有问题。必须保证两边的pack都是一样才行。
我在写socket的程序(SDK方式)时送结构就从来不用pack的。
只在写Hook Api时才用pack(1)。
Top




