宏实现大小端转换

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

测试输出结果:

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

  1. 使用函数实现数据大小端转换

    使用函数实现数据大小端转换 题目描述 在数字芯片设计中,经常把实现特定功能的模块编写成函数,在需要的时候再在主模块中调用,以提高代码的复用性和提高设计的层次,分别后续的修改. 请用函数实现一个4bit ...

  2. 自己实现了一个C语言例程,加深对宏、大小端、typeof宏、offsetof宏、指针变量、结构体、联合体的理解

    如题所述,最近时间在复习C语言.自己实现了一个C语言例程,以加深对宏.大小端.typeof宏.offsetof宏.指针变量.结构体.联合体的理解.关于细分知识后续有空再填充- swap宏的使用: 对应 ...

  3. c语言高低位拷贝_C语言中的大小端转换与高低位颠倒

    总结一下最近工作学到的东西,主要是关于大小端与高低位. 在说大小端高低位之前,肯定要说明数据在计算机内是如何存储的.在计算机中,我们将数据分割成了一个一个的字节(byte),而每个字节又有8位(bit ...

  4. 来点基础的东西,关于浮点数的大小端转换以及浮点数的格式解析

    在网上并没有任何信息或则资料介绍关于浮点数的大小端转换的原理的问题,大小端是不同的内存存储实现方式,大端更符合人的阅读习惯,而小端则是更适合CPU读取. 我先说整型,来说明大小端在内存中的存储方式,整 ...

  5. Verilog学习之数据大小端转换设计

    文章目录 前言 一.题目描述 二.实现思路 1.函数的概念 2.具体思路 三.代码展示 总结 前言 今天我们做的是第十道题--使用函数实现数据大小端转换,这道题其实也比较简单,就是逆向输出一个数据,但 ...

  6. C语言中的大小端转换与高低位颠倒

    在说大小端高低位之前,肯定要说明数据在计算机内是如何存储的.在计算机中,我们将数据分割成了一个一个的字节(byte),而每个字节又有8位(bit). 一个字节,可以声明为unsigned char型数 ...

  7. Linux大小端转换实现

    实现 #include <byteswap.h> #include <stdint.h>/*** @brief 8字节类型的字节序转化*/ template<class ...

  8. Java 大小端转换(基于ByteBuffer)

    大小端的基础知识: 小端 ( little-endian):低位字节在前,高位字节在后.大端(Big-Endian),则反之.具体而言,就是为了说清楚,CPU架构中1字(word)的存储顺序.计算机内 ...

  9. java大小端转换工具类

    最近的项目频繁涉及大小端转换的情况,参考github(https://github.com/Frank-Wiebeler/java-Big2LittleEndian/blob/master/src/c ...

  10. 大小端转换 int16 和int32

    int16 大小端转换: static inline uint16_t bswap_16(uint16_t x) {     return (x >> 8) | (x << 8 ...

最新文章

  1. android fragment概念,android Fragment相关概念简介
  2. WordPress中.user.ini 权限问题
  3. Raspberry Pi 3B 安装Miniconda
  4. Lesson 6. Scikit-Learn使用与进阶
  5. 北斗导航 | 卫星导航基础知识(卫星通信调制技术:信号调制、解调:ASK、FSK、PSK:FDMA、TDMA、CDMA、SDMA)
  6. spring-注入list集合对象(值是对象)
  7. 智慧交通day03-车道线检测实现03:相机校正和图像校正的实现
  8. 暑期实习NLP算法岗面经总结
  9. Java虚拟机-第二篇-GC算法与内存分配策略
  10. 附录 SpringBoot 默认的扫描包是哪个?
  11. 【重识 HTML + CSS】CSS 特性
  12. mongodb数据库恢复 mongo数据库无法启动恢复 mongodb数据库断电数据恢复
  13. 遥感导论网课_甘肃农业大学2019年地理信息科学专业专升本招生 专业课考试大纲...
  14. java变量和方法的覆盖和隐藏(翻译自Java Tutorials)
  15. jQuery File Upload blueimp with struts2 简单试用
  16. nupkg 本地安装_关于Visual Studio:如何在本地安装NuGet包.nupkg文件?
  17. 怎么修改PDF文件中的文字?快来学这两种方法
  18. android开机卡logo,logcat怎么抓log
  19. opencv打开mp4文件_OpenCV 实现播放本地mp4视频或远程服务mp4视频
  20. 来看看你的时间都去哪儿了

热门文章

  1. 串口软件与uPs测试,智能化UPS的软件设计及串口通信实现
  2. Shell编程入门学习
  3. ghost系统之优劣?
  4. 小甲鱼OD使用教程七----破解VisualSite Designer
  5. Unity 光照贴图.hdr转.png解决方案
  6. android遥控器:控制电脑上的暴风影音播放(C#作为服务端)
  7. 笔记:《深入浅出统计学》第十三章:假设检验(显著性检验)
  8. 秀米 html5 编辑工具,秀米编辑器
  9. Am2910的指令扩展
  10. 如何直观理解粒子滤波并进行Python编程实践