c语言中如何实现结构体内容的交换_C语言实现数据字节序交换的四种方式

本文介绍了C语言中实现字节序交换的四种方法:指针、枚举数组、指针数组异或和移位与或运算,并提供了实际代码示例,涉及2字节和4字节的交换。文章适用于需要进行字节序转换的C语言开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

b6e596c5c0eb4c40ea14457e7ac9260a.gif ✎ 编 者 悟 语

     对事的看重与否,决定了事情完结后所能达到的效果。

文 章 导 读

   今天给小伙伴们介绍下用C语言实现字节序交换的4种方式,大家可以根据需要选用,希望对小伙伴们有所帮助哈,7ed57d2c1e9ddc13eeae8eb254a4a980.png

1关于数据字节序的说明

    1)关于字节序的说明

    字节序有两种大端和小端。

    大端:数据高位存放在低地址,地位放在高地址。如0x12345678在内存中存放为地址从左到右为低到高12345678。 

    小端:数据地位存放在低地址,高位存放在高地址。如0x12345678在内存中存放为地址从左到右为低到高78563412。

dbcb8e2c3f34e0c487e609370724de00.png

    2)关于字节序交换方式的说明

    ① 指针实现方式。

    指针实现数据交换。

    ② 枚举数组实现方式。

    枚举数组实现数据交换。

    ③ 指针数组异或实现方式。

    指针数组存储数据,用异或的方式实现字节的交换。

    ④ 移位与、或运算方式。

    用位操作的与屏蔽和或连接数据的方式重新拼接数据,见我前面的文章——C代码实现16位和32位数据字节序转换。

2实例代码

    实际代码如下,下面代码基本上都实现了有2字节和4字节的交换方式,其中2字节的交换方式注释掉了。

#include 
#include 

// 枚举数组法枚举结构
union byte
{
     short int byte;
     char array[4];
}; 

// 函数声明
void PtrByteSwap(char *ptr,int nbytes);
void UnionByteSwap(char *ptr,int nbytes);
void ArraySwap(int *dat);

int main(int argc, char *argv[]) 
{
     unsigned int test_val1 = 0x1234;
     unsigned int test_val2 = 0x12345678;
     unsigned int test_val3 = 0x12345678;

     // 指针方式实现
     PtrByteSwap(&test_val1,4);
     printf("\nThe 0x1234 swaped data is: 0x%x\n",test_val1);
 
     // 枚举数组实现方式 
     UnionByteSwap(&test_val2,4);
     printf("\nThe 0x12345678 swaped data is:0x%x\n",test_val2);

     // 指针数组异或方式实现 
     ArraySwap(&test_val3);
     printf("\nThe 0x12345678 swaped data is:0x%x\n",test_val3);
 
     // 移位与、或运算方式实现见前期文章 
 
     return 0;
}

/* 指针法 */
// 适合两字节交换,可参考枚举法实现4字节交换 
void PtrByteSwap(char *ptr,int nbytes)
{

     char *p = ptr; 
 
     while(nbytes-- > 0)
     {
          char tmp = *p;
          *p = *(p+1);
          *(p+1) = tmp; 
  
          p += 2;
     }   
}


/* 枚举法,适合4个字节*/

void UnionByteSwap(char *ptr,int nbytes)
{

     register union byte *wp=(union byte *)ptr; 
 
     while(nbytes-- > 0)
     {
          char tmp = wp->array[0]; 
          wp->array[0] = wp->array[3]; 
          wp->array[3]= tmp; 
  
          tmp = wp->array[1]; 
          wp->array[1] = wp->array[2]; 
          wp->array[2]= tmp; 
          wp++;
     } 
}

/* 适合交换两个字节 
void UnionByteSwap(char *ptr,int nbytes)
{

     register union byte *wp=(union byte *)ptr; 
 
     while(nbytes-- > 0)
     {
          char tmp = wp->array[0]; 
          wp->array[0] = wp->array[1]; 
          wp->array[1 ]= tmp; 
          wp++;
     }
 
}
*/

/* 数组异或法 */

void ArraySwap(int *dat)
{
     char *ptr = (char *)dat;
    
     // 4字节数据字节序调整,2字节改为二维数组,借助临时变量进行对调即可 
     ptr[0] ^= ptr[3];
     ptr[3] ^= ptr[0];
     ptr[0] ^= ptr[3];
    
     ptr[1] ^= ptr[2];
     ptr[2] ^= ptr[1];
     ptr[1] ^= ptr[2];
/*   
     // 交换2字节
     ptr[0] ^= ptr[1];
     ptr[1] ^= ptr[0];
     ptr[0] ^= ptr[1]; 
*/     
}

    运行结果如下。

15ee9ae64f4e5c7b0fafd5829bad05e7.png

总结

    今天给小伙伴们介绍下用C语言的指针、枚举数组、指针数组异或、移位与或运算4种方式实现字节序交换。后面还会有C语言相关的内容,大家敬请期待哈,fa40f88f3e433f620cb45ba879e3b89a.png

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

相关文章:

C代码实现16位和32位数据字节序转换

C语言中的进制互转与数值和字符串互转的混搭玩法

C函数如何一次返回多个值呢?试试这3种方式吧!

原来数组还可以这么玩(宏把数组玩坏了)

利用结构数组和函数指针查找法调用函数

编程意识篇——用结构存储数据以减少函数二次调用,能替代return返回值吗

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

专辑推荐:

Python技能专辑

C语言专辑

IDE调试专辑

软件推荐专辑

软实力专辑

Linux专辑

扫码关注我们

a04daf9c8e4ca5564135482ef79fa19d.png

e08e02b1d37c6368c98676d5aa20c86d.gif Game Over!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值