裝置與伺服器通訊大端小端問題

2021-09-05 10:01:21 字數 3890 閱讀 7346

在嵌入式開發中,經常碰到因端序使用不當導致的錯誤,故決定決定將工作中常見的轉序函式進行梳理,一是為了避免犯同樣的錯誤,二是為了以後方便查詢。本文分為四個部分:1、什麼是大小端序;2、大小端序資料相互轉換函式;3、應用場景;4、使用總結。

1、什麼是大小端序

現在,以乙個unsigned int整型資料0x12345678為例,其大端序、小端序的儲存內容如圖所示。

2、大小端序資料相互轉換函式

a)將unsigned char陣列轉換成「大端序」整數;

/*

* function: conversearraytobeui

* description: 將無符號字元陣列資料轉換成「大端序」整數

* parameter: srcarray --[in] 源陣列資料

* desbedata --[out] 目標「大端序」整數

* return 0 成功

* 非0 失敗

* note:

* other:

*/int mulconverse_call conversearraytobeui(unsigned char *srcarray,unsigned int *desbedata)

*desbedata = (unsigned int)(srcarray[0]<<24) + (unsigned int)(srcarray[1]<<16) +

(unsigned int)(srcarray[2]<<8) + (unsigned int)srcarray[3];

return _success;

}

b)將unsigned char陣列轉換成「小端序」整數;

/*

* function: conversearraytoleui

* description: 將無符號字元陣列資料轉換成「小端序」整數

* parameter: srcarray --[in] 源陣列資料

* desledata --[out] 目標「小端序」整數

* return 0 成功

* 非0 失敗

* note:

* other:

*/int mulconverse_call conversearraytoleui(unsigned char *srcarray,unsigned int *desledata)

*desledata = (unsigned int)(srcarray[3]<<24) + (unsigned int)(srcarray[2]<<16) +

(unsigned int)(srcarray[1]<<8) + (unsigned int)srcarray[0];

return _success;

}

c)將整數按照「大端序」格式儲存在陣列中;

/*

* function: converseuitobearray

* description: 將無符號整數轉換成「大端序」儲存的無符號字元陣列

* parameter: srcdata --[in] 源整數

* desbearray --[out] 目標「大端序」儲存的陣列資料

* return 0 成功

* 非0 失敗

* note:

* other:

*/int mulconverse_call converseuitobearray(unsigned int srcdata,unsigned char *desbearray)

desbearray[0] = (unsigned char)(srcdata>>24);

desbearray[1] = (unsigned char)(srcdata>>16);

desbearray[2] = (unsigned char)(srcdata>>8);

desbearray[3] = (unsigned char)srcdata;

return _success;

}

d)將整數按照「小端序」格式儲存在陣列中。

/*

* function: converseuitolearray

* description: 將無符號整數轉換成「小端序」儲存的無符號字元陣列

* parameter: srcdata --[in] 源整數

* deslearray --[out] 目標「小端序」儲存的陣列資料

* return 0 成功

* 非0 失敗

* note:

* other:

*/int mulconverse_call converseuitolearray(unsigned int srcdata,unsigned char *deslearray)

deslearray[3] = (unsigned char)(srcdata>>24);

deslearray[2] = (unsigned char)(srcdata>>16);

deslearray[1] = (unsigned char)(srcdata>>8);

deslearray[0] = (unsigned char)srcdata;

return _success;

}

3、應用場景pc(小端序)向晶元(大端序)傳送資料

假設pc產生乙個整數數值0x00000001,經通訊介面(比如串列埠)向晶元傳送資料時,按照一次發一位元組的方式傳輸資料,那麼此時晶元就會收到4位元組資料,其內容按照位址從低到高排序為0x01,0x00,0x00,0x00,那麼晶元就會認為自己收到的整數數值為0x01000000。

此時,兩個硬體平台就會因為大小端的不同造成資料收發錯誤,此時解決的方法有兩種:1、pc傳送資料之前,通過轉換函式converseuitobearray,將整數數值0x00000001轉換成[00,00,00,01]字元陣列,然後經通訊介面發給晶元;2、晶元接收到4位元組資料之後,通過函式conversearraytoleui,將[01,00,00,00]轉換成整數0x00000001。

4、使用總結

(1)不同的硬體平台如果採用同一種型別的端序,計算/使用時無需轉序;

(2)不同的硬體平台如果採用不同型別的的端序,但傳輸的字元陣列「無需」轉換成多位元組基本型別資料(如int,double,float)時,計算/使用時無需轉序;

(3)不同的硬體平台如果採用不同型別的的端序,但傳輸的字元陣列「需要」轉換成多位元組基本型別資料(如int,double,float)時,計算/使用時需要轉序;

python socket伺服器與裝置通訊

首先建立兩份 乙份執行於伺服器,乙份執行於裝置端 參考 裝置端from socket import host 149.28.159.155 指定客戶端訪問host port 21567 bufsiz 1024 addr host,port tcpclisock socket af inet,sock...

伺服器端與瀏覽器端通訊

1 伺服器端傳遞引數到自定義標籤 chart data stat emp name second xcategory dept id ycategories request.getattribute ycategories tostring 2 伺服器端傳遞引數到html標籤 align right...

客戶端與伺服器端通訊

關係圖 傳送 邏輯管理器 處理邏輯傳送指令 指令解析管理器 根據協議xml解析指令成二進位制資料 把二進位制資料傳給伺服器 接收 伺服器傳送二進位制資料到客戶端 指令解析管理器 根據協議xml解析二進位制資料 根據解析資料對映到邏輯類來處理 2 1 3 20 2,2 21 1,1,2 指令名和指令名...