大小端与结构体释疑

2023-11-19

  • 本人在做项目过程中需要在ARM对从FPGA读取到的数据进行处理,在实际过程中产生了一些问题,在思考了后记录在此。
1 大小端模式
  • 大小端指数据在内存中的存储方式。小端指数据的高字节保存在内存的高地址处,低字节保存在内存的低地址处。大端模式则正好相反。ARM和x86的CPU一般情况下都为小端模式。
  • 对于值unsigned int value = 0x12345678,在内存中的存储方式如下。
内存地址 小端模式存放内容 大端模式存放内容
0x00004000 0x78 0x12
0x00004001 0x56 0x34
0x00004002 0x34 0x56
0x00004003 0x12 0x78
2 栈上的数据存储
  • 局部变量在栈上存储,而栈由高地址向低地址方向增长。因此我们创建三个局部变量时,内存区如下图所示。我们由下图可以看到,在x86上,低字节存储在低地址,而栈由高地址向下增长。
	unsigned int a = 0x12345678;
	unsigned short b = 0x1234;
	unsigned char c  = 0x12;

在这里插入图片描述

  • 结构体在栈上的存储时,在结构体中靠前面的成员存储在低地址处。如下面这个结构体,inta成员存储在低地址处,charc成员存储在高地址处。
	#pragma pack(1)
	typedef struct _ppp
	{
	    unsigned int inta;
	    unsigned short shortb;
	    unsigned char charc;
	}structp;
	#pragma pack()
	
	struct structp ppppp;
	ppppp.inta = a;
	ppppp.shortb = b;
	ppppp.charc = c;
  • 我们可以看到,结构体变量ppppp存储在0x0065FE4A地址处,inta成员存储在低地址处,charc成员存储在高地址处。
    在这里插入图片描述
3 Qt中的QByteArray与结构体转换的问题
  • 在Qt中,我经常将变量或结构体转换成QByteArray类型,然后进行传递。
	QByteArray ba;
    unsigned int a = 0x12345678;
    unsigned short b = 0x1234;
    unsigned char c  = 0x12;
    ba.append(QByteArray((const char*)&b, sizeof(unsigned short)));
    ba.append(QByteArray((const char*)&c, sizeof(unsigned char)));
    ba.append(QByteArray((const char*)&a, sizeof(unsigned int)));
  • 变量ba在内存中的布局如下图所示,因此我可以用下面这种方式拆分QByteArray类型。
    在这里插入图片描述
	QByteArray bab = ba.mid(0, 2);
	QByteArray bac = ba.mid(2, 1);
	QByteArrat baa = ba.mid(3, 4);
	unsigned short* pbab = (unsigned short*)bab.data();		//0x1234
	unsigned char* pbac = (unsigned char*)bac.data();		//0x12
	unsigned int* pbaa = (unsigned int*)baa.data();			//0x12345678
  • 对于结构体看似这种方法也是正确的。变量structpp在内存中存储在0x0065FE39处,变量ba存储在0x00977280处。
	QByteArray ba;
    struct structp structpp;
    structpp.inta = 0x12345678;
    structpp.shortb = 0x1234;
    structpp.charc = 0x12;
    ba.append((const char*)&structpp, sizeof(structp));
    structp* pstructp = (structp*)ba.data();

在这里插入图片描述
在这里插入图片描述

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

大小端与结构体释疑 的相关文章

  • css 排除具有某个class的项

    idname li not classA display inline block 增加样式时将li中有class的去掉
  • 使用决策树进行特征选择

    使用决策树进行特征选择 决策树也是常用的特征选取方法 使用决策树集合 如随机森林等 也可以计算每个特征的相对重要性 这些重要性能够辅助进行特征选择 该方法主要使用信息增益率来进行特征选择 from sklearn import datase
  • Keil的软件仿真和硬件仿真

    一 软件仿真 Keil有很强大的软件仿真功能 通过软件仿真可以发现很多将要出现的问题 Keil的仿真可以查看很多硬件相关的寄存器 通过观察这些寄存器值的变化可以知道代码有没有正常运行 这样可以避免频繁下载程序 延长单片机Flash寿命 开始
  • RNN Pytorch实现——up主:刘二大人《PyTorch深度学习实践》

    b站up主 刘二大人 PyTorch深度学习实践 教程 https www bilibili com video BV1Y7411d7Ys p 6 vd source 715b347a0d6cb8aa3822e5a102f366fe 单层
  • 【2023最新版】Win11: WSL(Ubuntu22.04)使用docker远程容器教程(Windows的Docker Desktop下载安装、迁移到非系统盘、配置国内镜像源、设置 WSL2)

    目录 一 准备工作 1 安装WSL 适用于 Linux 的 Windows 子系统 2 docker简介 来源chatGPT 二 Windows安装 Docker Desktop 1 官网链接 2 安装过程 3 迁移到非系统盘 4 配置国内
  • 怎么用vscode进行单步调试

    1 修改launch文件 version 0 2 0 configurations name gdb Launch type cppdbg request launch program workspaceFolder build my cm
  • springcloud学习记录一、了解微服务

    此学习通过查阅相关资料 自己理解的方式进行总结 没有用太多的官方语言 官方语言一直不喜欢 搞得高大上 其实很简单 就是能装那个啥 看的人头疼 尤其是对新手 如果有人发现有问题请指正 谢谢 一 单机结构 对于一个小项目 并且使用人数不多时 开
  • @注解学习总结

    RestController 相当与 Controller ResponseBody组合使用 其作用均是将方法的结果转化为JSON 格式返回给前端 这点可以从 Postman 中体现 RequestMapping value 和 path
  • QT调试详细操作步骤及案例分析

    目录 QT调试详细操作步骤及案例分析 QT调试详细步骤 1 手动调试 1 1 输入备调试的代码 1 2 设置断点 1 3 单步调试简单介绍 1 4 调试案例 1 4 1 纯C 代码的调试 1 4 2 QT程序的调试 2 使用QDebug进行
  • 在centos中配置linux网络ping时碰到destination host unreachable的问题

    最近装了个VM VirtualBox和CentOS玩Linux 在配置完网络后 只能ping 127 0 0 1 无法ping出本机IP和外网 出现 destination host unreachable 的报错 From 192 168
  • 如何写一篇简洁易懂的测试报告?

    一 什么是测试报告 测试报告是指把测试的过程和结果写成文档 对发现的问题和缺陷进行分析 为纠正软件的存在的质量问题提供依据 同时为软件验收和交付打下基础 二 测试报告的内容 测试报告的内容可以总结为以下目录 首页 引言 目的 背景 缩略语
  • 【C++】通过栈/队列/优先级队列/反向迭代器了解适配器及仿函数

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 stack 实现一个stack 二 queue 实现一
  • C/C++尾插法建立单链表

    思路 一个s指针指向新建节点 一个节点指向尾节点 C 中有引用 写出来很简单 下面给出的是天勤数据结构高分笔记上面的写法 疯狂吐槽这种C和C 混用的方法 include
  • StoreUpgrader$UnexpectedUpgradingStoreVersionException: Not possible to upgrade a store with version

    Caused by org neo4j kernel impl storemigration StoreUpgrader UnexpectedUpgradingStoreVersionException Not possible to up
  • 【IT】计算机体系结构

    https edu 51cto com center course user get study course 解释型语言 在计算机资源受限制的嵌入式计算机上 单片机等 效果不好 因此在嵌入式开发中 更多的还是使用c c 这种 解释型语言
  • 过河卒 蓝桥杯 755

    题目描述 如图 A 点有一个过河卒 需要走到目标 B 点 卒行走规则 可以向下 或者向右 同时在棋盘上的 C 点有一个对方的马 该马所在的点和所有跳跃一步可达的点称为对方马的控制点 例如上图 C 点上的马可以控制 99 个点 图中的 P1
  • java实现rabbitmq消息队列

    1 rabbitmq常用的五种模型 基本消息模型 基本消息模型就是 一个生产者丶默认交换机丶一个队列丶一个消费者 work消息模型 work消息模型就是 一个生产者丶默认交换机丶一个队列丶多个消费者 fanout广播模式 发布 订阅模式 f
  • Powershell无法使用conda activate的问题

    主要引起的原因是Powershell使用Conda init失败 问题主要出现在中文系统中 特别与onedrive开启了 文档同步 有关 可以看到 最后两行生成了配置文件 用以启动conda 并在onedrive上 但是 onedrive中

随机推荐

  • 搭建prometheus+grafana监控系统

    prometheus简介 Prometheus是最初在SoundCloud上构建的开源系统监视和警报工具包 自2012年成立以来 许多公司和组织都采用了Prometheus 该项目拥有非常活跃的开发人员和用户社区 现在 它是一个独立的开源项
  • 计算机相关专业结业课题推荐及答辩技巧,加关喔!

    计算机相关专业结业课题推荐及答辩技巧 是不是还在为选题而烦恼 本文是提供一些计算机 软件 通信 电子等 相关专业大四选题推荐及一些答辩技巧 供给大家学习和参考 预祝各位看官学业进步 前程似锦 创作不易 帮忙点赞 收藏 好评哦 一 整个学年设
  • @JsonProperty注解解析

    1 概述 来源 JsonPrpperty是jackson包下的一个注解 详细路径 com fasterxml jackson annotation JsonProperty 作用 JsonProperty用在属性上 将属性名称序列化为另一个
  • 华为OD机试真题- 统计匹配的二元组个数【2023Q2】【JAVA、Python、C++】

    题目描述 给定两个数组A和B 若数组A的某个元素A i 与数组B中的某个元素B j 满足 A i B j 则寻找到一个值匹配的二元组 i j 请统计在这两个数组A和B中 一共存在多少个这样的二元组 输入描述 第一行输入数组A的长度M 第二行
  • 深度学习--Pytorch构建栈式自编码器实现以图搜图任务(以cifar10数据集为例)

    Pytorch构建栈式自编码器实现以图搜图任务 搞清楚pytorch与tensorflow区别 pytorch tensorflow 搞清楚栈式自编码器的内部原理 效果图 代码及效果图 欠完备编码器 卷积栈式编码器 栈式编码器 本文旨在使用
  • ssm项目tomcat正常启动,首页不能访问的问题分析

    遇到这种情况的我们可以从以下几方面进行问题的排查 1 首先出现这种问题一般都是springmvc xml不能正常读取 也就是说文件路径不正确 是否打了war包 lib包是否存在 web xml路径是否正确
  • 动态渲染 echarts 饼图(vue 2 + axios + Springboot)

    目录 前言 1 项目搭建 1 1 前端 1 2 后端 2 后端数据渲染前端 2 1 补充1 在 vue 中使用 axios 2 2 补充2 Springboot 处理跨域问题 2 3 修改前端代码 2 3 1 修改饼图样式 2 3 2 调用
  • Fast-ReID 训练自己的数据集调优记录(一)

    Fast ReID前期准备 文章目录 Fast ReID前期准备 前言 一 Fast ReID 介绍 Fast ReID 特点 FastReID 架构 二 Fast ReID 复现 前言 FastReID 是一个 SOTA 级的 ReID
  • Linux开放普通用户使用winscp上传文件和禁止root用户登录

    鉴于使用root用户操作系统有诸多风险 也给网络黑客暴力破解服务器密码可乘之机 于是决定禁用root用户远程登录系统 可是禁用root用户登录系统也带来一个问题 那就是root用户登录不了WinScp 也就没办法上传文件了 这还了得 这会给
  • qt中加载qss样式不生效的问题

    前提是你能正确加载 而且 你试着将你的qss后缀改成css 发现能生效 但是后缀改成qss没有生效 这个原因就是字符编码的问题了 需要改成utf 8才行 使用notepade 来改是一种方式 参考博客 QT 避坑指南 QSS文件引入及解决自
  • Allegro使用总结-查看Layout基本操作:

    好久没用CSDN写过笔记了 没想到无意间打开 编辑器更新啦 以前巨难用的 富文本编辑器 终于改观了 变的好像语雀 1 视图 画面操作 a 画面缩放 Zoom F11 F12 或 鼠标滚轮 补充 Zoom分辨率调节 Setup user pr
  • Unity2019_寻路系统

    简单导航寻路功能 选定为静态网格导航 Windows gt Ai gt Navigation 点击烘焙 角色上挂一个导航网格组件 挂上脚本 鼠标点击位置设置为导航的终点 using UnityEngine using UnityEngine
  • admin-lte+ng-bootstrap组合开发之modal弹层不显示

    在用admin lte做前端页面框架做开发 需要用到弹出层效果时 看到ng bootstrap中有Modal实现弹层效果 步骤如下 1 安装和配置ng bootstrap 具体见 https www jianshu com p 690080
  • Qt

    Qt UDP广播通信的使用 实战项目使用案例 1 UDP广播介绍 UDP广播地址固定IP地址为 XXX XXX XXX 255 如果向全网段发送广播消息 那么广播地址为 255 255 255 255 如果向单个网段发送广播消息 例如你的I
  • Java中方法的重载和重写

    重载是在同一个类中的具有相同方法名 不同参数 个数 类型 顺序 的方法的定义 构造方法 普通方法 抽象方法都可以重载 重写是在子类继承父类的时候重写 在子类重写的方法名必须和父类的方法名完全相同 可以用 Override检查是否是重写方法
  • 白盒测试和静态测试

    白盒测试技术是根据被测对象的结构 系统化设计测试用例的一种方法 又称透明盒测试 或结构测试 测试覆盖准则之白盒测试设计技术的核心代码覆盖标准 1 语句覆盖 2 判定覆盖 3 条件覆盖 4 判定条件覆盖 5 条件组合覆盖 6 路径覆盖 白盒测
  • LeetCode刷题之旅【多线程篇-4】中等: 1116. 打印零与奇偶数

    2019年11月22日 目录 题目 1116 打印零与奇偶数 解题1 Semaphore 信号量作屏障 解题2 synchronized独占锁 线程阻塞与唤醒 拓展 题目 1116 打印零与奇偶数 解题1 Semaphore 信号量作屏障
  • NVIDIA视频硬解码

    硬解码流程 创建cuda上下文 查询硬件解码器解码能力 创建解码器实例 使用第三方软件 如FFMPEG 进行Demux 使用第三方解析器 如FFMPEG 解析视频比特流 使用NVDECODE API启动解码 获取解码后的YUV进行进一步处理
  • 刷脸支付服务商帮助微信支付宝拓展市场服务客户

    如今的刷脸支付市场 随着微信刷脸支付 青蛙 的内测完成 马上就会和支付宝的 蜻蜓 有一场争夺市场的大战了 两大巨头打架 肯定会有很多的政策 到时候刷脸支付下面的人就能分一点汤 一定要记住 申请服务商是免费公开透明的 想要好好了解的就去支付宝
  • 大小端与结构体释疑

    本人在做项目过程中需要在ARM对从FPGA读取到的数据进行处理 在实际过程中产生了一些问题 在思考了后记录在此 1 大小端模式 大小端指数据在内存中的存储方式 小端指数据的高字节保存在内存的高地址处 低字节保存在内存的低地址处 大端模式则正