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

我的创作纪念日【第一个2048day】

机缘

  1. 初心:研究生期间,帮老师做一个项目,过程中学习的东西想记录下来,于是,就选择了CADN
  2. 让技术分享成为工作的一部分

收获

  1. 获得了1800多粉丝的关注
  2. 获得了63万的访问量,其中《C#设计模式》专栏深受大家喜欢
  3. 关注了很多的技术大佬(主要在C#和汽车电子领域),从他们的文章中学到了很多

日常

  1. 创作已经是我生活的一部分了
  2. 虽然工作很忙,还是会主动挤出时间来创作

成就

Hex转bin文件的代码实现:

using System;
using System.Globalization;
using System.IO;
using System.Windows.Forms;namespace WindowsFormsApp1
{/*说明:1.hex内容读取规则示例: OxO-Ox500【所有字节内容都有】0x0-0x100,0x300-Ox500 【中间有部分地址内容缺失,根据实际情况默认填充Ox00/OxFF】2.扩展地址分区也可刷写【重点!!!】:hex文件地址分区的话(segment),此代码也可以通过*/public partial class Form1 : Form{     public Form1(){InitializeComponent();}public static string hexFilePath = null;//选择的hex文件路径public static string binFilePath = null;//保存的bin文件路径private void btn_OpenFile_Click(object sender, EventArgs e){OpenFileDialog open = new OpenFileDialog();open.RestoreDirectory = true;//open.Filter = "File(*.hex,*.s19)|*.hex;*.s19|BIN File(*.bin)|*.bin";open.Filter = "File(*.hex)|*.hex";open.InitialDirectory = Directory.GetCurrentDirectory();if (DialogResult.OK == open.ShowDialog()){hexFilePath = txt_HexFile.Text = open.FileName;binFilePath = open.FileName.Replace(".hex", ".bin");//确定生成的bin文件路径}}private void btn_StartConvert_Click(object sender, EventArgs e){try{//【01】获取hex文件的起始和终止地址(Lowest_Address和Highest_Address) ,并获取其字节长度(dataLength)GetAddress(hexFilePath);byte[] buffer = new byte[dataLength]; //创建和hex文件对应长度的字节数组//【02】填充数组内容//(情形1:所有地址内容都在hex文件中;情形2:在hex文件中有些地址内容缺失,需要填充默认值“0x00”或“0xFF”)FillData(hexFilePath, ref buffer);//【03】将数组写到bin文件WritetoBinFile(binFilePath, buffer, 0, dataLength);MessageBox.Show("转换成功");}catch (Exception ex){MessageBox.Show(ex.Message);}}public static int startAddress = 0;//解析的起始地址public static int endAddress = 0;//解析的终止地址public static int dataLength = 0;//字节总长度=endAddress-startAddress+1public static string startExtendedAddress = "0000";//第一个扩展地址public static string endExtendedAddress = "0000";//最后一个扩展地址public static bool isFirstExtendedAddress = true;//是否是第一次检测到“0x04”public static string startDataAddress = "0000";//第一个数据地址【对应startExtendedAddress】public static string endDataAddress = "0000";//最后一个数据地址【对应endExtendedAddress】public static bool isFirstDataAddress = true;//是否是第一次检测到“0x00”public static string lastDataLength = "00";//最后一行的数据长度/// <summary>/// 【第1步】获取hex文件的起始和终止地址,并获取其字节长度/// </summary>/// <param name="hexPath"></param>private void GetAddress(string hexPath){FileStream fsRead = new FileStream(hexPath, FileMode.OpenOrCreate, FileAccess.Read);StreamReader HexReader = new StreamReader(fsRead); //读取数据流while (true){string currentLineData = HexReader.ReadLine(); //读取Hex中一行if (currentLineData == null) { break; } //读取完毕,退出if (currentLineData.Substring(0, 1) == ":") //判断首字符是”:”{if (currentLineData.Substring(1, 8) == "00000001"){if (endExtendedAddress == "0000"){endAddress = Convert2Hex(startExtendedAddress + endDataAddress) + Convert2Hex(lastDataLength) - 1;//获得终止地址dataLength = endAddress - startAddress + 1;}else{endAddress = Convert2Hex(endExtendedAddress + endDataAddress) + Convert2Hex(lastDataLength) - 1;//获得终止地址dataLength = endAddress - startAddress + 1;}break;} //文件结束标识string type = currentLineData.Substring(7, 2);switch (type){case "04":if (isFirstExtendedAddress){startExtendedAddress = currentLineData.Substring(9, 4);isFirstExtendedAddress = false;}else{endExtendedAddress = currentLineData.Substring(9, 4);}break;case "00":if (isFirstDataAddress){startDataAddress = currentLineData.Substring(3, 4);startAddress = Convert2Hex(startExtendedAddress + startDataAddress);//获得起始地址isFirstDataAddress = false;}else{endDataAddress = currentLineData.Substring(3, 4);lastDataLength = currentLineData.Substring(1, 2);//为了获取最后一行的字节长度}break;default:break;}}}HexReader.Close();fsRead.Close();}/// <summary>///【第2步】填充数组内容/// </summary>/// <param name="hexPath">hex文件路径</param>/// <param name="buffer">填充的字节数组</param>private void FillData(string hexPath, ref byte[] buffer){int lastLine_EndAddress_Real = startAddress;//上一行结束的真实地址【扩展地址+数据地址】,初始值为hex文件的起始地址int currentLine_StartAddress_Real = 0;//下一行开始的真实地址【扩展地址+数据地址】string currentExtendedAddress = "0000";//当前扩展地址string currentLineDataAddress = "0000";//当前数据地址int current_BufferIndex = 0;FileStream fsRead = new FileStream(hexPath, FileMode.OpenOrCreate, FileAccess.Read);StreamReader HexReader = new StreamReader(fsRead); //读取数据流while (true){string currentLineData = HexReader.ReadLine(); //读取Hex中一行if (currentLineData == null) { break; } //读取完毕,退出if (currentLineData.Substring(0, 1) == ":") //判断首字符是”:”{//文件结束标识if (currentLineData.Substring(1, 8) == "00000001"){break;} string type = currentLineData.Substring(7, 2);//读取当前行的类型switch (type){case "04":currentExtendedAddress = currentLineData.Substring(9, 4);break;case "00":currentLineDataAddress = currentLineData.Substring(3, 4);//当前数据地址currentLine_StartAddress_Real = Convert2Hex(currentExtendedAddress + currentLineDataAddress);//实际开始地址值//如果这一次的起始地址不等于上一次结束的下一个地址,则填充"0x00"if (currentLine_StartAddress_Real != lastLine_EndAddress_Real){for (int i = 0; i < currentLine_StartAddress_Real - lastLine_EndAddress_Real; i++) // 补空位置{byte value = byte.Parse("00", NumberStyles.HexNumber);buffer[current_BufferIndex] = value;current_BufferIndex++;}}int currentLine_DataLength = Convert2Hex(currentLineData.Substring(1, 2));//获取当前行的数据长度for (int i = 0; i < currentLine_DataLength; i++){byte value = byte.Parse(currentLineData.Substring(i * 2 + 9, 2), NumberStyles.HexNumber);buffer[current_BufferIndex] = value;current_BufferIndex++;}lastLine_EndAddress_Real = currentLine_StartAddress_Real + currentLine_DataLength;break;default:break;}}}//关闭Stream和文件HexReader.Close();fsRead.Close();//hex文件最后没有的byte填充“00”if (buffer.Length > current_BufferIndex){for (int i = 0; i < buffer.Length - current_BufferIndex; i++){byte value = byte.Parse("FF", NumberStyles.HexNumber);buffer[current_BufferIndex + i] = value;}}}/// <summary>/// 【第3步】将数组写到bin文件/// </summary>/// <param name="binPath">新建bin文件的路径</param>/// <param name="buffer">写入的字节数组</param>/// <param name="startIndex">开始索引</param>/// <param name="length">写入的字节长度</param>private void WritetoBinFile(string binPath, byte[] buffer, int startIndex, int length){FileStream fsWrite = new FileStream(binPath, FileMode.Create, FileAccess.Write);//如果已存在相同文件名的文件,则删掉之前的,创建新的文件!!!fsWrite.Write(buffer, startIndex, length);fsWrite.Close();}/// <summary>/// 16进制字符串 转化为数值/// </summary>/// <param name="content">16进制字符串</param>/// <returns></returns>private int Convert2Hex(string content){return Convert.ToInt32(content, 16);}}
}

憧憬

希望在汽车电子领域深耕,创作更有价值的文章

相关文章:

我的创作纪念日【第一个2048day】

机缘 初心&#xff1a;研究生期间&#xff0c;帮老师做一个项目&#xff0c;过程中学习的东西想记录下来&#xff0c;于是&#xff0c;就选择了CADN让技术分享成为工作的一部分 收获 获得了1800多粉丝的关注获得了63万的访问量&#xff0c;其中《C#设计模式》专栏深受大家喜欢…...

内网穿透-————SSH远程连接树莓派

前言 文章目录 前言内网穿透实现公网SSH远程连接树莓派1. 在树莓派上安装[cpolar客户端](https://www.cpolar.com/)2. 在树莓派浏览器中输入本地9200端口3. 在公共互联网的电脑的命令行界面输入命令 内网穿透实现公网SSH远程连接树莓派 随着科技的进步和信息技术的发展&#x…...

一键开启ChatGPT“危险发言”

‍ ‍ 大数据文摘授权转载自学术头条 作者&#xff1a;Hazel Yan 编辑&#xff1a;佩奇 随着大模型技术的普及&#xff0c;AI 聊天机器人已成为社交娱乐、客户服务和教育辅助的常见工具之一。 然而&#xff0c;不安全的 AI 聊天机器人可能会被部分人用于传播虚假信息、操纵舆…...

RISC-V基础之函数调用(一)简单的函数调用(包含实例)

高级语言支持函数&#xff08;也称为过程或子程序&#xff09;来重用通用的代码&#xff0c;以及使程序更加模块化和可读。函数可以有输入&#xff0c;称为参数&#xff0c;和输出&#xff0c;称为返回值。函数应该计算返回值&#xff0c;并且不产生其他意外的副作用。 在一个…...

apt、aptitude、apt-get/apt-cache语法的区别

apt句法 aptitude句法 apt-get/apt-cache语法 描述 apt update aptitude update apt-get update 更新包存档元数据 apt install foo ap...

华为认证 | HCIA和HCIP有啥区别?

HCIA和HCIP都是华为认证体系里的&#xff0c;所以它们的考试流程大同小异&#xff0c;唯一区别的话&#xff0c;那可能就是课程内容方面的区别较大了。 那么HCIA和HCIP考试有啥区别呢&#xff1f;下面我们就来跟随小编来了解一下吧。 01 HCIA和HCIP考试有啥区别 ★ 等级不同 …...

JavaScript基础知识

JavaScript基础知识 一、变量与数据类型1. 变量2. 数据类型 二、表达式与运算符1.字面量2.表达式3.运算符3.1 算术运算符3.2 比较运算符3.3 逻辑运算符3.4 赋值运算符 三、条件语句1. 控制流程2. 语句块3. if 语句3. switch 语句4. 条件运算符 四、循环语句1. while2. do...whi…...

vue2 todoapp案例(静态)

1.创建三个子组件(TodoHeader、TodoMain、TodoFooter)和两个(index.css、base.css)样式&#xff1b; TodoHeader页面 <template><header class"header"><h1>todos</h1><input id"toggle-all" class"toggle-all" typ…...

qt5.14 和 qt5.15的区别

Qt 5.14 和 Qt 5.15 是两个不同的 Qt 版本&#xff0c;它们之间有一些区别和改进。 以下是一些 Qt 5.15 相对于 Qt 5.14 的变化和改进&#xff1a; 性能改进&#xff1a;Qt 5.15 引入了一些性能改进&#xff0c;包括提高渲染性能和减少内存占用。 Qt 3D&#xff1a;Qt 5.15 对…...

如何使用自己域名进行远程访问内网群晖NAS 6.X

使用自己的域名远程访问内网群晖NAS 6.X【内网穿透】 文章目录 使用自己的域名远程访问内网群晖NAS 6.X【内网穿透】 在之前的文章中&#xff0c;我们向大家演示了如何使用cpolar&#xff0c;创建一条固定的、能够在公共互联网登录内网群晖NAS的数据隧道。这条隧道已经能够应对…...

PHP判处重复延长队列执行时间

需求是这样&#xff1a; 14:00的时候&#xff0c;需要给1000个门店执行发券操作&#xff0c;有的门店需要发3个场景&#xff0c;开放平台的接口有请求频次限制&#xff0c;他是按照门店的场景发券需要间隔10秒。比如说&#xff0c;AB两个门店同时发a券&#xff0c;但不能 A门店…...

flask中的应用上下文

flask中的应用上下文 Flask应用上下文主要包含两个对象&#xff1a;current_app和g。这两个对象在处理请求期间都是全局可访问的&#xff0c;但在每个请求结束时都会被重置。 current_app&#xff1a;这是当前激活的Flask应用的实例。在大多数情况下&#xff0c;你可以将其视为…...

cocos creator 的input.on 不生效

序&#xff1a; 1、执行input.on的时候发现不生效 2、一直按控制台也打印不出来console.log 3、先收藏这篇&#xff0c;因为到时候cocos要开发serveApi的时候&#xff0c;你得选一款趁手的后端开发并且&#xff0c;对习惯用ts写脚本的你来说&#xff0c;node是入门最快&#xf…...

WFPlayer

WFPlayer WFPlayer 可以实现分析音视频生成音频波形图 在线demo地址: demo WFPlayer支持&#xff1a; 在不加载整个媒体文件的情况下创建波形自定义光标、进度、网格、标尺显示和颜色加载媒体url和加载媒体dom元素&#xff08;视频标签和音频标签&#xff09;颜色或宽度等实时…...

Netty面试题

1.BIO、NIO 和 AIO 的区别&#xff1f; BIO&#xff1a;一个连接一个线程&#xff0c;客户端有连接请求时服务器端就需要启动一个线程进行处理。线 程开销大。 伪异步 IO&#xff1a;将请求连接放入线程池&#xff0c;一对多&#xff0c;但线程还是很宝贵的资源。 NIO&#x…...

基于Home Assistant远程开门

基于Home Assistant远程开门 1.购买云服务器 1.1 阿里云服务器 本人使用的是阿里云服务器&#xff0c;其他的腾讯云&#xff0c;百度云都可以 如果你想要一个建议的话&#xff1a; 推荐在打折优惠的时候买&#xff0c;比如双十一 阿里云最近有一个飞天计划&#xff0c;在校…...

Docker相关的参数配置

Docker的配置文件/etc/docker/daemon.json中的大部分配置项如下所示 &#xff1a; {"allow-nondistributable-artifacts": [],"api-cors-header": "","authorization-plugins": [],"bip": "","bridge"…...

【CSS3】CSS3 2D 转换 - scale 缩放 ③ ( 使用 scale 设置制作可缩放的按钮案例 )

文章目录 一、需求分析二、代码分析三、代码示例四、执行结果 一、需求分析 设置一个 按钮 , 默认状态下显示的样式如下 : 按钮 外部 有 圆形的外边框 ;按钮 中的文本 , 水平居中对齐 , 垂直居中对齐 ; 当鼠标移动到 按钮 上之后 , 鼠标 变为 小手 样式 , 并且 按钮 以 中心位…...

Stable Diffusion教程(6) - 图片高清放大

放大后细节 修复图片损坏 显存占用 速度 批量放大 文生图放大 好 是 高 慢 否 附加功能放大 一般 否 中 快 是 图生图放大 好 是 低 慢 是 tile模型放大 非常好 是 高 快 是 通过文生图页面的高清修复 优点&#xff1a;放大时能添加更多细节&am…...

freeswitch 1.10.10-dev录音早期媒体卡通道的bug分析

最近编译了fs 1.10.10-dev也就是 master版本&#xff08;2023年7月6日&#xff09; 给几个客户升级了一下&#xff0c;发现非常不稳定(每天都有几个通道卡在early状态)&#xff0c;最近才有空来分析原因。 之前跑的是1.10.8 release 版本&#xff0c;从来没出现过这个问题&…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...