当前位置: 首页 > news >正文

嵌入式面试刷题(day3)

文章目录

  • 前言
  • 一、怎么判断两个float是否相同
  • 二、float数据可以移位吗
  • 三、数据接收和发送端大小端不一致怎么办
  • 四、怎么传输float类型数据
    • 1.使用联合进行传输
    • 2.使用字节流
    • 3.强制类型转换
  • 总结


前言

本篇文章我们继续讲解嵌入式面试刷题,给大家继续分享嵌入式中的面试笔试经验和技巧。

一、怎么判断两个float是否相同

在C语言中,可以使用以下代码来比较两个float类型的数据是否相同:

#include <stdio.h>
#include <math.h>int main() {float a = 1.234;float b = 1.234;float epsilon = 0.000001; // 误差范围if (fabs(a - b) <= epsilon) {printf("两个浮点数相同\n");} else {printf("两个浮点数不同\n");}return 0;
}

上述代码中,通过计算两个浮点数之差的绝对值,并与给定的误差范围进行比较。如果差值小于等于指定的误差范围,则判定两个浮点数相同。

请注意,选择适当的误差范围是很重要的,它需要根据具体的应用场景和浮点数的精度要求来调整。在实际应用中,你可以根据需要调整epsilon的值来满足要求。

二、float数据可以移位吗

在C语言中,浮点数类型(如float)不直接支持移位操作。移位操作通常适用于整数类型,如int或unsigned int,而不适用于浮点数类型。

三、数据接收和发送端大小端不一致怎么办

当数据的接收端和发送端大小端不一致时,需要进行大小端转换(Endianness Conversion)以确保数据的正确解析。以下是一些常见的处理方法:

1.手动字节交换:将接收到的数据字节按照对应的顺序进行交换。例如,对于一个4字节的整数,可以将接收到的字节0、1、2、3分别与字节3、2、1、0进行交换。

2.使用联合体(Union)进行转换:定义一个联合体,其中包含原始数据类型和适应目标大小端的数据类型,并将原始数据读入联合体的原始数据类型中,然后从联合体的大小端适应数据类型中读取数据。

#include <stdio.h>typedef union interview
{unsigned int val;unsigned char data[4];
}EndianConverter;int main(void)
{EndianConverter mydata;mydata.val = 0xffeeccdd;printf("mydata.val : %x\n", mydata.val);for(int i = 0; i < 4; i++){printf("data[%d] : %x\n", i, mydata.data[i]);}return 0;
}

运行结果:
在这里插入图片描述

3.使用库函数:一些编程语言和库提供了内置的函数或方法来进行大小端转换。例如,C语言中可以使用htons和htonl函数将主机字节序转换为网络字节序,使用ntohs和ntohl函数将网络字节序转换回主机字节序。类似地,其他编程语言和库通常也提供了类似的功能函数。

四、怎么传输float类型数据

1.使用联合进行传输

使用联合(union)传输float类型数据的原理是通过共享内存空间来实现类型转换。联合是一种特殊的数据结构,它允许在同一段内存中使用不同的数据类型。

在使用联合传输float类型数据时,我们定义一个联合体,其中包含一个float类型字段和一个unsigned char类型的字节数组字段。这样,float类型字段和字节数组字段共享同一段内存空间。

在发送端,将float类型的数据赋值给联合体的float字段,这样数据就会存储在联合体的内存空间中。然后,通过访问联合体的字节数组字段,我们可以以字节序列的形式访问float类型数据的每个字节。

在接收端,接收到的字节序列存储在与发送端相同的联合体中的字节数组字段中。通过访问联合体的float字段,我们可以将字节序列重新解释为float类型数据。

示例代码:

发送端:

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>int main(int argc, char**argv)
{int fd = socket(AF_INET, SOCK_STREAM, 0);int err;char input[32];char recvbuf[64];int r = 0;int i = 0;union Mydata{float send_data;unsigned char data[4];};union Mydata F_data;F_data.send_data = 3.1456;if(fd < 0){printf("socket err\n");return -1;}struct sockaddr_in addr = {0};addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr("192.168.244.175");addr.sin_port = htons(8888);err = connect(fd, (struct sockaddr*)&addr, sizeof(addr));if(err == -1){printf("connect err\n");return -1;}printf("connect success\n");while(1){send(fd, F_data.data, 4, 0);sleep(1);}close(fd);return 0;
}

接收端:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>int main()
{int server = 0;struct sockaddr_in saddr = {0};int client = 0;struct sockaddr_in caddr = {0};socklen_t asize = 0;int len = 0;char buf[32] = {0};int r = 0;float mydata;union server1_data{float val;unsigned char data[4];};union server1_data recv_data;server = socket(PF_INET, SOCK_STREAM, 0);if( server == -1 ){printf("server socket error\n");return -1;}saddr.sin_family = AF_INET;saddr.sin_addr.s_addr = htonl(INADDR_ANY);saddr.sin_port = htons(8888);if( bind(server, (struct sockaddr*)&saddr, sizeof(saddr)) == -1 ){printf("server bind error\n");return -1;}if( listen(server, 1) == -1 ){printf("server listen error\n");return -1;}printf("server start success\n");while( 1 ){asize = sizeof(caddr);client = accept(server, (struct sockaddr*)&caddr, &asize);if( client == -1 ){printf("client accept error\n");return -1;}printf("client: %d\n", client);do{r = recv(client, recv_data.data, 4, 0);if( r > 0 ){mydata = recv_data.val;printf("mydata : %f\n", mydata);}} while ( r > 0 );close(client);}close(server);return 0;
}

2.使用字节流

使用字节流传输float类型数据的原理是将float数据拆分为字节,并按照特定的顺序传输这些字节。在接收端,再将接收到的字节重新组合成float类型数据。

在传输float数据时,float类型通常占用4个字节(32位)。可以根据系统的字节序(大端序或小端序)选择数据的传输顺序。

在发送端,首先将要传输的float数据的地址强制转换为uint8_t类型的指针,这将允许按字节访问数据。然后通过依次访问指针位置的字节,可以获得float数据的每个字节。按照约定的字节序(大端序或小端序),将这些字节依次发送到接收端。

在接收端,按照相同的字节序,依次接收到字节,将其存储到一个uint8_t类型的缓冲区中。然后,将这些字节按照字节序重新组合成float类型数据。

代码示例:

发送端:

float data = 3.1456;
unsigned char send_data[4];
memcpy(send_data, &data, 4);
send(fd, send_data, 4, 0);

接收端:

float mydata;
float recv_data[4];r = recv(client, recv_data, 4, 0);if( r > 0 )
{memcpy(&mydata, recv_data, 4);printf("data : %f\n", mydata);
}

3.强制类型转换

发送端:

float send_data = 3.1456;
send(fd, (char*)&send_data, 4, 0);

接收端:

float mydata;
r = recv(client, (char*)&mydata, 4, 0);

总结

本篇文章就讲解到这里,下篇文章我们继续讲解嵌入式面试笔试技巧和难点。

相关文章:

嵌入式面试刷题(day3)

文章目录 前言一、怎么判断两个float是否相同二、float数据可以移位吗三、数据接收和发送端大小端不一致怎么办四、怎么传输float类型数据1.使用联合进行传输2.使用字节流3.强制类型转换 总结 前言 本篇文章我们继续讲解嵌入式面试刷题&#xff0c;给大家继续分享嵌入式中的面…...

JVM源码剖析之Java命令行参数全解

最近&#xff0c;有一位网友询问关于Java命令行参数方面的问题&#xff0c;因为在Java中参数有很多种&#xff0c;有不少的读者一直没弄明白&#xff0c;所以特意写下此篇文章。 此篇文章分2大块&#xff0c;第一块是不同参数的解释&#xff0c;第2块就是JVM源码论证&#xff…...

抽象工厂模式-java实现

介绍 抽象工厂模式基于工厂方法模式引入了“产品族”的概念&#xff0c;即我们认为具体产品是固定的&#xff0c;具体产品存在等级之分&#xff0c;比如我们常说的手机&#xff0c;有“青春版”&#xff0c;“至尊版”&#xff0c;“至臻版”。一个产品有多个版本族。这时候&a…...

机器学习笔记 - 基于Python发现最佳计算机视觉模型的神经架构搜索技术NAS

一、简述 近年来,随着深度学习技术的兴起,计算机视觉领域取得了巨大进步。事实证明,卷积神经网络 (CNN) 在图像识别任务中异常强大,但针对特定问题设计最佳架构仍然是一项具有挑战性的任务。这就是神经架构搜索(NAS)发挥作用的地方。NAS 是一种尖端技术,可以自动发现高性…...

机器学习---自编码器

自编码器过程 输入一个图片&#xff0c;经过encoder变成一个向量&#xff0c;再通过decoder将这个向量反向生成输入的图片。 这里我们希望输入和输出越接近越好。这个过程我们称为重建。 特点&#xff1a;不需要任何的标注资料。 在2006年这个思想就被提出来了&#xff1a; …...

vuejs 设计与实现 - 渲染器的设计

渲染器与响应式系统的结合 本节&#xff0c;我们暂时将渲染器限定在 DOM 平台。既然渲染器用来渲染真实 DOM 元素&#xff0c;那么严格来说&#xff0c;下面的函数就是一个合格的渲染器: // 渲染器&#xff1a; function renderer(domString, container) {container.innerHTM…...

openCV 图像对象的创建和赋值

文章目录 一、赋值二、克隆三、拷贝四、初始化 一、赋值 赋值操作是将一个cv::Mat对象的数据复制到另一个对象中。赋值操作使用的是浅拷贝&#xff08;shallow copy&#xff09;&#xff0c;即两个对象共享相同的数据内存。这意味着对一个对象的修改会影响到另一个对象 cv::M…...

idea - 刷新 Git 分支数据 / 命令刷新 Git 分支数据

一、idea - 刷新 Git 分支数据 idea 找到 fetch 选项&#xff0c;重新获取分支数据 二、命令刷新 Git 分支数据 git fetch参考链接 1. 远程Gitlab新建的分支在IDEA里不显示...

线上电影购票选座H5小程序源码开发

搭建一个线上电影购票选座H5小程序源码需要一些基本的技术和步骤。以下是一个大致的搭建过程&#xff0c;可以参考&#xff1a; 1. 确定需求和功能&#xff1a;首先要明确你想要的电影购票选座H5小程序的需求和功能&#xff0c;例如用户登录注册、电影列表展示、选座购票、订单…...

QT正则校验

文章目录 前言一、Qt正则校验1.对输入框进行校验&#xff0c;不允许输入其他字符2.直接校验字符串 二、常用正则校验表达式 前言 项目中会经常遇到需要对字符串进行校验的情况&#xff0c;需要用到正则表达式&#xff08;Regular Expression&#xff0c;通常简写为RegExp、RE等…...

ChatGPT“侵入”校园,教学评价体制受冲击,需作出调整

北密歇根大学的教授奥曼在学生作业中发现了一篇关于世界宗教的“完美论文”。“这篇文章写得比大多数学生都要好......好到不符合我对学生的预期&#xff01;”他去问ChatGPT&#xff1a;“这是你写的吗&#xff1f;”ChatGPT回答&#xff1a;“99.9%的概率是的。” ChatGPT“侵…...

函数的声明和定义

1、函数声明 //告诉编译器有一个函数叫什么&#xff0c;参数是什么&#xff0c;返回类型是什么。但是具体是不是存在&#xff0c;函数声明决定不了。 //函数的声明一般出现在函数的使用之前。要满足先声明后使用。 //函数的声明一般要放在头文件中的。 2、函数的定义 //函数…...

06微服务间的通信方式

一句话导读 微服务设计的一个挑战就是服务间的通信问题&#xff0c;服务间通信理论上可以归结为进程间通信&#xff0c;进程可以是同一个机器上的&#xff0c;也可以是不同机器的。服务可以使用同步请求响应机制通信&#xff0c;也可以使用异步的基于消息中间件间的通信机制。同…...

研发工程师玩转Kubernetes——local型PV和PVC绑定过程中的状态变化

PV全称是PersistentVolume&#xff0c;即持久卷&#xff0c;是由管理员事先准备好的资源。它可以是本地磁盘&#xff0c;也可以是网络磁盘。 PVC全称是PersistentVolumeClaim&#xff0c;即持久卷申领。它表示卷的使用者&#xff0c;对PV的申请。即我们可以认为&#xff0c;PV是…...

HTTP——十一、Web的攻击技术

HTTP 一、针对Web的攻击技术1、HTTP 不具备必要的安全功能2、在客户端即可篡改请求3、针对Web应用的攻击模式 二、因输出值转义不完全引发的安全漏洞1、跨站脚本攻击2、SQL 注入攻击3、OS命令注入攻击4、HTTP首部注入攻击5、邮件首部注入攻击6、目录遍历攻击7、远程文件包含漏洞…...

Python-OpenCV中的图像处理-图像金字塔

Python-OpenCV中的图像处理-图像金字塔 图像金字塔高斯金字塔拉普拉斯金字塔 金字塔图像融合 图像金字塔 同一图像的不同分辨率的子图集合&#xff0c;如果把最大的图像放在底部&#xff0c;最小的放在顶部&#xff0c;看起来像一座金字塔&#xff0c;故而得名图像金字塔。cv2…...

ArcGIS、ENVI、InVEST、FRAGSTATS技术教程

专题一 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与注…...

Unity-Linux部署WebGL项目MIME类型添加

在以往的文章中有提到过使用IIS部署WebGL添加MIME类型使WebGL项目在浏览器中能够正常加载&#xff0c;那么如果咱们做的是商业项目&#xff0c;往往是需要部署在学校或者云服务器上面的&#xff0c;大部分情况下如果项目有接口或者后台管理系统&#xff0c;后台基本都会使用Lin…...

MySQL:表的约束和基本查询

表的约束 表的约束——为了让插入的数据符合预期。 表的约束很多&#xff0c;这里主要介绍如下几个&#xff1a; null/not null,default, comment, zerofill&#xff0c;primary key&#xff0c;auto_increment&#xff0c;unique key 。 空属性 两个值&#xff1a;null&am…...

mysql统计近7天数据量,,按时间戳分组

可以使用以下 SQL 语句来统计近7天的数据量&#xff0c;并按时间戳分组。如果某一天没有数据&#xff0c;则将其填充为0。 SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp), %Y-%m-%d) AS date,COUNT(*) AS count FROM table_name WHERE timestamp > UNIX_TIMESTAMP(DATE_SUB…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...