- 傳統技能,移位操作:
uint32_t a = 0xAABBCCDD;
a = ((a & 0x000000ff) << 24 ) | ((a & 0x0000ff00) << 8) | ((a & 0x00ff0000) >> 8) | ((a & 0xff000000 ) >> 24);
優點:簡單易懂,寫起來方便
缺點:看着比較費勁,不太美觀
- 使用union進行封裝
// 先定義個聯合體
typedef union _integer {
uint8_t bytes[4];
uint32_t value;
}Integer;
// 再寫個大小端交換方法
/**
* @brief 大小端交換
* @param data 原始值
* @param length 需要交換的字節長度
* @return next.value 字節交換后的值
* */
static uint32_t endianSwap(uint32_t data, uint32_t length) {
Integer raw, next;
uint32_t i = 0;
raw.value = data;
next.value = 0;
while(length > 0) {
next.bytes[i++] = raw.bytes[--length];
}
return next.value;
}
// 調用測試一下
int main(int argc, char *argv[]) {
uint32_t a = 0x11223344;
a = endianSwap(a, 1);
printf("0x%08x\n", a);
a = 0x11223344;
a = endianSwap(a, 2);
printf("0x%08x\n", a);
a = 0x11223344;
a = endianSwap(a, 3);
printf("0x%08x\n", a);
a = 0x11223344;
a = endianSwap(a, 4);
printf("0x%08x\n", a);
return 0;
}
// 測試結果
/*
0x00000044
0x00004433
0x00443322
0x44332211
Press any key to continue . . .
*/
優點:調用比較方便,易理解
缺點:代碼行數比傳統方法多,執行效率稍低
- 強制指針轉換
// 方法還是一樣,只是使用強制指針轉換實現
static uint32_t endianSwap(uint32_t data, uint32_t length) {
uint32_t next;
uint32_t i = 0;
while(length-- > 0) {
*(((uint8_t *)&next) + i++) = *(((uint8_t *)&data) + length);
}
return next;
}