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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章