点击上方公众号名称关注,获得更多内容
✎ 编 者 悟 语每天给自己一个存在的意识,这样才会有一颗认真的心。
文 章 导 读
今天给大家用C代码实现下大小端字节序的转换代码,感谢的小伙伴可以拿下来撸一撸哈,希望对大家有所帮助哈,!
1什么是字节序字节序是指多字节数据在内存中存储或者网络传输时各字节的存储顺序。
2为什么会出现字节序问题1)嵌入式中的字节序
在嵌入式中字节序,分为大端和小端。
小端:数据的低字节存储在内存的低地址,高字节存储在高地址。
大端:数据的高字节存储在内存的低地址,低字节存储在高地址。
2)为什么会出现字节序问题
字节序问题是一个历史发展问题,因为前期的CPU架构设计中,有的是大端有的是小端,前期“各自为政”,后来要“互通有无”,所以就出现了字节序转换的问题。
3C代码实现16/32位字节序的转换1)实现原理
以字节为单位进行高低字节交换、次高字节与次低字节交换。
2)实现代码
代码很简单,就不多说啥了,直接开撸吧!
#include
#include
#define uint16_t unsigned short int
#define int16_t signed short int
#define uint32_t unsigned int
#define int32_t signed int
int swap_uint16(uint16_t x);
int swap_int16(int16_t x);
int swap_uint32(uint32_t x);
int swap_int32(int32_t x);
int main(int argc, char *argv[]) {
int tmp1,tmp2,tmp3,tmp4;
uint32_t val_u32 = 0x12345678;
uint16_t val_u16 = 0x4567;
tmp1 = sizeof(uint32_t);
tmp2 = sizeof(int32_t);
tmp3 = sizeof(uint16_t);
tmp4 = sizeof(int16_t);
printf("\n1) 测试下数据类型长度(单位:字节):\n");
printf("\nThe uint32_t's size is :%d\n",tmp1);
printf("\n The int32_t's size is :%d\n",tmp2);
printf("\nThe uint16_t's size is :%d\n",tmp3);
printf("\n The int16_t's size is :%d\n",tmp4);
printf("\n\n2) 调用函数进行字节序交换:\n");
printf("\nThe val_u16's raw value is :0x%x\n",val_u16);
val_u16 = swap_uint16(val_u16);
printf("\nThe val_u16's swaped value is :0x%x\n",val_u16);
printf("\nThe val_u32's raw value is :0x%x\n",val_u32);
val_u32 = swap_uint32(val_u32);
printf("\nThe val_u32's swaped value is :0x%x\n",val_u32);
return 0;
}
int swap_uint16(uint16_t x){
int ret = 0;
ret = ( (uint16_t)((((x) & 0xFF) <8) | (((x) & 0xFF00) >> 8)) );
return ret;
}
int swap_int16(int16_t x){
int ret = 0;
ret = ( (int16_t)((((x) & 0xFF) <8) | (((x) & 0xFF00) >> 8)) );
return ret;
}
int swap_uint32(uint32_t x){
int ret = 0;
ret = ( (uint32_t)((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | (((x) & 0x0000ff00) <8) | (((x) & 0x000000ff) <24)) );
return ret;
}
int swap_int32(int32_t x){
int ret = 0;
ret = ((int32_t)((((uint32_t)(x)) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | (((x) & 0x0000ff00) <8) | (((x) & 0x000000ff) <24));
return ret;
}
总结
今天用C代码实现了16位和32位数据字节序转换的代码,只验证了两种无符号整型,其他两种也有实现,感兴趣的话小伙伴们可以弄下来自己撸一撸哈,后面还会有C语言相关的内容,大家敬请期待哈,。
有问题可以后台留言交流,公众号18年后新申请的,文章后不支持留言功能的。
相关文章:
C语言中一个分号的奇迹(预处理、指针、结构体、内存分配)——一段暗藏玄机的代码
malloc为什么不能在函数体外给全局变量分配内存
宏分类的妙用(排版开始用模板)
内存分配函数malloc、calloc、realloc的功能测试
static关键字的3种特性
用结构体和指针模拟配置芯片引脚输出高低电平
进化论——从函数指针到被结构封装的函数指针及参数的应用举例
专辑推荐:
Python技能专辑
C语言专辑
IDE调试专辑
软件推荐专辑
软实力专辑
Linux专辑
扫码关注我们
❖ Game Over!