在嵌入式開發中,常常碰到因端序使用不當致使的錯誤,故決定決定將工做中常見的轉序函數進行梳理,一是爲了不犯一樣的錯誤,二是爲了之後方便查詢。本文分爲四個部分:一、什麼是大小端序;二、大小端序數據相互轉換函數;三、應用場景;四、使用總結。數組
一、什麼是大小端序函數
大端模式:是指數據的高字節保存在內存的低地址中,而數據的低字節保存在內存的高地址中。spa
小端模式:是指數據的高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中。code
如今,以一個unsigned int整型數據0x12345678爲例,其大端序、小端序的存儲內容如圖所示。blog
二、大小端序數據相互轉換函數排序
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) { if (srcArray == NULL_POINT || desBeData == NULL_POINT) { return ERR_NULL_POINT; } *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數組轉換成「小端序」整數;ip
/* * Function: ConverseArrayToLeUI * Description: 將無符號字符數組數據轉換成「小端序」整數 * Parameter: srcArray --[in] 源數組數據 * desLeData --[out] 目標「小端序」整數 * Return 0 成功 * 非0 失敗 * Note: * Other: */ int MULCONVERSE_CALL ConverseArrayToLeUI(unsigned char *srcArray,unsigned int *desLeData) { if (srcArray == NULL_POINT || desLeData == NULL_POINT) { return ERR_NULL_POINT; } *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) { if (desBeArray == NULL_POINT) { return ERR_NULL_POINT; } 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) { if (desLeArray == NULL_POINT) { return ERR_NULL_POINT; } 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(小端序)向芯片(大端序)發送數據
假設PC產生一個整數數值0x00000001,經通訊接口(好比串口)向芯片發送數據時,按照一次發一字節的方式傳輸數據,那麼此時芯片就會收到4字節數據,其內容按照地址從低到高排序爲0x01,0x00,0x00,0x00,那麼芯片就會認爲本身收到的整數數值爲0x01000000。
此時,兩個硬件平臺就會由於大小端的不一樣形成數據收發錯誤,此時解決的方法有兩種:一、PC發送數據以前,經過轉換函數ConverseUItoBeArray,將整數數值0x00000001轉換成[00,00,00,01]字符數組,而後經通訊接口發給芯片;二、芯片接收到4字節數據以後,經過函數ConverseArrayToLeUI,將[01,00,00,00]轉換成整數0x00000001。
四、使用總結
(1)不一樣的硬件平臺若是採用同一種類型的端序,計算/使用時無需轉序;
(2)不一樣的硬件平臺若是採用不一樣類型的的端序,但傳輸的字符數組「無需」轉換成多字節基本類型數據(如int,double,float)時,計算/使用時無需轉序;
(3)不一樣的硬件平臺若是採用不一樣類型的的端序,但傳輸的字符數組「須要」轉換成多字節基本類型數據(如int,double,float)時,計算/使用時須要轉序;