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

对事的看重与否,决定了事情完结后所能达到的效果。
文 章 导 读
今天给小伙伴们介绍下用C语言实现字节序交换的4种方式,大家可以根据需要选用,希望对小伙伴们有所帮助哈,!
1)关于字节序的说明
字节序有两种大端和小端。
大端:数据高位存放在低地址,地位放在高地址。如0x12345678在内存中存放为地址从左到右为低到高12345678。
小端:数据地位存放在低地址,高位存放在高地址。如0x12345678在内存中存放为地址从左到右为低到高78563412。
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];
*/
}
运行结果如下。
总结
今天给小伙伴们介绍下用C语言的指针、枚举数组、指针数组异或、移位与或运算4种方式实现字节序交换。后面还会有C语言相关的内容,大家敬请期待哈,。
有问题可以后台留言交流,公众号18年后新申请的,文章后不支持留言功能的。
相关文章:
C代码实现16位和32位数据字节序转换
C语言中的进制互转与数值和字符串互转的混搭玩法
C函数如何一次返回多个值呢?试试这3种方式吧!
原来数组还可以这么玩(宏把数组玩坏了)
利用结构数组和函数指针查找法调用函数
编程意识篇——用结构存储数据以减少函数二次调用,能替代return返回值吗
进化论——从函数指针到被结构封装的函数指针及参数的应用举例
专辑推荐:
Python技能专辑
C语言专辑
IDE调试专辑
软件推荐专辑
软实力专辑
Linux专辑
扫码关注我们
