大小端定義:
大端模式:數據的高字節保存在內存的低地址中,數據的低字節保存在內存的高地址中;
小端模式:數據的高字節保存在內存的高地址中,數據的低字節保存在內存的低地址中;
舉個例子來說明,我們利用485進行通訊,采用的大端模式傳輸16進制數據為:01 23/ef 05,按照大端模式的數據為2301和05ef,轉化為10進制為8961和1519。說白了就是直接將數據拼接進行轉化。
應用場景:
網絡上數據傳輸上往往采用大端模式進行數據傳輸;跨硬件平臺進行數據傳輸,數據格式存在差異,存儲字節的順序可能不同;采用通訊協議每次傳輸數據的字節有一點限制等
例如char類型數據只占一個字節,傳輸可以直接傳輸,但是對于非char類型的數據,要在RS485,CAN通訊過程中就需要進行大小端數據的轉化。
c語言中大小端的實現:
注意在轉化過程中需要保持相同的大小端數據格式,不可以形成同一組數據中同時存在大端和小端數據,容易讓使用者或者二次開發者產生誤解。
z這里主要講解大小端數據轉化的原理與相關的代碼:
首先常用的有16位數據和32位數據大小端轉化,作為嵌入式代表的STM32單片機的unsingned int型:
/* 32位數據小端模式 */
#define uint32_data(x) //定義32位數據,這里x為用戶自己定義的需要轉化的數據
(uint32_t)((((uint32_t)(x) & 0xff000000) >> 24) |\ //這里是ff000000不是ffff0000,按照每兩個字節進行的轉化
(((uint32_t)(x) & 0xff000000) >> 8) |\ //數據右移8位
(((uint32_t)(x) & 0x0000ffff) << 8) |\ //數據左移8位
(((uint32_t)(x) & 0x000000ff) << 24)\
)
/* 16位數據小端模式 */
#define uint16_data(x) //定義16位數據,這里x為用戶自己定義的需要轉化的數據
(uint16_t)((((uint16_t)(x) & 0x00ff) << 8) |\
((((uint16_t)(x) & 0xff00) >> 8) \
)
按照上述代碼測試一下,主函數調用一下,這里直接打印即可:
printf("%#x\n",uint32_data(0xef847321));
printf("%#x\n",uint16_data(0xef84));
輸出結果:
217384ef
84ef
假如需要將一個int型can_data
數據轉化為小端模式,可以嘗試如下代碼:
can_data[0] = (u8)(num & 0xFF); //取數據低8位
can_data[1] = (u8)((num >> 8) & 0xFF); //數據右移8位,將低位移除保留高位數據
假如需要將一個int型can_data
數據轉化為大端模式,可以嘗試如下代碼:
can_data[2] = (u8)((num >> 8) & 0xFF); //數據右移8位,將低位移除保留高位數據
can_data[3] = (u8)(num & 0xFF); //取數據為低8位
總結:
數據的大小端對不同平臺數據傳輸具有重要意義,在具體使用時需要根據需要進行數據轉化。
審核編輯:湯梓紅
-
數據傳輸
+關注
關注
9文章
1923瀏覽量
64685 -
硬件
+關注
關注
11文章
3348瀏覽量
66308 -
C語言
+關注
關注
180文章
7608瀏覽量
137140
發布評論請先 登錄
相關推薦
評論