吃虧在四位元組對齊
我在寫程式的時候遇到乙個問題,費了我半天的時間才找到答案,記錄如下:
我原來乙個程式有如下結構:
uchar rx_buf[max_buf];
typedef struct //本結構體保證四位元組對齊
protocol;
//程式片斷
protocol *proto;
…for(i=0; itx_buf[i] = rx_buf[i];
*proto = (protocol *)tx_buf;
make_ack(proto, rx_buf, tx_buf);
…// make_ack函式實現
make_ack(proto, rx_buf, tx_buf)…}
就這麼一段程式,從邏輯上看任何問題沒有,但是就是讀取不到檔案,把我氣得呀!還以為是檔案系統出錯了,就開始找檔案系統的**,結果發現沒有問題。還作了測試。
然後我就懷疑是輸入引數錯了,掛wpe截獲傳送的資料,發現傳送的資料完全正確,寫測試**發現接受的資料完全正確。
於是乎,掛**器,並用串列埠輸出除錯資訊。
**修改如下:
// make_ack函式實現
make_ack(proto, rx_buf, tx_buf)
#ifdef output_debug_string
serialprintf(「proto->offset:%d」, proto->offset);
#endif…}
結果除錯執行結果:在除錯到proto->offset時顯示的資料為0,是我預期的結果,但是串列埠列印的資料確是:12636928。我一看傻眼了,還有這麼邪門。然後我就除錯到f_lseek函式內部,發現引數傳進來就給我改了位址了。呵呵,終於找到原因了,可是他娘的是怎麼回事呢?然後我就琢磨著可能是四位元組沒有對齊,於是乎就開啟了memory,發現果然tx_buf的起始位置是四位元組的中間,找編譯器的設定也沒找到,只要做了如下修改*proto = (protocol *)tx_buf;修改為*proto = (protocol *)rx_buf;反正資料一樣。
問題解決,搞定。但是還是很不爽。
四位元組記憶體對齊
首先我們先看看下面的c語言的結構體 typedef struct memalign memalign 以上這個結構體占用記憶體多少空間呢?也許你會說,這個簡單,計算每個型別的大小,將它們相加就行了,以32為平台為例,int型別佔4字節,char占用1字節,所以 4 3 4 11,那麼這個結構體一共占...
位元組對齊 8位元組對齊
參考博文 參考1 參考2 參考3 在記憶體管理中經常使用位元組對齊來管理分配的記憶體。1 原理 2 演算法 2.1unsigned intcalc align unsigned int n,unsigned align 2.2 更好的演算法 unsigned intcalc align unsign...
python 過濾四位元組字元 表情字元
專案中有時需要過濾掉四位元組以上的字元 表情 比如mysql資料庫5.5.3以下的版本text欄位不支援四位元組以上字元 於是就需要過濾掉再入庫,python中的方法為 try python ucs 4 build的處理方式 highpoints re.compile u u00010000 u00...