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

news/2024/6/3 16:42:13 标签: C/C++, 单片机, stm32

宏实现大小端转换

#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次转换回来的值
}

测试输出结果:

 


http://www.niftyadmin.cn/n/1757668.html

相关文章

C语言 printf 打印double、float类型

#include <stdio.h> //库头文件/********************************************************************************* brief 主 函数* param None* return None* note *******************************************************************************/ void…

环形队列 代码

/** copyright Copyright(c)2014-2011 XXXX Co.,Ltd. All rights reserved.******************************************************************************* file queue.h* brief * details * author 匠在江湖(ID:1234)* version V1.0* date 2…

环形队列串口通信

/** copyright Copyright(c)2014-2011 XXXX Co.,Ltd. All rights reserved.******************************************************************************* file uart.h* brief * details * author 匠在江湖(ID:1234)* version V1.0* date 20…

单片机(嵌入式)程序分层架构

目录 前言 嵌入式3层软件架构 嵌入式4层软件架构-1 驱动层 操作系统层 中间件层 应用层 嵌入式4层软件架构-2 硬件层 嵌入式微处理芯片 嵌入式存储器系统 嵌入式I/O接口 中间层 系统软件层 RTOS 文件系统 GUI 应用层 嵌入式5层软件架构1 嵌入式5层软件架构…

BC3.1精简版win7/10下不兼容问题的解决

在学习 任哲《嵌入式实时操作系统 uCOS-II 原理及应用》中出现BC3.1精简版在win7/10不兼容问题&#xff0c;查阅了大量资料是使用 DOS 模拟软件 DOSBox 来解决此问题。 一、BC3.1精简版 安装 1&#xff0c;为DOS 模拟软件虚拟一个工作 C盘。 在D盘 (不要在C盘)建立个 文件夹 …

DOSBox中 tlink @testlink引用连接文件命令的实现

一&#xff0c;BC3.1引用连接文件的格式 tlink 连接文件名 注意&#xff1a;连接文件名 是 包含扩展 在内的 文件名哦&#xff01;tlink允许连接文件没有扩展名 win7修改文件的扩展名https://jingyan.baidu.com/article/4e5b3e1943c681d0901e24e3.html 二&#xff0c;在DOSBo…

Windows10下搭建汇编语言开发环境

原文&#xff1a; https://baijiahao.baidu.com/s?id1728544148965678590&wfrspider&forpc Windows10下搭建汇编语言开发环境 前言 本学期学校安排有汇编语言这门课,需要自己搭建汇编语言开发环境,特此写下本文记录搭建过程. 关于搭建汇编语言开发环境的教程,我也…

如何创建 makefile文件

在学习 任哲《嵌入式实时操作系统 uCOS-II 原理及应用》中如何创建makefile文件呢&#xff1f; 1&#xff0c;创建一个名为makefile的文件&#xff08;取消扩展名&#xff09; 输入下面命令示例内容 target1: md 11 target2: md 22 target3: rd 11 rd 22 2&am…