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

    文章

    2226

    浏览量

    67727
  • 硬件
    +关注

    关注

    12

    文章

    3629

    浏览量

    69165
  • C语言
    +关注

    关注

    183

    文章

    7646

    浏览量

    146123
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于Arm平台的int8 Conformer模型部署

    在边缘侧运行高质量的语音与音频模型颇具挑战,需满足时延、内存、功耗和模型大小等多方面的严苛约束。不同于云端部署,边缘侧系统通常离线运行,需兼顾用户隐私与可预测的实时性能。这些落地场景涵盖侧语音转文本、语音助手、语音控制的物联网
    的头像 发表于 02-24 10:23 433次阅读
    基于Arm平台的<b class='flag-5'>端</b>到<b class='flag-5'>端</b>int8 Conformer模型部署

    C语言函数指针的六个高级的应用场景

    函数指针是一种非常强大的编程工具,它可以让我们以更加灵活的方式编写程序。在本文中,我们将介绍 6 个函数指针的高级应用场景,并贴出相应的代码案例和解释。 回调函数 回调函数是指在某个事件发生时被
    发表于 01-04 12:25

    C语言回调函数原来这么简单

    ” 这个概念,它是回调函数能够实现的重要基础。 1、函数指针学习过C语言的伙伴都知道,C语言中的灵魂 — 指针。可以毫不犹豫的说,要检验你对
    发表于 12-30 06:45

    请问C语言中整形溢出的解决方法有哪些?

    C语言中整形溢出的解决方法有哪些?
    发表于 12-29 07:33

    单片机c语言中定义字节怎么定义

    定义位可以用***it但是定义字节呢?还有就是比如汇编中的DPTR的DPH和DPL在c语言中怎样定义的呢?
    发表于 12-29 06:32

    请问C语言中整形溢出会产生哪些异常行为?

    C语言中整形溢出会产生哪些异常行为?
    发表于 12-26 07:05

    请问C语言中整形溢出对哪些应用场景影响较大?

    C语言中整形溢出对哪些应用场景影响较大
    发表于 12-24 08:24

    Typedef在C语言中的应用

    Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子: #define dPS struct s * typedef
    发表于 12-22 13:53

    C语言中可以嵌套汇编语言吗?

    请问C语言中可以嵌套汇编语言吗?
    发表于 12-15 08:14

    触控板的“大小之争”,真的只是数字差异?

    在笔记本电脑的使用体验中,触控板是仅次于键盘的核心交互部件。不少用户在选择设备时会疑惑:大触控板和小尺寸触控板,难道仅仅是面积大小不同吗?实则不然。从日常操作的流畅度到复杂功能的实现,从单一场景
    的头像 发表于 10-30 15:32 709次阅读

    光缆怎么分ab

    光缆分AB是通信工程中的关键步骤,主要用于确保光纤连接的极性正确,避免信号传输错误。以下是光缆分AB的详细说明: 一、AB定义与作用 定义
    的头像 发表于 09-28 09:38 2542次阅读

    黑芝麻智能全栈式辅助驾驶系统的应用场景

    黑芝麻智能推出的全新一代全栈辅助驾驶系统,以武当C1200系列高算力芯片为基石,深度融合自研感知算法,实现场景感知到车辆控制的完全闭
    的头像 发表于 09-09 17:19 2821次阅读

    NCS更改MTU大小

    NCS更改MTU大小 一、 什么是MTU MTU(Maximum Transmission Unit)即最大传输单元,它定义了蓝牙网络层协议一次能传输的最大数据量。在蓝牙低功耗(BLE)通信
    的头像 发表于 06-27 17:13 925次阅读
    NCS更改MTU<b class='flag-5'>大小</b>

    HarmonyOS优化应用包体积大小问题性能优化

    : 对于含有so库的app工程,可以配置so库压缩选项,通过压缩so库来减小应用包大小。 应用存在多包(HAP、HSP)的场景时,可以使用HSP动态共享包在应用的多个包(HAP、HSP)之间共享代码
    发表于 05-20 14:50

    深入理解C语言C语言循环控制

    改变程序的执行流程,使代码更加灵活和可控。本文将详细介绍这些语句的作用及其应用场景,并通过示例代码进行说明。Part.1break语句C语言中break语句有两种
    的头像 发表于 04-29 18:49 2209次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制