嵌入式面试刷题(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.强制类型转换 总结 前言 本篇文章我们继续讲解嵌入式面试刷题,给大家继续分享嵌入式中的面…...
JVM源码剖析之Java命令行参数全解
最近,有一位网友询问关于Java命令行参数方面的问题,因为在Java中参数有很多种,有不少的读者一直没弄明白,所以特意写下此篇文章。 此篇文章分2大块,第一块是不同参数的解释,第2块就是JVM源码论证ÿ…...
抽象工厂模式-java实现
介绍 抽象工厂模式基于工厂方法模式引入了“产品族”的概念,即我们认为具体产品是固定的,具体产品存在等级之分,比如我们常说的手机,有“青春版”,“至尊版”,“至臻版”。一个产品有多个版本族。这时候&a…...
机器学习笔记 - 基于Python发现最佳计算机视觉模型的神经架构搜索技术NAS
一、简述 近年来,随着深度学习技术的兴起,计算机视觉领域取得了巨大进步。事实证明,卷积神经网络 (CNN) 在图像识别任务中异常强大,但针对特定问题设计最佳架构仍然是一项具有挑战性的任务。这就是神经架构搜索(NAS)发挥作用的地方。NAS 是一种尖端技术,可以自动发现高性…...
机器学习---自编码器
自编码器过程 输入一个图片,经过encoder变成一个向量,再通过decoder将这个向量反向生成输入的图片。 这里我们希望输入和输出越接近越好。这个过程我们称为重建。 特点:不需要任何的标注资料。 在2006年这个思想就被提出来了: …...
vuejs 设计与实现 - 渲染器的设计
渲染器与响应式系统的结合 本节,我们暂时将渲染器限定在 DOM 平台。既然渲染器用来渲染真实 DOM 元素,那么严格来说,下面的函数就是一个合格的渲染器: // 渲染器: function renderer(domString, container) {container.innerHTM…...
openCV 图像对象的创建和赋值
文章目录 一、赋值二、克隆三、拷贝四、初始化 一、赋值 赋值操作是将一个cv::Mat对象的数据复制到另一个对象中。赋值操作使用的是浅拷贝(shallow copy),即两个对象共享相同的数据内存。这意味着对一个对象的修改会影响到另一个对象 cv::M…...
idea - 刷新 Git 分支数据 / 命令刷新 Git 分支数据
一、idea - 刷新 Git 分支数据 idea 找到 fetch 选项,重新获取分支数据 二、命令刷新 Git 分支数据 git fetch参考链接 1. 远程Gitlab新建的分支在IDEA里不显示...
线上电影购票选座H5小程序源码开发
搭建一个线上电影购票选座H5小程序源码需要一些基本的技术和步骤。以下是一个大致的搭建过程,可以参考: 1. 确定需求和功能:首先要明确你想要的电影购票选座H5小程序的需求和功能,例如用户登录注册、电影列表展示、选座购票、订单…...
QT正则校验
文章目录 前言一、Qt正则校验1.对输入框进行校验,不允许输入其他字符2.直接校验字符串 二、常用正则校验表达式 前言 项目中会经常遇到需要对字符串进行校验的情况,需要用到正则表达式(Regular Expression,通常简写为RegExp、RE等…...
ChatGPT“侵入”校园,教学评价体制受冲击,需作出调整
北密歇根大学的教授奥曼在学生作业中发现了一篇关于世界宗教的“完美论文”。“这篇文章写得比大多数学生都要好......好到不符合我对学生的预期!”他去问ChatGPT:“这是你写的吗?”ChatGPT回答:“99.9%的概率是的。” ChatGPT“侵…...
函数的声明和定义
1、函数声明 //告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。 //函数的声明一般出现在函数的使用之前。要满足先声明后使用。 //函数的声明一般要放在头文件中的。 2、函数的定义 //函数…...
06微服务间的通信方式
一句话导读 微服务设计的一个挑战就是服务间的通信问题,服务间通信理论上可以归结为进程间通信,进程可以是同一个机器上的,也可以是不同机器的。服务可以使用同步请求响应机制通信,也可以使用异步的基于消息中间件间的通信机制。同…...
研发工程师玩转Kubernetes——local型PV和PVC绑定过程中的状态变化
PV全称是PersistentVolume,即持久卷,是由管理员事先准备好的资源。它可以是本地磁盘,也可以是网络磁盘。 PVC全称是PersistentVolumeClaim,即持久卷申领。它表示卷的使用者,对PV的申请。即我们可以认为,PV是…...
HTTP——十一、Web的攻击技术
HTTP 一、针对Web的攻击技术1、HTTP 不具备必要的安全功能2、在客户端即可篡改请求3、针对Web应用的攻击模式 二、因输出值转义不完全引发的安全漏洞1、跨站脚本攻击2、SQL 注入攻击3、OS命令注入攻击4、HTTP首部注入攻击5、邮件首部注入攻击6、目录遍历攻击7、远程文件包含漏洞…...
Python-OpenCV中的图像处理-图像金字塔
Python-OpenCV中的图像处理-图像金字塔 图像金字塔高斯金字塔拉普拉斯金字塔 金字塔图像融合 图像金字塔 同一图像的不同分辨率的子图集合,如果把最大的图像放在底部,最小的放在顶部,看起来像一座金字塔,故而得名图像金字塔。cv2…...
ArcGIS、ENVI、InVEST、FRAGSTATS技术教程
专题一 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化:地图符号与注…...
Unity-Linux部署WebGL项目MIME类型添加
在以往的文章中有提到过使用IIS部署WebGL添加MIME类型使WebGL项目在浏览器中能够正常加载,那么如果咱们做的是商业项目,往往是需要部署在学校或者云服务器上面的,大部分情况下如果项目有接口或者后台管理系统,后台基本都会使用Lin…...
MySQL:表的约束和基本查询
表的约束 表的约束——为了让插入的数据符合预期。 表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,auto_increment,unique key 。 空属性 两个值:null&am…...
mysql统计近7天数据量,,按时间戳分组
可以使用以下 SQL 语句来统计近7天的数据量,并按时间戳分组。如果某一天没有数据,则将其填充为0。 SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp), %Y-%m-%d) AS date,COUNT(*) AS count FROM table_name WHERE timestamp > UNIX_TIMESTAMP(DATE_SUB…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
