大小端转换(一篇文章了解所有情况下的大小端转换方法)

2023-05-16

总述:

字节间字节内
大端低地址的数据放在高字节位域:先从低地址对应数据字节的高bit开始分配
小端低地址的数据放在低字节位域:先从低地址对应数据字节的低bit开始分配

注释:
对于大小端的几个结论:
1.char型变量和char型数组没有大小端的区分。
2.需要转化数据类型大于1个字节的数据类型:short,int,枚举,联合体等。
一.为什么要进行大小端转化?
简单说一下为什么要进行大小端转化:目前我接触到的,arm是小端,dsp是大端,电脑是小段,网络数据一般为大端,当arm需要和dsp通信的时候就会存在大小端转化的问题,每种芯片为什么选用大小端的由来就不赘述了。
二、字节间的大小端转化:
1,举例说明字节间的大小端:
内存中有如下一段数据(unsigned int 型),不同的大小端对这个段数据的理解不同,所以在我们实际工作中,当你查看到内存中的数据时候,首先要清楚这个处理器的大小端,才能理解这段数实际代表的值。

内存地址0x000040000x000040010x000040020x00004003
0X120x340x560X78

如果是大端处理器:这段数代表:0x12345678;
如果是小段处理器:这段数代表:0x78563412 ;
内存中有如下一段数据(unsigned short 型):

内存地址0x000040000x00004001
0X120x34

如果是大端处理器:这段数代表的值:0x1234;
如果是小段处理器:这段数代表的值:0x3412 ;
在两个不同大小端的处理器之间数据传输,数据再内存的存放顺序并没有变,不同大小端需要解读出通用的值,就需要进行大小端转化。
2,C语言大小端转化调用库函数:

htonlhost to network ,l代表unsigned long型 也可以看成unsigned int
htonshost to network ,s代表unsigned short型
ntohlnetwork to host ,l代表unsigned long型 也可以看成unsigned int
ntohsnetwork to host ,s代表unsigned short型

在网络传输中,一般要求是大端,而inter处理器是小端,network to host理解为大端转小端,而host to network 理解为小端转大端,本质上大端小端的转化算法是一致的,没有区别,
3.代码验证:

/*
*程序说明:大小端字节间转化的一个案例
*作者    :通信小卒
*时间    :2019.8.25
*/
#include<stdio.h>
#include<Winsock2.h>
#pragma comment(lib,"ws2_32.lib")

int main(void)
{
   unsigned int   ultest=0x12345678;
   unsigned short ustest=0x1234;

   printf("ultest小端:%x\n",ultest);
   printf("ustest小端:%x\n",ustest);
   ultest=htonl(ultest);/*unsigned int   大小端转化*/
   ustest=htons(ustest);/*unsigned short 大小端转化*/
   printf("ultest大端:%x\n",ultest);
   printf("ustest大端:%x\n",ustest);
   while(1);
}

在这里插入图片描述
三.对于字节内部位域大小端的理解与处理:
1.位域处理方法(特别注意):
大小端不同的芯片传递同一个结构体时,
第一步:需要将结构体中的位域部分根据大小端判断进行翻转(int型按照凑32bits翻转,short型凑16bits翻转 ,char型凑8bits翻转)。
第二步:接收到数据后,如果位域的数据类型是unsigned int型,就拼凑成32bits按照unsigned int进行大小端转化,如果是unsigned short 型就拼凑16bit按照unsigned short 进行大小端转化,如果是unsigned char型就不翻转。
2.案例说明位域的存储方式:

/*
*程序说明:位域大小端字节转化的一个案例
*作者    :通信小卒
*时间    :2019.8.25
*/
#include<stdio.h>
#include<string.h>

#define  LOCAL_ENDIAN   1  /* 0为大端  1 为小端,根据处理器的类型赋值*/

typedef  struct  struct_test
{
#ifdef  LOCAL_ENDIAN
  unsigned int  ula :7;
  unsigned int  ulb :2;
  unsigned int  ulc :5;
  unsigned int  uld :3;
  unsigned int  ule :6;
  unsigned int  ulf :4;
  unsigned int  ulg :5;
#else
  unsigned int  ulg :5;
  unsigned int  ulf :4;
  unsigned int  ule :6;
  unsigned int  uld :3;
  unsigned int  ulc :5;
  unsigned int  ulb :2;
  unsigned int  ula :7;
#endif 
}struct_test_bit;

int main(void)
{
    struct_test_bit  struct_test_endian;
	
	memset(&struct_test_endian,0,sizeof(struct_test_bit));

   struct_test_endian.ula=0x57;
	struct_test_endian.ulb=0x3;
	struct_test_endian.ulc=0x1c;
	struct_test_endian.uld=0x6;
    struct_test_endian.ule=0x2d;
	struct_test_endian.ulf=0x9;
	struct_test_endian.ulg=0x1c;

	printf("&struct_test_endian=%x\n",&struct_test_endian);
    while(1);
}

处理LOCAL_ENDIAN 不同,其他代码完全相同,在大小端不同的处理器上运行此代码,分析内存情况:

2.1在小端处理器下看内存(#define LOCAL_ENDIAN 1 ):

地址0X004AFC140X004AFC150X004AFC160X004AFC17
数据十六进制D7B9DBE4
数据二进制11010111101110011101101111100100

跨字节的部分需要特别注意:
在这里插入图片描述
小端数据为:0x E4BDB9D7, 现将数据进行翻转看,然后从底地址数据开始读:
在这里插入图片描述

可以看出小端是从底地址的字节的底bit位开始分配。
2.2在大端处理器运行看内存(#define LOCAL_ENDIAN 0):

地址0X004AFC140X004AFC150X004AFC160X004AFC17
数据十六进制E4DBB9D7
数据二进制11100100110110111011100111010111

跨字节的部分需要特别注意:
在这里插入图片描述
三.对于枚举类型与联合体类型的处理。
1.对于枚举类型按照unsigned int进行大小端转化就可以。
2.对于联合体按照联合体中长度最长的数据类型以及长度进行转化就行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大小端转换(一篇文章了解所有情况下的大小端转换方法) 的相关文章

  • (二)五次多项式轨迹规划

    一 三次多项式轨迹规划的缺陷 上一篇文章说道 xff0c 三次多项式轨迹规划只能够保证速度和位移连续 xff0c 并不能保证加速度连续 加速度不连续将会对使电机抖动 甚至冲击 二 轨迹规划中的五次多项式 我们对加速度数值进行指定 xff0c
  • (三)抛物线过渡的线性函数规划

    前面说到 xff0c 无论是三次还是五次多项式进行规划存在以下缺点 xff1a 位移往返没有匀速段 这一节中 xff0c 我们的研究对象是初速度和末速度都为0关节运动 一 无过渡线性函数 假设时刻 t t t 和角度
  • GCC的学习(二)头文件及其库制作

    当前目录 43 相对路径 61 绝对路径大写i xff0c I头文件包含路径大写l xff0c L库文件路径小写l xff0c l库名字 xff08 去头去尾没有lib xff0c 也没有so ldd 查看动态库连接库存在性及其路径nm 查
  • VSCODE(八)launch 调试与运行

    前面讲了如何配置任务文件tasks json xff0c 调试功能在程序程序经常会用上 xff0c 那么VSCODE是完成调试功能的呢 xff1f 答 xff1a vscode文件夹内的launch json文件配置 xff0c 一些调试器
  • C++11线程库 (七) 线程的停止

    在这篇文章里 xff0c 我们将会讨论如何在C 43 43 11下停止和终止一个线程 为什么C 43 43 11不直接提供一个停止线程的方法 xff1f 这是因为线程在停止之前可能有一些资源需要被释放 关闭 xff0c 比如说 xff1a
  • QCustomplot(五)QCPAxisRect进行子绘图

    子绘图是比较复杂的 xff0c 你几乎需要掌握QCustomPlot所有类及其含义 那么需要掌握的类有 xff1a QCPAxis 描述轴行为 xff0c 轴需要依赖QCPAxisRectQCPAxisRect 描述矩形区域 xff0c 区
  • 关于C/C++的换行

    可以分为两种情况 xff1a 代码换行长字符串换行 一 C C 43 43 代码换行直接用enter键换行 xff0c 同时注意关键字不要切割 xff1a span class token keyword bool span a span
  • 31线性变换及其矩阵

    一 线性变换的概念 线性变换是数学中一种特殊的映射 xff0c 它具有将向量空间中的元素转换到另一向量空间元素的功能 xff0c 同时也保持了变换前后向量的线性不变的性质 线性变换的数学表达式如下 xff1a T c
  • 30奇异值分解

    在讲SVD之前 xff0c 我们先来看看计算是如何存储一个灰度图的 灰度图会被分割成一块块的小灰度像素 xff0c 然后进行存储 xff0c 数值的大小表示灰度的程度 一个灰度像素用8位进行存储 xff0c 也就是256种状态 xff0c
  • (二)PID控制的Anti-windup

    比例环节 xff1a 快速接近目标积分环节 xff1a 防止稳态误差微分环节 xff1a 减少振荡 被控对象可以分为两个部分 xff0c 分别是执行器 xff0c 用于产生力或者能量从而改变系统 xff0c 和处理 xff0c 比如说温控的
  • Socket的学习(一)什么是Socket?

    本文参考的是 Socket通信原理 https www cnblogs com wangcq p 3520400 html 一 TCP IP UDP是什么 xff1f TCP IP xff08 Transmission Control Pr
  • Socket的学习(二)AF_UNIX实现本地通信

    参考文章 xff1a 1 Unix Domain Socket IPC通信机制 2 How fast are Unix domain sockets 3 read 函数参数理解 一 Unix域的Socket通信及其优点 基于socket的框
  • 工程师笔记|在CMD窗口运行C语言

    cmd窗口大家可能都比较熟悉 xff0c 那如何在cmd窗口编译运行C语言程序呢 xff1f 其实很简单的 xff0c 只需要下载一个C C 43 43 编译器 xff0c 添加一下环境变量 xff0c 之后就能在cmd窗口中编译运行C语言
  • 推挽输出与开漏输出

    推挽输出 要理解推挽输出 xff0c 首先要理解好三极管 xff08 晶体管 xff09 的原理 下面这种三极管有三个端口 xff0c 分别是基极 xff08 Base xff09 集电极 xff08 Collector xff09 和发射
  • 固件、驱动、软件的区别

    不管我们使用什么操作系统 xff0c 无论是 Windows macOS xff0c 还是 Linux xff0c 里面都安装了许多软件 驱动程序和固件 但是 xff0c 这三者概念有什么区别 xff1f 转载微信公众号 xff1a 良许L
  • 51单片机与STM32的区别(为何51单片机IO引脚的驱动能力弱)

    1 51单片机的特性 51单片机之所以成为经典 xff0c 成为易上手的单片机主要有以下特点 xff1a 从内部的硬件到软件有一套完整的按位操作系统 xff0c 称作位处理器 xff0c 处理对象不是字或字节而是位 不但能对片内某些特殊功能
  • I2C—读写EEPROM

    1 I2C协议简介 I2C通讯协议 Inter xff0d IntegratedCircuit 是由Phiilps公司开发的 xff0c 由于它引脚少 xff0c 硬件实现简单 xff0c 可扩展性强 xff0c 不需要USART CAN等
  • SPI—读写串行FLASH

    1 SPI协议简介 SPI协议是由摩托罗拉公司提出的通讯协议 SerialPeripheralInterface xff0c 即串行外围设备接口 xff0c 是一种高速全双工的通信总线 它被广泛地使用在ADC LCD等设备与MCU间 xff
  • C语言中的关键字应用技巧(volatile、const、struct/union、_ _预定义_ _、#/##、void/void*、weak)

    嵌入式C开发关键字的应用技巧 1 volatile volatile修饰表示变量是易变的 xff0c 编译器中的优化器在用到这个变量时必须每次都小心地从内存中重新读取这个变量的值 xff0c 而不是使用保存在寄存器里的备份 xff0c 有效
  • 一文弄懂GPIO不同模式之间的区别与实现原理

    GPIO全称General Purpose Input Output xff0c 即通用输入 输出 其实GPIO的本质就是芯片的一个引脚 xff0c 通常在ARM中所有的I O都是通用的 不过 xff0c 由于每个开发板上都会设计不同的外围

随机推荐

  • printf()是如何与UART外设驱动函数“勾搭”起来的?

    今天给大家分享的是IAR下调试信息输出机制之硬件UART外设 在嵌入式世界里 xff0c 输出打印信息是一种非常常用的辅助调试手段 xff0c 借助打印信息 xff0c 我们可以比较容易地定位和分析程序问题 在嵌入式应用设计里实现打印信息输
  • 卡塔尔世界杯:带“芯片”的智能足球亮相!背后藏着哪些技术原理?

    2022年卡塔尔世界杯正式开幕 xff01 揭幕战上 xff0c 厄瓜多尔队以2 0的比分击败东道主卡塔尔队 xff0c 取得本届世界杯的首场胜利 本场比赛后 xff0c 世界杯东道主首战不败的纪录就此作古 xff0c 这一消息也引发足球圈
  • 串口通信详解

    一 串口通讯简介 串口通信 Serial Communications 的概念非常简单 xff0c 串口按位 bit 发送和接收字节 尽管比按字节 byte 的并行通信慢 xff0c 但是串口可以在使用一根线发送数据的同时用另一根线接收数据
  • C++类详解(public、private、protected)

    二 C 43 43 类的声明 类使用class关键字声明 xff0c 声明方法如下 xff1a class 类名 xff1a public 公有成员 int num private 私有成员 int age protected 保护成员 i
  • linux下网络通信(udp通信协议详解)

    一 udp通信简介 udp是User Datagram Protocol的简称 xff0c 中文名是用户数据报协议 udp协议位于osi模型中的传输层 xff0c 它是一种面向无连接的协议 udp协议并不保证数据一定能够到达对端 xff0c
  • 广播地址、组播地址、网关和子网掩码

    一 IP地址分类 IP地址一共32位 xff0c 由两部分组成 xff0c 网络号和主机号 网络号标识当前设备处于Internet的哪一个网络 xff0c 主机号标识当前设备属于该网络中的那一台主机 IP地址一共分为5类 xff1a 地址分
  • URL格式

    一 URL基本格式 一个完整的url包含方案 用户名 密码 主机名 端口 路径 参数 查询和片段 xff0c 格式如下 xff1a lt scheme gt lt user gt lt password gt 64 lt host gt l
  • c++构造函数和析构函数

    一 构造函数和析构函数的特点 构造函数和析构函数是一种特殊的公有成员函数 xff0c 每一个类都有一个默认的构造函数和析构函数 xff1b 构造函数在类定义时由系统自动调用 xff0c 析构函数在类被销毁时由系统自动调用 xff1b 构造函
  • linux下常用压缩命令

    一 tar命令 tar命令用来打包一个目录 xff0c 它支持三种格式 xff1a tar bz2 34 和 gz 34 1 1 压缩 tar cvf 文件名 tar 文件目录 打包成 tar文件 tar jcvf 文件名 tar bz2
  • 用vscode开发autojs,输出窗口不显示任何输出结果

    我的情况是 xff1a 我vscode开发autojs 程序 xff0c 之前在一切正常的情况下 xff0c 输出窗口可以正常显示程序运行结果 xff0c 右侧红圈里可以选择我连接的手机型号 如下图 xff1a 但是现在出现问题 xff1a
  • ubuntu开机没有ens33解决方法

    最近重新安装了VMware xff0c 使用之前的ubuntu镜像 xff0c 发现只有一个lo网卡 xff0c 没有ens33 xff0c 虚拟机无法获取ip地址 xff0c samba服务器也无法正常使用 root 64 ubuntu
  • ubuntu下arm-none-eabi-gcc安装

    一 下载安装包 下载地址 xff1a https launchpad net gcc arm embedded 43 download 选择linux版本下载 xff1a gcc arm none eabi 5 4 2016q3 20160
  • 2.4G-WiFi连接路由器过程

    一 概述 WiFi的数据通信基于802 11协议进行 xff0c 无线AP在工作时会定时向空中发送beacon数据包 xff0c 基站 xff08 STA xff09 从beacon中解析出AP的名称 加密方式等信息 xff0c 从而发起连
  • STM32f103时钟树详解

    一 概述 stm32有四种时钟信号源 xff0c HSE 高速外部时钟 HSI xff08 高速内部时钟 xff09 LSE xff08 低速外部时钟 xff09 LSI xff08 低速内部时钟 xff09 HSE通常接8M晶振 xff0
  • 头文件重复包含

    一 头文件重复包含问题分析 1 问题重现 举例说明 假设在某个C 43 43 头文件 或 源文件 中 xff0c 包含了A h和B h两个头文件 xff1a span class token macro property span clas
  • Netty 学习(六)实现自定义协议通信

    目录 前言一 通信协议设计通用协议自定义协议网络协议需要具备的要素1 魔数2 协议版本号3 序列化算法4 报文类型5 长度域字段6 请求数据7 状态8 校验字段9 保留字段 二 Netty 实现自定义通信协议Netty 中编解码器分类 三
  • ABB机器人与上位机进行Socket通信的RAPID代码实现(服务端)

    文章目录 前言1 实现的功能2 建立Socket通信2 1 ABB机器人的IP地址 xff1a 2 2 SocketAccept的说明 3 服务端接发信息3 1 核心代码3 2 CurrentPos函数 4 完整代码5 实现效果 前言 本文
  • ros使用自定义消息时,编译不成功,在Cmake中报错.

    在使用自定义消息时 xff0c 按照教程添加依赖和cmakelist文件后 xff0c 保证几条Cmake语句顺序无误的情况下 xff0c 考虑msg文件夹的位置 xff0c 应在功能包的第一级目录中
  • C语言加强--韦老师公开课

    目录 1 变量与指针 摘要 xff1a 普通变量 指针变量所占的内存空间大小 xff0c 变量在内存中的分配方式 xff08 首地址要求 长度 分配长度与实际使用长度区别 需要填充字节数 全局与局部变量在内存中的位置 xff09 xff1b
  • 大小端转换(一篇文章了解所有情况下的大小端转换方法)

    总述 xff1a 字节间字节内大端低地址的数据放在高字节位域 xff1a 先从低地址对应数据字节的高bit开始分配小端低地址的数据放在低字节位域 xff1a 先从低地址对应数据字节的低bit开始分配 注释 xff1a 对于大小端的几个结论