node 16位 转24位_C代码实现16位和32位数据字节序转换

点击上方公众号名称关注,获得更多内容

9137b0b7a82b44c3287e8270d1374c65.gif ✎ 编 者 悟 语

     每天给自己一个存在的意识,这样才会有一颗认真的心。

文 章 导 读

   今天给大家用C代码实现下大小端字节序的转换代码,感谢的小伙伴可以拿下来撸一撸哈,希望对大家有所帮助哈,5769f473c3b4e4a5c1b2561175b78264.png

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语言相关的内容,大家敬请期待哈,9814e24c9db7a78b08c9fc8c1a73edff.png

    有问题可以后台留言交流,公众号18年后新申请的,文章后不支持留言功能的。

相关文章:

C语言中一个分号的奇迹(预处理、指针、结构体、内存分配)——一段暗藏玄机的代码

malloc为什么不能在函数体外给全局变量分配内存

宏分类的妙用(排版开始用模板)

内存分配函数malloc、calloc、realloc的功能测试

static关键字的3种特性

用结构体和指针模拟配置芯片引脚输出高低电平

进化论——从函数指针到被结构封装的函数指针及参数的应用举例

专辑推荐:

Python技能专辑

C语言专辑

IDE调试专辑

软件推荐专辑

软实力专辑

Linux专辑

扫码关注我们

9bc03421934f771247d57bbdd085f843.png

7a3736080a4228e9590efee1ba86fb1e.gif Game Over!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值