大小端問題2

2021-07-03 07:23:26 字數 1215 閱讀 3186

之前有學習過系統的大小端問題。還在網上找了很多資料學習。這次又碰到了,而且還讓我找了良久。

這次的問題是這樣的。在tcp傳輸中,有兩個中文字元使用unsigned  short[4],傳輸。.

typedef struct test

然後在系統中。要輸出中文格式。

系統為什麼有大小端問題。就是應該有高低位系統的問題。

在windows系統和linux,ios系統中,每個系統處理高低位應該都會不一樣。

然後我在網上找了很多文章,關於unsigned short如何轉為 char 的問題。網上是說直接強制轉換就可以了。

其實這是不對的。因為在強制轉化的過程中,使用memcpy的方法的時候,他會考慮從高位複製還是低位複製。

在short轉為char的時候,就是從多位元組轉化為單位元組,在這裡,需要多多注意。

char bg[8];       

for(int j=0; j<4; ++j)

memcpy(bg, gb, 8);

這個轉化過程需要先通過位元組序的轉化,然後在複製,這樣得到的char *通過轉化為gbk,utf-8這種格式,那麼資料就能正常顯示。

ps:所以說,不管short,double,float,int等型別不管是以何種方式展示的,都是需要位元組序轉化的。

所以說,其實高地位和大小端都是同乙個性質的。系統大小端的判斷方法(

#include#includeint main()  

然後我們在通過htons的方法轉化大小端,就是所謂的系統高地位。

htons的源**其實就是高位元組位和低位元組位相互轉化的結果。所以,所有的htons,ntohs,htonl,ltonh,自定義的htonf, hton64i等都是相同的轉法。

htons的講解:

#define htons(x) ((unsigned short int)((((unsigned short int)(x) & 0x00ff)<<8)|(((unsigned short int)(x) & 0xff00)>>8)))

其實這個方法就是相當於

#define mask  0x00ff

unsigned short shift_fun3(unsigned short data)

ps:這裡引伸一下char的翻轉,

大小端問題

對於位數大於 8位的處理器,例如 16位或者 32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。例如乙個 16bit 的short型x 在記憶體中的位址為 0x0010,x 的值為0x1122 那麼0x11 為高位元組...

大小端問題

大小端問題 跨位元組位域大小端轉換例項講解 注 結構體整體當做u16 u32來賦值時才會產生這種問題,如果是按位元組或者移位方式訪問則沒有問題 typedef struct s bit sample 測試程式 vos void bigendiandomainfiledtest vos void 1 ...

大小端問題

大小端問題 最近工作中,有兩次遇到大小端問題,所以花時間寫這篇日誌,總結一下。1.實際需求 1 前段時間寫了乙個修復損壞的gzip檔案的tool,在linux server上編譯執行沒有問題。但是在solaris server上運編譯執行,結果總是和預期的不一致,跟蹤發現是由大小端問題導致的 2 最...