主要用来设置结构定义的字节对齐方式,比如是单字节对齐,双字节对齐等,比如如果是双字节对齐,那么结构的成员变量的地址必须是2的整数倍,这就造成了字节补齐,但是提高了访问速度。单字节呢,就是没有补齐,成员变量的地址是连续的,其他依次类推,通常是4,8等。通常用于网络传输数据,特别是传输整个结构时,必须采取单字节对齐,这样才可以直接把结构地址,以及结构长度,作为Send的参数发送整个结构,否则只能依次发送结构的成员,要不然会出现结构解释的差异。另外,在Project->Setting->C/C++->Code Generation->Struct member alignment中可以设置结构的对齐方式。其他的你就自己慢慢看吧。 

解决方案 »

  1.   

    传输结构时和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方式对齐。
      

  2.   

    如果直接把结构地址,以及结构长度,作为Send的参数发送整个结构,难道不需要pack吗?请教verybigbug()兄。
      

  3.   

    不需要。
    send(struct, sizeof(struct));就可以了,如果两个程序都没有pack的话,
    相同的结构体在接收数据时就没有问题。必须保证两边的pack都是一样才行。
    我在写socket的程序(SDK方式)时送结构就从来不用pack的。
    只在写Hook Api时才用pack(1)。