Linux平台与Windows平台字节对齐(一)

记录时间:2014-10-20 20:31


今天白天在整理 winndows平台 + Arm平台的网络数据包。但期间由于经验不足,不了解两平台CPU架构的差距会影响到数据类型的大小,导致在工程非常紧急的时间里还浪费了很多宝贵的时间,鉴于问题的常见性 和 隐秘行,特此列出,以便能帮助需要帮助的人。


解决问题思路:在遇到网络交互数据不对时,可以从如下四方面去排除问题,通常只要使用这三种方法能解决基本上的网络数据发送难题。在第一点正确的情况下,发现第二点异常,那么问题一般就是出现在“强制转换”不对 或者 两端字节数不一致导致。字节数不对通常是最难发现,且最重要的问题。因为往往需求网络交互的情况都是 不同平台。不同平台出现不同架构的可能性是非常大的,而不同平台,编译器所分配的数据类型的字节数通常是不一致的。进而导致收发两端的结构体 和 数据类型一致,而收到的数据却异常的问题。所以在不同平台之间做数据交互的时候,一定要先前检测各平台数据类型锁分配字节大小。

            1、在发送端将发送前的数据打印出来,看看数据是否正确;

             2、在接收端将数据打印出来;

            3、检查发送数据的字节数 与 接收端数据的字节数是否一致;

            4、强制类型转换 不对。


区分不同平台数据类型字节数的方法:

         1、查看结构体定义,是否支持相同的字节对齐方式;

              通常不同平台所需要的结构体文件实在某一成熟平台拷贝过来直接使用的,而不同平台所支持的对齐定义可能在另一个平台无效,导致自认为数据对齐方式一样的风险,如Windows单字节对齐的方式是"结构体"定义在#pragma pack(push, size_t)  和 #pragma pack(pop)之间,size_t:几字节对齐,如单字节对齐,则size_t = 1.而这种定义在Linux平台即无效又不产生错误,Linux的字节对齐方式是在 结构体尾,双引号前添加__attribute__((packed))字符串,如typedef struct __people{}__attribute__((packed))people;

           如time.h中的struct tm{};Linux和 Windows平台都包含在#pragma pack(push, 8)  和 #pragma pack(pop)之间,Windows平台遵循8字节对齐,所以整体为36字节,而在Linux无效,整体大小为44.

          2、结合 printf () 和 sizeof(),在两端都打印出同结构体的大小,如果不一致,则可定位到问题。

               如在Windows 平台time_t是8字节,而在Linux是4字节;


发布了35 篇原创文章 · 获赞 7 · 访问量 10万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章