<rust>在rust中,实现32位浮点数与16进制之间的转换

前言
本文是基于rust,对16进制、32位浮点数之间的互相转换的一个简单示例。

环境配置
系统:windows
平台:visual studio code
语言:rust
库:hex

关键依赖

hex="0.4.3"

对于字符串与16进制之间的互相转换,我们使用hex这个crate。所以需要添加hex依赖,在toml文件中手动添加,如上,或者使用cargo添加:
cargo add hex
也可以指定版本:
cargo add hex@0.4.3

数字字符串转字节数组

为了方便管理,我们可以新建一个rust文件,命名为hexconvert.rs。然后我们在其中编写功能函数,首先是string_to_hex:

///
/// 字符串转16进制
/// 
/// 例:'01030002' -> [0x01,0x03,0x00,0x02]
pub fn string_to_hex(s:String) -> Vec<u8> {let input_re=hex::decode(s);if let Ok(input_hex) = input_re{return  input_hex} else {return vec![]}
}

hex的函数decode的作用是解码字符串,将对应的数字字符串解码为字节数组,字节数组就是我们所需要的原始数据,可以显示为各种进制的数值,当然也包括16进制。

字节数组转32位浮点数

rust中有自带的处理数值的函数,对于32位浮点数即f32数值类型,可以使用from_be_bytes或者from_le_bytes来从字节数组转换。

///
/// 16进制转32位浮点数
/// 
/// Example 1:  
/// 
/// [0x41,0x48,0x00,0x00] -> 12.5(mode is "big endian")
/// 
/// [0x00,0x00,0x48,0x41] -> 12.5(mode is "little endian")
/// 
/// Example 2:
/// 
/// [0x41,0x48,0x00,0x00,...] -> ???(长度判断)
/// 
/// 
pub fn hex_to_float_frombytes<T: AsRef<[u8]>>(hex: T, mode: Option<&str>) -> Option<f32> {let bytes = hex.as_ref();if bytes.len() == 4 {let mut array = [0u8; 4];array.copy_from_slice(bytes);match mode.unwrap_or("big") {"big" => Some(f32::from_be_bytes(array)),"little" => Some(f32::from_le_bytes(array)),_ => {Some(f32::from_ne_bytes(array))}}} else {println!("err:数组长度异常");None}
}

在上面的函数中,我们对传入的字节数组进行了简单判断,因为32位浮点数,长度是4个字节,所以字节长度如果不对,那么转换的数值显然也是错误的。另外,不同的终端控制器或者发送设备,其字节端序也不一定一样,有大端和小端之分,即big endian和little endian,也就是be和le。
所以,我们还添加了一个mode参数,用于判断端序。

浮点数转字符串

将一个浮点型数值转为等值的字符串或者16进制字符串,我们可以使用hex的encode函数。

///
/// 32位浮点数转字符串
/// 
/// 例:12.5 -> "12.5"(to_hex is false)
/// 
/// 例:12.5 -> "0x41,0x48,0x00,0x00"(to_hex is true)
#[allow(unused)]
pub fn float_to_string(f:f32,mode:Option<&str>,to_hex:bool) -> String {let mut s:String=String::new();if to_hex == false {s=format!("{}",f)} else {match mode.unwrap_or("big") {"big" => {let hex=hex::encode(f.to_be_bytes());s=format!("{}",hex)},"little" => {let hex=hex::encode(f.to_le_bytes());s=format!("{}",hex)},_ => {let hex=hex::encode(f.to_ne_bytes());s=format!("{}",hex)}}}return s
}

此处我们增加了to_hex来选择是直接转为等值字符还是转为等值16进制字符。

下面是一个实例演示,我们将通过终端输入一个字符串:00004841,这是小端序的浮点数:12.5。
我们使用小端序解码,然后是大端序再转会字符串,看看效果:

rust字符串与字节数组转换演示

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:深入了解fd文件描述符

目录 1. 文件分类 2. IO函数 2.1 fopen读写模式 2.2 重定向 2.3 标准文件流 3. 系统调用 3.1 open函数认识 3.2 open函数使用 3.3 close函数 3.4 write函数 3.5 read函数 4. fd文件描述符 4.1 标准输入输出 4.2 什么是文件描述符 4.3 语言级文件操作 1. 文件分类…

数据结构:栈(Stack)和队列(Queue)—面试题(一)

目录 1、括号匹配 2、逆波兰表达式求值 3、栈的压入、弹出序列 4、最小栈 1、括号匹配 习题链接https://leetcode.cn/problems/valid-parentheses/description/ 描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] …

51单片机(一) keil4工程与小灯实验

直接开始 新建一个工程 在这里插入图片描述 添加文件 另存为 添加文件到组 写下一个超循环系统代码 调整编译项编译 可以在工程目录找到编译好的led_fst.hex 自行烧写到各自的开发板。 会看到什么都没有。 现在定义一个GPIO端口与小灯的连接&#xff0c;再点亮小灯…

基于 Python 和 OpenCV 的人脸识别上课考勤管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Vue2:el-table中的文字根据内容改变颜色

想要实现的效果如图,【级别】和【P】列的颜色根据文字内容变化 1、正常创建表格 <template><el-table:data="tableData"style="width: 100%"><el-table-column prop="id" label="ID"/> <el-table-column …

案例研究:UML用例图中的结账系统

在软件工程和系统分析中&#xff0c;统一建模语言&#xff08;UML&#xff09;用例图是一种强有力的工具&#xff0c;用于描述系统与其用户之间的交互。本文将通过一个具体的案例研究&#xff0c;详细解释UML用例图的关键概念&#xff0c;并说明其在设计结账系统中的应用。 用…

73.矩阵置零 python

矩阵置零 题目题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a; 题解思路分析Python 实现代码代码解释提交结果 题目 题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例…

C++【深入底层,从零模拟实现string类】

在学习了类和对象、模板等前期的C基础知识之后&#xff0c;我们可以尝试根据C标准库中所提供的接口类型&#xff0c;来搭建我们自己的string类型。这个过程有助于初学者掌握C的基础语法及底层逻辑。 框架的搭建 首先搭建模型的基础框架&#xff0c;需要建立my_string.h和my_st…

切忌 SELECT *,就算表只有一列

原文地址 尽量避免 SELECT *&#xff0c;即使在单列表上也是如此 – 如果你现在不同意这一点&#xff0c;读完这篇文章&#xff0c;你可能就要动摇了。 2012年的一个故事 这是我 12 年前&#xff08;约 2012-2013 年&#xff09;在客户后台应用程序中遇到的一个真实故事。 当…

DEV C++软件下载

一、进入网站 https://sourceforge.net/projects/orwelldevcpp/ 二、点击下载 三、安装步骤 1、点击 “OK” 2、点击“I agree” 3、点击“Next” 4、按步骤切换路径&#xff0c;本文选在D盘&#xff0c;可自行选取文件路径 5、等待安装 6、点击完成 7、选择语言 8、点击“N…

OpenBSD之安装指南

安装介质下载 OpenBSD的官网下载地址&#xff1a;https://www.openbsd.org/faq/faq4.html#Download&#xff0c;同时也是《OpenBSD FAQ - Installation Guide》。长篇大论了很多&#xff0c;每一个章节都能看懂是干嘛的&#xff0c;连起来就容易晕。并且是英文的&#xff0c;要…

Vue.config.productionTip = false 不起作用的问题及解决

文章目录 一、问题描述二、解决方法 一、问题描述 当我们在代码页面上引入Vue.js(开发版本)时&#xff0c;运行代码会出现以下提示&#xff0c;这句话的意思是&#xff1a;您正在开发模式下运行Vue&#xff0c;在进行生产部署时&#xff0c;请确保打开生产模式 You are runni…

C#,图论与图算法,输出无向图“欧拉路径”的弗勒里(Fleury Algorithm)算法和源程序

1 欧拉路径 欧拉路径是图中每一条边只访问一次的路径。欧拉回路是在同一顶点上开始和结束的欧拉路径。 这里展示一种输出欧拉路径或回路的算法。 以下是Fleury用于打印欧拉轨迹或循环的算法&#xff08;源&#xff09;。 1、确保图形有0个或2个奇数顶点。2、如果有0个奇数顶…

oracle闪回表

文章目录 闪回表案例1&#xff1a;&#xff08;未清理回收站时的闪回表--成功&#xff09;案例2&#xff08;清理回收站时的闪回表--失败&#xff09;案例3&#xff1a;彻底删除表&#xff08;不经过回收站--失败&#xff09;案例4&#xff1a;闪回表之后重新命名新表总结1、删…

CSS——22.静态伪类(伪类是选择不同元素状态)

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>静态伪类</title> </head><body><a href"#">我爱学习</a></body> </html>单击链接前的样式 左键单击&#xff08;且…

Java Spring Boot实现基于URL + IP访问频率限制

点击下载《Java Spring Boot实现基于URL IP访问频率限制(源代码)》 1. 引言 在现代 Web 应用中&#xff0c;接口被恶意刷新或暴力请求是一种常见的攻击手段。为了保护系统资源&#xff0c;防止服务器过载或服务不可用&#xff0c;需要对接口的访问频率进行限制。本文将介绍如…

数据结构(Java版)第七期:LinkedList与链表(二)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 一、链表的实现&#xff08;补&#xff09; 接上一期&#xff0c;下面我们要实现删除所有值为key的元素&#xff0c;这时候有的老铁就会想用我们上一期中讲到的remove方法&#xff0c;循环使用remove方法&#…

C#Halcon找线封装

利用CreateMetrologyModel封装找线工具时&#xff0c;在后期实际应用调试时容易把检测极性搞混乱&#xff0c;造成检测偏差&#xff0c;基于此&#xff0c;此Demo增加画线后检测极性的指引&#xff0c;首先看一下效果 加载测试图片 画线 确定后指引效果 找线效果 修改显示 UI代…

ORB-SALM3配置流程及问题记录

目录 前言 一、OPB-SLAM3基本配置流程 1.下载编译Pangolin 二、ORB-SLAM3配置 1.下载源码 2.创建ROS工作空间并编译ORB-SLAM3-ROS源码 3.尝试编译 三、运行测试 一、OPB-SLAM3基本配置流程 ORB-SLAM3是一个支持视觉、视觉加惯导、混合地图的SLAM&#xff08;Simultane…

Unity2D初级背包设计后篇 拓展举例与不足分析

Unity2D初级背包设计中篇 MVC分层撰写(万字详解)-CSDN博客、 如果你已经搞懂了中篇&#xff0c;那么对这个背包的拓展将极为简单&#xff0c;我就在这里举个例子吧 目录 1.添加物品描述信息 2.拓展思路与不足分析 1.没有删除只有丢弃功能&#xff0c;所以可以添加垃圾桶 2.格…