大小端定義:
大端模式:數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中;
小端模式:數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中;
舉個(gè)例子來(lái)說(shuō)明,我們利用485進(jìn)行通訊,采用的大端模式傳輸16進(jìn)制數(shù)據(jù)為:01 23/ef 05,按照大端模式的數(shù)據(jù)為2301和05ef,轉(zhuǎn)化為10進(jìn)制為8961和1519。說(shuō)白了就是直接將數(shù)據(jù)拼接進(jìn)行轉(zhuǎn)化。
應(yīng)用場(chǎng)景:
網(wǎng)絡(luò)上數(shù)據(jù)傳輸上往往采用大端模式進(jìn)行數(shù)據(jù)傳輸;跨硬件平臺(tái)進(jìn)行數(shù)據(jù)傳輸,數(shù)據(jù)格式存在差異,存儲(chǔ)字節(jié)的順序可能不同;采用通訊協(xié)議每次傳輸數(shù)據(jù)的字節(jié)有一點(diǎn)限制等
例如char類(lèi)型數(shù)據(jù)只占一個(gè)字節(jié),傳輸可以直接傳輸,但是對(duì)于非char類(lèi)型的數(shù)據(jù),要在RS485,CAN通訊過(guò)程中就需要進(jìn)行大小端數(shù)據(jù)的轉(zhuǎn)化。
c語(yǔ)言中大小端的實(shí)現(xiàn):
注意在轉(zhuǎn)化過(guò)程中需要保持相同的大小端數(shù)據(jù)格式,不可以形成同一組數(shù)據(jù)中同時(shí)存在大端和小端數(shù)據(jù),容易讓使用者或者二次開(kāi)發(fā)者產(chǎn)生誤解。
z這里主要講解大小端數(shù)據(jù)轉(zhuǎn)化的原理與相關(guān)的代碼:
首先常用的有16位數(shù)據(jù)和32位數(shù)據(jù)大小端轉(zhuǎn)化,作為嵌入式代表的STM32單片機(jī)的unsingned int型:
/* 32位數(shù)據(jù)小端模式 */
#define uint32_data(x) //定義32位數(shù)據(jù),這里x為用戶(hù)自己定義的需要轉(zhuǎn)化的數(shù)據(jù)
(uint32_t)((((uint32_t)(x) & 0xff000000) >> 24) |\ //這里是ff000000不是ffff0000,按照每?jī)蓚€(gè)字節(jié)進(jìn)行的轉(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為用戶(hù)自己定義的需要轉(zhuǎn)化的數(shù)據(jù)
(uint16_t)((((uint16_t)(x) & 0x00ff) << 8) |\
((((uint16_t)(x) & 0xff00) >> 8) \
)
按照上述代碼測(cè)試一下,主函數(shù)調(diào)用一下,這里直接打印即可:
printf("%#x\n",uint32_data(0xef847321));
printf("%#x\n",uint16_data(0xef84));
輸出結(jié)果:
217384ef
84ef
假如需要將一個(gè)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ù)
假如需要將一個(gè)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ù)的大小端對(duì)不同平臺(tái)數(shù)據(jù)傳輸具有重要意義,在具體使用時(shí)需要根據(jù)需要進(jìn)行數(shù)據(jù)轉(zhuǎn)化。
審核編輯:湯梓紅
-
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
1957瀏覽量
64858 -
硬件
+關(guān)注
關(guān)注
11文章
3391瀏覽量
66471 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137753
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
連接視覺(jué)語(yǔ)言大模型與端到端自動(dòng)駕駛
![連接視覺(jué)<b class='flag-5'>語(yǔ)言</b>大模型與<b class='flag-5'>端</b>到<b class='flag-5'>端</b>自動(dòng)駕駛](https://file1.elecfans.com/web1/M00/F4/82/wKgaoWcsaSCAanLQAAJKOrcQaug740.png)
C語(yǔ)言中的socket編程基礎(chǔ)
C語(yǔ)言中最常見(jiàn)的宏定義寫(xiě)法
工業(yè)制造行業(yè)的RFID讀寫(xiě)器形狀大小如何選型
![工業(yè)制造行業(yè)的RFID讀寫(xiě)器形狀<b class='flag-5'>大小</b>如何選型](https://file1.elecfans.com/web2/M00/09/8F/wKgZomcPJDuAcuolACi7-PLp3lg930.png)
放大器單端雙端輸出的區(qū)別
壓敏電阻的阻值大小和什么有關(guān)
![壓敏電阻的阻值<b class='flag-5'>大小</b>和什么有關(guān)](https://file1.elecfans.com/web2/M00/C6/8A/wKgZomYKYgyAZlGaAABBRa6XRlc286.png)
C2000?MCU的運(yùn)行時(shí)堆棧大小監(jiān)測(cè)
![<b class='flag-5'>C</b>2000?MCU的運(yùn)行時(shí)堆棧<b class='flag-5'>大小</b>監(jiān)測(cè)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
電容兩端的電壓由什么決定
比較器輸入端和輸出端的關(guān)系
MQTT客戶(hù)端棧大小分配過(guò)大而導(dǎo)致無(wú)法初始化怎么處理?
字傳輸不變的3種大小端處理方式
![字傳輸不變的3種<b class='flag-5'>大小</b><b class='flag-5'>端</b>處理方式](https://file1.elecfans.com/web2/M00/C7/86/wKgaomYLbsaARhI-AAAgcY7r28c170.png)
交換芯片緩沖區(qū)大小是什么
嵌入式系統(tǒng)中C語(yǔ)言結(jié)構(gòu)體的基礎(chǔ)實(shí)現(xiàn)與應(yīng)用
![嵌入式系統(tǒng)中<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>結(jié)構(gòu)體的基礎(chǔ)<b class='flag-5'>實(shí)現(xiàn)</b>與應(yīng)用](https://file1.elecfans.com/web2/M00/C4/E6/wKgaomXv9r6Aaj6DAAAYJ3PfWAU110.jpg)
C語(yǔ)言中的typedef的應(yīng)用
![<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>的typedef的應(yīng)用](https://file1.elecfans.com/web2/M00/C3/B9/wKgaomXn5LGAbFesAAAe4pvOxcc159.png)
評(píng)論