今天遇到了一个问题,使用数据流传输的数据在解析的时候数据错位。想了非常久,发现是#pragma pack (n)惹的祸。





首先。解析方使用了编译字节设置,可是在发送方没有使用,于是用相同的结构体解析数据时候,有两个字节被0占用了。后来统一使用。问题解决。





例如以下图的struct结构体:不使用#pragma pack (1)时候,在解析RemotPort后是没问题的,再解析RemotIp的时候,通过字节转换后。ip地址的前两位是0.0.X.X 原因是WORD不够4字节,编译器自己主动填了0占位。





这是给编译器用的參数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。

#pragma pack (n)             作用:C编译器将依照n个字节对齐。

#pragma pack ()               作用:取消自己定义字节对齐方式。





#pragma  pack (push,1)     作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐

#pragma pack(pop)            作用:恢复对齐状态

因此可见,增加push和pop能够使对齐恢复到原来状态,而不是编译器默认,能够说后者更优,可是非常多时候两者区别不大

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVGlubmFfemhhbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">







如:

#pragma pack(push) //保存对齐状态

#pragma pack(4)//设定为4字节对齐

  相当于 #pragma  pack (push,4)  

 

#pragma  pack (1)           

作用:调整结构体的边界对齐,让其以一个字节对齐;<使结构体按1字节方式对齐>

可是假设调换一下结构体中DWORD和WORD的顺序。则结果又不同。例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVGlubmFfemhhbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

最新文章

  1. 一个简单oop的changeTab
  2. &lt;&lt;&lt; 入侵网站思路
  3. idea中配置eslint 静态代码检查
  4. 去除android手机滚动条
  5. 作用域链–JS基础核心之一
  6. VMWare联网
  7. ubuntu文件管理常用命令 分类: linux ubuntu 学习笔记 2015-07-02 16:57 29人阅读 评论(0) 收藏
  8. 动态树(LCT):HDU 4010 Query on The Trees
  9. IC芯片設計
  10. 在OSX狮子(Lion)上安装MYSQL(Install MySQL on Mac OSX)
  11. javascript 学习随笔6
  12. JavaScript 常用功能实现一览(一)
  13. 豆瓣电影Top250基本信息抓取
  14. leetcode1:两数之和
  15. java数组元素的复制
  16. Java设计模式学习记录-GoF设计模式概述
  17. [No000015C]计算机科学关键领域
  18. 源码安装php时出现configure: error: xml2-config not found. Please check your libxml2 installation
  19. Onenet学习笔记
  20. for 续10

热门文章

  1. svn 版本库信息修改
  2. base64记载
  3. 2.10.3 nav 元素
  4. ruby rspec安装
  5. C语言学习1
  6. GPIO——端口位设置/清除寄存器BSRR,端口位清除寄存器BRR
  7. node学习的一些网站
  8. Android渲染器Shader:LinearGradient(一)
  9. POJ-20407Relatives/NYOJ-333mdd的烦恼,欧拉函数简单应用,模板A
  10. POJ3107 树的重心