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;
}
原文地址:https://www.cnblogs.com/yanye0xff/p/14017589.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- NSum及股票系列
- 从0开始搭建编程框架——主框架和源码
- C++拾取——使用stl标准库生成等差、等比数列的方法
- C++拾取——使用stl标准库实现排序算法及评测
- 机器人实践课程镜像分享及使用说明(Arduino+ROS1+ROS2+Gazebo+SLAM+...)
- ROS 2 Foxy Fitzroy遇见Ubuntu 20.04
- ROS Noetic Ninjemys遇见Ubuntu 20.04
- Kustomize ConfigMapGenerate自动生成ConfigMap中的坑
- ThreadLocal的使用及原理
- 参数绑定
- ndn挖坑记(一)
- Python之QQ邮箱告警脚本
- 访问令牌JWT
- Java集成JWT
- Computer Graphics note(3):视口变换&光栅化