在嵌入式開發中,經常碰到因端序使用不當導致的錯誤,故決定決定將工作中常見的轉序函式進行梳理,一是為了避免犯同樣的錯誤,二是為了以後方便查詢。本文分為四個部分:1、什麼是大小端序;2、大小端序資料相互轉換函式;3、應用場景;4、使用總結。
1、什麼是大小端序
現在,以乙個unsigned int整型資料0x12345678為例,其大端序、小端序的儲存內容如圖所示。
2、大小端序資料相互轉換函式
a)將unsigned char陣列轉換成「大端序」整數;
/*b)將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;
}
/*c)將整數按照「大端序」格式儲存在陣列中;* 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;
}
/*d)將整數按照「小端序」格式儲存在陣列中。* 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;
}
/*3、應用場景pc(小端序)向晶元(大端序)傳送資料* 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;
}
假設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 指令名和指令名...