大小端转换代码(宏、函数方式)(浮点、整数)

宏实现大小端转换

#define BIG_LITTLE_SWAP16(x)        ( (((*(short int *)&x) & 0xff00) >> 8) | \
                                      (((*(short int *)&x) & 0x00ff) << 8) )

#define BIG_LITTLE_SWAP32(x)        ( (((*(long int *)&x) & 0xff000000) >> 24) | \
                                      (((*(long int *)&x) & 0x00ff0000) >> 8) | \
                                      (((*(long int *)&x) & 0x0000ff00) << 8) | \
                                      (((*(long int *)&x) & 0x000000ff) << 24) )

#define BIG_LITTLE_SWAP64(x)        ( (((*(long long int *)&x) & 0xff00000000000000) >> 56) | \
                                      (((*(long long int *)&x) & 0x00ff000000000000) >> 40) | \
                                      (((*(long long int *)&x) & 0x0000ff0000000000) >> 24) | \
                                      (((*(long long int *)&x) & 0x000000ff00000000) >> 8) | \
                                      (((*(long long int *)&x) & 0x00000000ff000000) << 8) | \
                                      (((*(long long int *)&x) & 0x0000000000ff0000) << 24) | \
                                      (((*(long long int *)&x) & 0x000000000000ff00) << 40) | \
                                      (((*(long long int *)&x) & 0x00000000000000ff) << 56) )

函数实现大小端转换

/**
  ******************************************************************************
  * @brief   大小端转换 函数
  * @param   *p     数据块指针
  * @param   size   字节数
  * @return  None
  * @note    
  ******************************************************************************
  */
void BigLittleEndianSwap(unsigned char *p, unsigned char size)
{
	unsigned char i;
	unsigned char tmp;
	unsigned char num = size/2;
	size--;
    for(i=0; i<num; i++)
    {
	    tmp = p[i];
	    p[i] = p[size-i];
		p[size-i] = tmp;
	}
}

测试、验证 大小端转换函数

#include <stdio.h> //库头文件

/**
  ******************************************************************************
  * @brief   主 函数
  * @param   None
  * @return  None
  * @note    测试验证上面的函数与宏
  ******************************************************************************
  */
void main(void)
{
	unsigned char i;
	short int tmp;
	long int ltmp;
	long long int lltmp;
    float ftmp;
    double fftmp;
    unsigned char *p;
//**判断CPU大小端模式 *************************************
	tmp = 0x1234;
    p = (unsigned char *)&tmp;    
    if(*p == 0x34)
    {
        printf("小端模式\r\n"); //最低字节,首先存储低地址。
    }
    else //(*p == 0x12)
    {
        printf("大端模式\r\n"); //最高字节,首先存储低地址。
    }
//**int 大小端转换 ****************************************
    printf("0x%04X \r\n", tmp); //转换前
    
    p = (unsigned char *)&tmp;
    for(i=0; i<2; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
    BigLittleEndianSwap((unsigned char *)&tmp, 2); //函数转换
    p = (unsigned char *)&tmp;
    for(i=0; i<2; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
    tmp = BIG_LITTLE_SWAP16(tmp); //宏转换
    p = (unsigned char *)&tmp;
    for(i=0; i<2; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
   	printf("0x%04X \r\n\r\n", tmp); //经过2次转换回来的值
//**long 大小端转换 ***************************************
	ltmp = 0x12345678;
   	printf("0x%08X \r\n", ltmp); //转换前
    
    p = (unsigned char *)&ltmp;
    for(i=0; i<4; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
    BigLittleEndianSwap((unsigned char *)&ltmp, 4); //函数转换
    p = (unsigned char *)&ltmp;
    for(i=0; i<4; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
   	ltmp = BIG_LITTLE_SWAP32(ltmp); //宏转换
    p = (unsigned char *)&ltmp;
    for(i=0; i<4; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
   	printf("0x%08X \r\n\r\n", ltmp); //经过2次转换回来的值
//**long long 大小端转换 **********************************
	lltmp = 0x1234567801234567;
   	printf("0x%016llX \r\n", lltmp); //转换前
    
    p = (unsigned char *)&lltmp;
    for(i=0; i<8; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
    BigLittleEndianSwap((unsigned char *)&lltmp, 8); //函数转换
    p = (unsigned char *)&lltmp;
    for(i=0; i<8; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
   	lltmp = BIG_LITTLE_SWAP64(lltmp); //宏转换
    p = (unsigned char *)&lltmp;
    for(i=0; i<8; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
   	printf("0x%016llX \r\n\r\n", lltmp); //经过2次转换回来的值
//**float 大小端转换 **************************************
	ftmp = 1.234568;
    printf("%f \r\n", ftmp); //转换前
    
    p = (unsigned char *)&ftmp;
    for(i=0; i<4; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
    BigLittleEndianSwap((unsigned char *)&ftmp, 4); //函数转换
    p = (unsigned char *)&ftmp;
    for(i=0; i<4; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
    *(long int *)&ftmp = BIG_LITTLE_SWAP32(ftmp); //宏转换
    p = (unsigned char *)&ftmp;
    for(i=0; i<4; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
    printf("%f \r\n\r\n", ftmp); //经过2次转换回来的值
//**double 大小端转换 **********************************
	fftmp =  1.234568901234;
    printf("%.12lf\r\n", fftmp); //转换前
    
    p = (unsigned char *)&fftmp;
    for(i=0; i<8; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
    BigLittleEndianSwap((unsigned char *)&fftmp, 8); //函数转换
    p = (unsigned char *)&fftmp;
    for(i=0; i<8; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
   	*(long long int *)&fftmp = BIG_LITTLE_SWAP64(fftmp); //宏转换
    p = (unsigned char *)&fftmp;
    for(i=0; i<8; i++)
    {
    	printf("0x%02hhX ", *p++);	
	}
    printf("\r\n");
    
    printf("%.12lf\r\n", fftmp); //经过2次转换回来的值
}

测试输出结果:

 

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值