題目:獲取0x12345678各個字節(jié)。
方法一:結構&聯合
#include?
typedef?unsigned?int??uint32_t;
typedef?unsigned?char?uint8_t;
union?bit32_data
{
????uint32_t?data;
????struct?
????{
????????uint8_t?byte0;
????????uint8_t?byte1;
????????uint8_t?byte2;
????????uint8_t?byte3;
????}byte;
};
int?main(void)
{
????union?bit32_data?num;
????
????num.data?=?0x12345678;
????printf("byte0?=?0x%x\n",?num.byte.byte0);
????printf("byte1?=?0x%x\n",?num.byte.byte1);
????printf("byte2?=?0x%x\n",?num.byte.byte2);
????printf("byte3?=?0x%x\n",?num.byte.byte3);
????return?0;
}
運行結果:
這種方法的缺點是:會受到大小端的影響。只有在明確大小端的情況下可稍微用一用。以上是小端模式下的運行結果。
結構&聯合法不僅僅是在獲取數據各個字節(jié)有用,在數據協議、數據位拆分等方面很實用,之后再做更詳細的分享。大小端推薦文章:《CPU 的大小端模式?》
方法二:移位操作
#include?
#define?GET_LOW_BYTE0(x)?((x?>>??0)?&?0x000000ff)?/*?獲取第0個字節(jié)?*/
#define?GET_LOW_BYTE1(x)?((x?>>??8)?&?0x000000ff)?/*?獲取第1個字節(jié)?*/
#define?GET_LOW_BYTE2(x)?((x?>>?16)?&?0x000000ff)?/*?獲取第2個字節(jié)?*/
#define?GET_LOW_BYTE3(x)?((x?>>?24)?&?0x000000ff)?/*?獲取第3個字節(jié)?*/
int?main(void)
{
?unsigned?int?a?=?0x12345678;
?
?printf("byte0?=?0x%x\n",?GET_LOW_BYTE0(a));
?printf("byte1?=?0x%x\n",?GET_LOW_BYTE1(a));
?printf("byte2?=?0x%x\n",?GET_LOW_BYTE2(a));
?printf("byte3?=?0x%x\n",?GET_LOW_BYTE3(a));
?return?0;
}
運行結果:
這也是獲取數據各個字節(jié)的最常用也最有效的方法。這種類似的位操作在嵌入式方面應用得很多,比如在LCD操作中表示像素顏色值、FLASH的操作等方面都有用到。位操作推薦文章:《C語言、嵌入式位操作精華技巧大匯總》
最后
以上就是本次的分享,如果覺得文章不錯,轉發(fā)、在看,也是我們繼續(xù)更新的動力。
猜你喜歡:
嵌入式大雜燴讀者福利:第二期
2020年精選原創(chuàng)筆記匯總
干貨 | protobuf-c之嵌入式平臺使用
1024G 嵌入式資源大放送!包括但不限于C/C++、單片機、Linux等。在公眾號聊天界面回復1024,即可免費獲??!
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!