当前位置: 首页 > 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;从来没出现过这个问题&…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...