0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

大小端定义与应用场景及C语言中大小端的实现

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-02-28 08:52 次阅读

大小端定义:

大端模式:数据的高字节保存在内存的低地址中,数据的低字节保存在内存的高地址中;

小端模式:数据的高字节保存在内存的高地址中,数据的低字节保存在内存的低地址中;

举个例子来说明,我们利用485进行通讯,采用的大端模式传输16进制数据为:01 23/ef 05,按照大端模式的数据为2301和05ef,转化为10进制为8961和1519。说白了就是直接将数据拼接进行转化。

应用场景:

网络上数据传输上往往采用大端模式进行数据传输;跨硬件平台进行数据传输,数据格式存在差异,存储字节的顺序可能不同;采用通讯协议每次传输数据的字节有一点限制等

例如char类型数据只占一个字节,传输可以直接传输,但是对于非char类型的数据,要在RS485CAN通讯过程中就需要进行大小端数据的转化。

c语言中大小端的实现:

注意在转化过程中需要保持相同的大小端数据格式,不可以形成同一组数据中同时存在大端和小端数据,容易让使用者或者二次开发者产生误解。

z这里主要讲解大小端数据转化的原理与相关的代码:

首先常用的有16位数据和32位数据大小端转化,作为嵌入式代表的STM32单片机的unsingned int型:

/* 32位数据小端模式 */
#define uint32_data(x)    //定义32位数据,这里x为用户自己定义的需要转化的数据
(uint32_t)((((uint32_t)(x) & 0xff000000) >> 24) |\            //这里是ff000000不是ffff0000,按照每两个字节进行的转化
                    (((uint32_t)(x) & 0xff000000) >> 8) |\    //数据右移8位
                    (((uint32_t)(x) & 0x0000ffff) << 8) |\    //数据左移8位
                    (((uint32_t)(x) & 0x000000ff) << 24)\
             )  
/* 16位数据小端模式 */             
#define uint16_data(x)    //定义16位数据,这里x为用户自己定义的需要转化的数据
(uint16_t)((((uint16_t)(x) & 0x00ff) << 8) |\
          ((((uint16_t)(x) & 0xff00) >> 8) \
          )

按照上述代码测试一下,主函数调用一下,这里直接打印即可:

printf("%#x\n",uint32_data(0xef847321));
printf("%#x\n",uint16_data(0xef84));

输出结果:

217384ef

84ef

假如需要将一个int型can_data数据转化为小端模式,可以尝试如下代码:

can_data[0] = (u8)(num & 0xFF);           //取数据低8位
can_data[1] = (u8)((num >> 8) & 0xFF);    //数据右移8位,将低位移除保留高位数据

假如需要将一个int型can_data数据转化为大端模式,可以尝试如下代码:

can_data[2] = (u8)((num >> 8) & 0xFF);           //数据右移8位,将低位移除保留高位数据
can_data[3] = (u8)(num & 0xFF);                  //取数据为低8位

总结:

数据的大小端对不同平台数据传输具有重要意义,在具体使用时需要根据需要进行数据转化。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据传输
    +关注

    关注

    9

    文章

    1915

    浏览量

    64649
  • 硬件
    +关注

    关注

    11

    文章

    3341

    浏览量

    66265
  • C语言
    +关注

    关注

    180

    文章

    7605

    浏览量

    137020
收藏 人收藏

    评论

    相关推荐

    连接视觉语言大模型与自动驾驶

    自动驾驶在大规模驾驶数据上训练,展现出很强的决策规划能力,但是面对复杂罕见的驾驶场景,依然存在局限性,这是因为模型缺乏常识知识和
    的头像 发表于 11-07 15:15 261次阅读
    连接视觉<b class='flag-5'>语言</b>大模型与<b class='flag-5'>端</b>到<b class='flag-5'>端</b>自动驾驶

    C语言中的socket编程基础

    Socket编程简介 Socket是一种通信机制,允许程序之间进行通信。在C语言中,socket编程是网络编程的基础。通过使用socket,程序可以发送和接收数据,实现不同计算机之间的通信
    的头像 发表于 11-01 16:51 348次阅读

    C语言中最常见的宏定义写法

    如果让你用C语言写个宏定义,我相信大部分同学顺手就能写出define。
    的头像 发表于 10-28 11:12 296次阅读

    放大器单输出的区别

    放大器是电子学中的一种重要设备,用于增强信号的幅度。在放大器的设计和应用中,单输出和双输出是两种常见的输出方式。这两种方式各有特点和应用场景。 1. 单输出放大器 1.1
    的头像 发表于 10-08 16:36 1719次阅读

    压敏电阻的阻值大小和什么有关

    压敏电阻的阻值大小主要与以下几个因素有关: 一、电压 压敏电阻的阻值与其两施加的电压大小密切相关。具体表现为: 当加到压敏电阻器上的电压在其标称值以内时,电阻器的阻值呈现无穷大状态,几乎无电流
    的头像 发表于 09-11 16:16 369次阅读
    压敏电阻的阻值<b class='flag-5'>大小</b>和什么有关

    电容两的电压由什么决定

    的面积、介电常数和极板间距。根据电容的定义公式: C = εA/d 其中,C 表示电容,ε 表示介电常数,A 表示电容的面积,d 表示极板间距。从这个公式可以看出,电容的大小与介电常数
    的头像 发表于 07-11 09:49 2281次阅读

    MQTT客户大小分配过大而导致无法初始化怎么处理?

    在配置MQTT客户时,因为我想接收很大的数据包(最大500k)。因此我想一次接收完成(扩展了psram)。所以我在配置MQTT客户时将栈大小设置为114688,将接收缓冲区大小设置
    发表于 06-21 12:54

    STM8L内存存储上有办法设置大小吗?

    我想知道STM8L内存存储上有办法设置大小吗?
    发表于 04-17 08:22

    字传输不变的3种大小处理方式

    大端,最高字节存储在最低的内存地址,小则是最低有效字节存储在最低的内存地址。在Verilog中实现大端(Big-Endian)和小(Little-Endian)之间的转换通常涉及到对多字节数据的操作。
    的头像 发表于 04-02 10:32 648次阅读
    字传输不变的3种<b class='flag-5'>大小</b><b class='flag-5'>端</b>处理方式

    交换芯片缓冲区大小是什么

    交换芯片缓冲区大小并不一定是固定的。缓冲区的设计和实现会根据芯片的具体型号、规格以及应用场景的不同而有所差异。一些交换芯片可能具有固定大小的缓冲区,以满足特定的性能需求或成本限制。然而
    的头像 发表于 03-18 14:42 650次阅读

    嵌入式系统中C语言结构体的基础实现与应用

    C语言中的数组只能允许程序员定义存储相同类型数据。但是结构是C语言编程中允许您存储不同数据类型的数据。
    发表于 03-12 14:29 512次阅读
    嵌入式系统中<b class='flag-5'>C</b><b class='flag-5'>语言</b>结构体的基础<b class='flag-5'>实现</b>与应用

    C语言中的typedef的应用

    C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE。
    发表于 03-06 11:34 391次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的typedef的应用

    枚举有多大?c语言枚举end的作用是什么?

    枚举有多大?c语言枚举end的作用是什么? 枚举在C语言中是一种常见的数据类型,用于定义一组相互关联的常量或者变量。它通常用于表示一系列可能
    的头像 发表于 01-19 14:19 626次阅读

    求助,请问STM32的FSMC可以配置大小吗?

    STM32的FSMC可以配置大小么。
    发表于 01-17 08:22

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析

    一些措施来解决和防止其发生。本文将详细介绍C语言中访问权限冲突异常的原因以及解决方法。 一、访问权限冲突异常的原因分析 访问权限冲突异常可分为两类:访问私有成员和访问未定义成员。下面分别分析这两种异常的原因。 1. 访问
    的头像 发表于 01-12 16:03 5820次阅读