C語言大小端轉換實現
阿新 • • 發佈:2020-11-22
- 傳統技能,移位操作:
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;
}