主要用来设置结构定义的字节对齐方式,比如是单字节对齐,双字节对齐等,比如如果是双字节对齐,那么结构的成员变量的地址必须是2的整数倍,这就造成了字节补齐,但是提高了访问速度。单字节呢,就是没有补齐,成员变量的地址是连续的,其他依次类推,通常是4,8等。通常用于网络传输数据,特别是传输整个结构时,必须采取单字节对齐,这样才可以直接把结构地址,以及结构长度,作为Send的参数发送整个结构,否则只能依次发送结构的成员,要不然会出现结构解释的差异。另外,在Project->Setting->C/C++->Code Generation->Struct member alignment中可以设置结构的对齐方式。其他的你就自己慢慢看吧。
解决方案 »
- 两位BYTE 怎么转换成 int 型的呢
- 用全局钩子写连发程序的一点想法,不知道哪里错了,帮忙看看。
- 有下载过vs2010TCP的没?感觉咋样?我只有80G硬盘.装不了.我想问一下VC2010中它 V 了没有?
- error LNK2001: unresolved external symbol
- 标题栏上加控件[诸如CStatic,CEdit==]
- vc6生成的工程转变为VC7工程后,如何将对话框中的按钮变为XP风格?
- ****在线等待:如何实现控件颜色的变化??????×××
- 大家小心上二奶的当。
- 绝对的高难问题,请绝对的高手回答。
- [求助] 在扩展DLL中如何调用自身对话框资源?
- vc++中使用控件的问题————高手请进——急!!!!
- 一个SOCKET连接能否同时进行接收(receive)和发送(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方式对齐。
send(struct, sizeof(struct));就可以了,如果两个程序都没有pack的话,
相同的结构体在接收数据时就没有问题。必须保证两边的pack都是一样才行。
我在写socket的程序(SDK方式)时送结构就从来不用pack的。
只在写Hook Api时才用pack(1)。