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

C語言中結(jié)構(gòu)體與聯(lián)合體的深度解析:內(nèi)存布局與應(yīng)用場景
EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù)

連接視覺語言大模型與端到端自動駕駛

C語言中的socket編程基礎(chǔ)
工業(yè)制造行業(yè)的RFID讀寫器形狀大小如何選型

放大器單端雙端輸出的區(qū)別
壓敏電阻的阻值大小和什么有關(guān)

C2000?MCU的運行時堆棧大小監(jiān)測

評論