C语言大小端转换实现

时间:2020-11-21
本文章向大家介绍C语言大小端转换实现,主要包括C语言大小端转换实现使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
  • 传统技能,移位操作:
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;
}