(1)fopen,fseek,fread,ftell,rewind作用和使用方法,大端小端

文章目录

  • 1.fopen,fseek,fread,ftell,rewind作用和使用方法
  • 2.bin文件里从0x0000到0x0x0007是00 00 DF 00 00 01 00 00,但是用fread读出来前四个字节是DF0000,然后是0x1000,这是为什么?
  • 3.一个字节8位的传输方式
  • 4.不同协议可能用不同的MSB,LSB的约定方式

1.fopen,fseek,fread,ftell,rewind作用和使用方法

  1. fopen - 用于打开文件。

    • 功能:打开一个文件,并返回一个指向FILE类型的指针,用于后续的读写操作。需要指定文件路径和模式(如读、写等)。
    • 示例:
      FILE *file = fopen("example.txt", "r");  // 打开一个用于读取的文件
      if (file == NULL) {
          // 处理错误
      }
      
  2. fseek - 在文件中移动文件指针到一个指定的位置。

    • 功能:设置文件内的位置指针到指定的位置。它需要文件指针、偏移量和起始位置(文件开始、当前位置或文件结尾)作为参数。
    • 示例:
      fseek(file, 0, SEEK_END);  // 将文件指针移动到文件的末尾
      
  3. fread - 从文件中读取数据。

    • 功能:从文件中读取数据到给定的数组中。需要指定要读取的元素大小、元素个数以及文件指针。
    • 示例:
      char buffer[100];
      size_t n = fread(buffer, sizeof(char), 100, file);  // 从文件中读取最多100个字符
      
  4. ftell - 获取当前文件指针的位置。

    • 功能:返回一个long类型的值,表示当前文件指针在文件中的位置。
    • 示例:
      long position = ftell(file);  // 获取当前文件指针的位置
      
  5. rewind - 将文件指针重置回文件的开始位置。

    • 功能:将文件指针重新设置到文件的开始位置。
    • 示例:
      rewind(file);  // 重置文件指针到文件的开始位置
      

2.bin文件里从0x0000到0x0x0007是00 00 DF 00 00 01 00 00,但是用fread读出来前四个字节是DF0000,然后是0x1000,这是为什么?

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

如果你在尝试从一个二进制文件中读取数据,并且遇到了数据似乎被错误地读取或解释的情况,可能的原因包括:

  1. 字节顺序(Endianess)问题:计算机有两种存储多字节数据的方式——大端(Big Endian)和小端(Little Endian)。大端模式是将最高有效字节(MSB)存储在最低的地址上,而小端模式则是将最低有效字节(LSB)存储在最低的地址上。如果文件是在一个大端系统中创建的,然后你尝试在一个小端系统中读取它(大多数现代PC都是小端),那么多字节的数据类型(如整数、浮点数等)就会被错误地解释。

  2. 错误的解释或读取方式:如果你在读取数据时没有正确地解释文件格式或者数据结构,就可能会遇到数据被错误读取的问题。例如,如果文件中的数据是以特定的结构或者需要按特定的字节顺序读取,但读取操作没有考虑到这些因素,就会导致错误的数据解释。

针对你遇到的具体问题,原始数据00 00 DF 00 00 01 00 00应该是按照小端格式存储的。如果你期望读取到的前四个字节是DF0000,但实际上文件内容显示的是00 00 DF 00,这看起来像是一个字节顺序的解释问题。

  • 原始数据按小端格式表示时,00 00 DF 00实际上代表的是0x00DF0000,而不是DF0000
  • 接下来的00 01 00 00在小端格式下代表0x00000100,而不是0x1000。这里可能是你的期望和实际读取/解释方式之间存在误差。

当处理这样的数据时,确保你完全理解了数据的格式(大端还是小端),以及你的程序(或者使用的函数)如何处理这些数据。在C或C++中,如果需要转换字节顺序,可以使用函数如ntohl()ntohs()htonl()htons()来在网络字节顺序和主机字节顺序之间转换。不过,请记住,这些函数主要用于处理网络通信中的字节顺序问题。对于文件I/O操作,你可能需要手动处理或确保以正确的方式解读数据。

从数据手册来看,真正的地址确实是0xDF000000,说明PC端的bin文件确实是按照小端方式存储的。

在这里插入图片描述

3.一个字节8位的传输方式

在通信协议中,MSB(Most Significant Bit,最高有效位)和LSB(Least Significant Bit,最低有效位)通常用来描述一个字节中的位的顺序。一个字节有8位,每个位可以是0或1。MSB是指在数值中具有最高权重的位,而LSB则是指在数值中具有最低权重的位。

考虑一个8位的字节,从左到右依次为第7位到第0位,其中第7位是MSB,第0位是LSB。在二进制数值中,MSB的位置对应着最高的权重,而LSB的位置对应着最低的权重。

例如,考虑二进制数值10110101,其中第7位(最左侧)是MSB,而第0位(最右侧)是LSB。在这个例子中,MSB对应的是1(2的7次方),而LSB对应的是1(2的0次方)。

在通信协议中,MSB和LSB的顺序对于数据的解释至关重要。有时候通信协议会规定MSB在前还是LSB在前,这称为字节顺序或者位序。通常,这个规定是由通信协议或者数据格式决定的。

举例来说,在某些协议中,如果一个字节10110101需要被解释为整数,而且协议规定使用大端字节顺序(MSB在前),那么这个字节被解释为0xD5,即1*2^7 + 0*2^6 + 1*2^5 + 1*2^4 + 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 213。但如果协议规定使用小端字节顺序(LSB在前),那么这个字节被解释为0xAD,即1*2^7 + 0*2^6 + 1*2^5 + 1*2^4 + 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 173

因此,在通信协议中,正确理解和处理MSB和LSB的顺序至关重要,以确保数据能够正确地被解释和处理。

4.不同协议可能用不同的MSB,LSB的约定方式

在SPI(Serial Peripheral Interface)协议中,数据传输的顺序通常由设备间的约定决定。SPI是一种同步串行通信协议,通常由主设备(例如微控制器或者单片机)与一个或多个从设备(例如传感器、存储器等)之间进行通信。

在SPI通信中,数据是通过时钟信号同步传输的。每次传输,数据都是从主设备发送到从设备,同时从设备也会发送数据回主设备。因此,在SPI通信中,主设备和从设备之间需要一致地约定数据传输的顺序,包括是先传输MSB还是先传输LSB。

一般来说,在SPI通信中,数据传输的顺序可以由协议规范、通信设备的文档或者硬件设计中的约定来确定。有些设备可能规定先传输MSB,而有些则可能规定先传输LSB。

因此,如果你正在开发或者使用SPI通信协议,建议查阅相关的设备文档或者通信协议规范,以确定数据传输的顺序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/466202.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024蓝桥杯每日一题(回溯)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:木棒 试题二:n皇后问题 试题三:糖果 试题四:飞机降落 试题五:生日蛋糕 试题一:木棒 【问题描述】 乔治拿来一组等长…

steam_api.dll“是什么?打开游戏出现找不到steam_api.dll无法继续执行代码如何解决

"steam_api.dll"是什么?,steam_api.dll它是由windows系统Visual C Redistributable for Visual Studio提供的。当这个文件损坏或丢失时,会导致一些应用程序无法运行,显示找不到"steam_api.dll"缺失错误。本文…

马斯克开源的grok AI大模型

马斯克践行诺言,坚持开源原则,选择开源自家的 AI 大模型——Grok-1 下载链接如下: https://github.com/xai-org/grok-1 Grok-1 开源仅过去了 10 个小时,该项目便获得了 超过16k 的 Star,成为众人关注的焦点所在。 后续继续更新…

Python二级备考(1)考纲+基础操作

考试大纲如下: 基本要求 考试内容 考试方式 比较希望能直接刷题,因为不懂的比较多可能会看视频。 基础操作刷题: 知乎大头计算机1-13题 import jieba txtinput() lsjieba.lcut(txt) print("{:.1f}".format(len(txt)/len(ls)…

springcloud:4.2 GateWay结合JWT实现网关鉴权

概述 概述 简介 JWT是一种用于双方之间传递安全信息的简洁的、URL安全的声明规范。 定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。 特别适用于分布式站点的单点登录(SSO)场景 传统的session认证的缺点 安全性:CSRF攻击因为基于cookie来…

掌握AI写作工具:引领内容创作潮流

随着技术发展,AI技术正日益渗透到各行各业,并对内容创作领域产生了深远影响。随着AI写作工具的不断发展和普及,内容创作者们正逐渐看到了AI在提高效率、创造力和质量方面的巨大潜力。本文将探讨AI写作工具如何引领内容创作潮流,以…

vue antd table嵌套表格 左侧展开图标动态控制显示隐藏

antd a-table想要实现如以下效果&#xff0c;有子级就显示展开图标&#xff0c;没有就不显示图标&#xff1a; 话不多说&#xff0c;直接上代码&#xff1a; <template><a-table :columns"columns" :data-source"dataSource"><template #b…

最新若依项目快速上手

最新若依项目快速上手 配套视频&#xff1a;若依项目快速上手视频 1. 下载源码 官网&#xff1a;https://ruoyi.vip/ 前端 git clone https://github.com/yangzongzhuan/RuoYi-Vue3.git后端 git clone https://gitee.com/y_project/RuoYi-Vue.git2. 数据库 创建数据库ry-vue…

JAVA后端调用OpenAI接口 实现打字机效果(SSE)

SSE SSE&#xff08;Server-Sent Events&#xff0c;服务器发送事件&#xff09;是一种基于HTTP协议的通信技术&#xff0c;它允许服务器持续地将数据推送给客户端&#xff0c;而无需客户端发起请求。这种通信方式通常用于实时性要求较高的场景&#xff0c;如实时更新、通知、或…

Linux:搭建ntp服务器

我准备两个centos7服务器 一个为主服务器连接着外网&#xff0c;并且搭建了ntp服务给其他主机同步 另外一个没有连接外网&#xff0c;通过第一台设备去同步时间 首先两个服务器都要安装ntp软件 yum -y install ntp 再把他俩的时间都改成别的 左侧的是主服务器&#xff0c;主…

【Docker篇】自定义Dockerfile的操作

文章目录 &#x1f354;镜像结构&#x1f6f8;什么是Dockerfile⭐基于Ubuntu镜像构建一个新镜像&#xff0c;运行一个java项目&#x1f50e;使用 java:8-alpine &#x1f354;镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 我们以MySQL为例&am…

JVM中对象创建过程

在JVM中对象的创建&#xff0c;我们从一个new指令开始&#xff1a; 这个过程大概图示如下&#xff1a; 虚拟机收到new指令触发。 类加载检查&#xff1a;如果类没有被类加载器加载&#xff0c;则执行类加载流程&#xff08;将class信息加载到JVM的运行时数据区的过程&#xff…

KiCad 从原理图创建或者导出原理图符号

KiCad 从原理图创建或者导出原理图符号 原理图中&#xff0c;在下那个要导出的符号上点击右键-》属性-》编辑符号 在符号编辑中选择&#xff1a;文件-》导出符号 加微信&#xff1a;jiyuyun18, 交流电子技术 留言&#xff1a;CSND 电子技术交流群&#xff0c;加入电子微信电…

如何利用生成式AI进行品牌定位调研?

在激烈的市场竞争中&#xff0c;一个明确的品牌定位能够帮助企业突出其独特性&#xff0c;吸引并保留目标消费者。品牌定位调研是企业了解自身、竞争对手以及市场需求的重要手段&#xff0c;是制定有效市场策略的基础。本文将详细介绍如何进行品牌定位调研&#xff0c;包括调研…

PyTorch学习笔记之激活函数篇(四)

4、 Leaky ReLU 函数 4.1 公式 Leaky ReLU函数的公式&#xff1a; f ( x ) { x , x > 0 λ x , x < 0 , λ ∈ ( 0 , 1 ) f(x) \begin{cases} x&,x>0 \\ \lambda x&,x<0,\lambda \in(0,1) \end{cases} f(x){xλx​,x>0,x<0,λ∈(0,1)​ Leakly R…

MySQL连接数不足导致服务异常GetConnectionTimeoutException

文章目录 场景复现解决方案一、调整连接数二、优化程序 场景复现 已经上线正常运行的项目突然很多功能无法使用&#xff0c;查看程序日志发现MySQL报错&#xff0c;异常信息: Could not open JDBC Connection for transaction; nested exception is com.alibaba.druid.pool.Ge…

分布式(计算机算法)

目录 分布式计算 分布式​编辑 分布式和集群 分布式和集群的应用场景 分布式应用场景 集群应用场景 哪种技术更优、更快、更好呢 性能 稳定性 以下概念来源于百度百科 分布式计算 分布式计算是近年提出的一种新的计算方式。所谓分布式计算就是在两个或多个软件互相共享信息…

【ArcGISProSDK】添加异步执行时进度窗口

运行结果 代码 protected override async Task InitializeAsync(){using (ProgressorSource progressorSource new ProgressorSource("初始化...")){await QueuedTask.Run(delegate{MessageBox.Show(licenseExpirationDate.ToString());}, progressorSource.Progres…

介绍一下Spring的AOP

一、问题解析 典型回答 AOP(Aspect-Oriented Programming)&#xff0c;即面向切面编程&#xff0c;用人话说就是把公共的逻辑抽出来&#xff0c;让开发者可以更专注于业务逻辑开发。 和IOC一样&#xff0c;AOP也指的是一种思想。AOP思想是OOP&#xff08;Object-Oriented Prog…

【Java刷题篇】滑动窗口

文章目录 &#x1f4c3;滑动窗口&#x1f4dc;基本概念&#x1f4dc;核心思路 ✍最大连续1的个数 III✍水果成篮 &#x1f4c3;滑动窗口 &#x1f4dc;基本概念 滑动窗口是一种基于双指针的一种思想&#xff0c;两个指针指向的元素之间形成一个窗口。 分类&#xff1a;窗口有…