news 2026/6/14 19:59:03

C# 生成命令行程序 将hex格式烧录程序转换成bin烧录格式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C# 生成命令行程序 将hex格式烧录程序转换成bin烧录格式

1.程序

using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace Hex2Bin { class Program { static void Main(string[] args) { if (args.Length < 2 || args.Length > 3) { ShowHelp(); return; } string inputFile = args[0]; string outputFile = args[1]; long startOffset = 0; long endOffset = long.MaxValue; // 处理可选的偏移参数 if (args.Length == 3) { if (!long.TryParse(args[2], System.Globalization.NumberStyles.HexNumber, null, out startOffset)) { Console.WriteLine("错误:无效的偏移地址格式"); return; } endOffset = long.MaxValue; } try { ConvertHexToBin(inputFile, outputFile, startOffset, endOffset); Console.WriteLine($"转换成功!输出文件:{outputFile}"); } catch (Exception ex) { Console.WriteLine($"错误:{ex.Message}"); } } static void ShowHelp() { Console.WriteLine("Hex2Bin - Intel HEX 转 BIN 格式转换工具"); Console.WriteLine("用法:Hex2Bin <输入文件.hex> <输出文件.bin> [起始偏移地址]"); Console.WriteLine("示例:"); Console.WriteLine(" Hex2Bin firmware.hex firmware.bin"); Console.WriteLine(" Hex2Bin firmware.hex firmware.bin 1000 // 从0x1000开始提取"); } static void ConvertHexToBin(string hexFile, string binFile, long startOffset, long endOffset) { var dataSegments = new Dictionary<long, byte>(); long minAddr = long.MaxValue; long maxAddr = long.MinValue; long currentSegmentAddr = 0; long extendedLinearAddr = 0; long extendedSegmentAddr = 0; string[] lines = File.ReadAllLines(hexFile); foreach (string line in lines) { if (string.IsNullOrWhiteSpace(line) || line[0] != ':') continue; // 解析HEX行 byte byteCount = Convert.ToByte(line.Substring(1, 2), 16); ushort address = Convert.ToUInt16(line.Substring(3, 4), 16); byte recordType = Convert.ToByte(line.Substring(7, 2), 16); string dataString = line.Substring(9, byteCount * 2); byte checksum = Convert.ToByte(line.Substring(9 + byteCount * 2, 2), 16); // 验证校验和 byte calcChecksum = 0; calcChecksum += byteCount; calcChecksum += (byte)(address >> 8); calcChecksum += (byte)(address & 0xFF); calcChecksum += recordType; for (int i = 0; i < byteCount; i++) { calcChecksum += Convert.ToByte(dataString.Substring(i * 2, 2), 16); } calcChecksum = (byte)((~calcChecksum + 1) & 0xFF); if (calcChecksum != checksum) { throw new Exception($"校验和错误:行 {line}"); } // 计算实际地址 long actualAddress; switch (recordType) { case 0x00: // 数据记录 actualAddress = extendedLinearAddr + address; if (extendedSegmentAddr != 0) actualAddress = (extendedSegmentAddr << 4) + address; // 存储数据 for (int i = 0; i < byteCount; i++) { byte data = Convert.ToByte(dataString.Substring(i * 2, 2), 16); long addr = actualAddress + i; if (addr >= startOffset && addr <= endOffset) { if (!dataSegments.ContainsKey(addr)) dataSegments[addr] = data; if (addr < minAddr) minAddr = addr; if (addr > maxAddr) maxAddr = addr; } } break; case 0x01: // EOF break; case 0x02: // 扩展段地址 extendedSegmentAddr = Convert.ToUInt16(dataString, 16); break; case 0x03: // 起始段地址 // 忽略 break; case 0x04: // 扩展线性地址 extendedLinearAddr = Convert.ToUInt32(dataString, 16) << 16; extendedSegmentAddr = 0; break; case 0x05: // 起始线性地址 // 忽略 break; } } if (dataSegments.Count == 0) { throw new Exception("没有找到有效的数据记录"); } // 创建连续的数据缓冲区 long totalSize = maxAddr - minAddr + 1; byte[] binData = new byte[totalSize]; // 填充数据 foreach (var kvp in dataSegments) { binData[kvp.Key - minAddr] = kvp.Value; } // 写入BIN文件 File.WriteAllBytes(binFile, binData); Console.WriteLine($"转换统计:"); Console.WriteLine($" 起始地址:0x{minAddr:X8}"); Console.WriteLine($" 结束地址:0x{maxAddr:X8}"); Console.WriteLine($" 数据大小:{totalSize} 字节"); } } }

2. 使用方法

# 基本用法 Hex2Bin.exe input.hex output.bin # 指定起始地址(十六进制) Hex2Bin.exe input.hex output.bin 1000 # 显示帮助 Hex2Bin.exe

3.程序特点

  1. 支持标准Intel HEX格式

    • 数据记录(00)

    • 文件结束记录(01)

    • 扩展段地址(02)

    • 扩展线性地址(04)

    • 起始地址记录(03, 05)

  2. 校验和验证:每行HEX数据都会验证校验和

  3. 地址范围过滤:可选的起始地址参数

  4. 内存高效:使用字典存储非连续数据段

4.使用示例

假设有HEX文件内容:

:100000000102030405060708090A0B0C0D0E0F101A :100010001112131415161718191A1B1C1D1E1F2029 :00000001FF

转换后的BIN文件将包含地址0x0000-0x001F的32字节数据。

这个工具适用于嵌入式开发中常见的固件格式转换需求。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 19:53:02

PPTist:零安装在线PPT制作工具的完整指南

PPTist&#xff1a;零安装在线PPT制作工具的完整指南 【免费下载链接】PPTist PowerPoint-ist&#xff08;/pauəpɔintist/&#xff09;, An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing for the editin…

作者头像 李华
网站建设 2026/6/14 19:51:57

从一道编程题看算法思维:如何用Java高效解决‘动物园栅栏’排队问题

从一道编程题看算法思维&#xff1a;如何用Java高效解决‘动物园栅栏’排队问题 当你在技术面试或算法竞赛中遇到看似简单的题目时&#xff0c;能否快速识别其中的关键约束条件并将其转化为高效的代码逻辑&#xff1f;"动物园栅栏"问题正是这样一个绝佳的教学案例&am…

作者头像 李华
网站建设 2026/6/14 19:49:59

大疆无人机固件自由下载:DankDroneDownloader完整使用指南

大疆无人机固件自由下载&#xff1a;DankDroneDownloader完整使用指南 【免费下载链接】DankDroneDownloader A Custom Firmware Download Tool for DJI Drones Written in C# 项目地址: https://gitcode.com/gh_mirrors/da/DankDroneDownloader 你是否曾因固件升级导致…

作者头像 李华
网站建设 2026/6/14 19:48:55

GPT-Image-2技术架构深度拆解:2026年图像生成模型全面解析

GPT-Image-2是OpenAI在2025年底推出的原生多模态图像生成模型&#xff0c;基于扩散Transformer&#xff08;DiT&#xff09;架构&#xff0c;深度集成于GPT-4o体系之中。它在文本渲染准确率&#xff08;约92%&#xff09;、空间推理能力和多轮编辑方面实现了显著提升&#xff0…

作者头像 李华
网站建设 2026/6/14 19:48:54

Python变量本质、命名规则与常量写法(破除新手认知误区)

博客摘要90%新手都误解了Python变量&#xff1a;变量不是装数据的盒子&#xff0c;只是贴在内存上的标签。本文从内存底层拆解变量赋值逻辑&#xff0c;区分硬性命名红线与PEP8规范&#xff0c;补齐Python无原生常量的替代写法&#xff0c;覆盖面试高频考点。一、变量底层本质&…

作者头像 李华
网站建设 2026/6/14 19:46:57

AI八十年演进史:从McCulloch-Pitts神经元到工业级模型落地

1. 项目概述&#xff1a;一场持续八十年的“思维模拟”实验 你有没有盯着手机里那个秒回你问题的聊天框&#xff0c;突然愣住一秒钟——它真的“懂”我在说什么吗&#xff1f;还是只是把一堆字词像拼乐高一样严丝合缝地搭了出来&#xff1f;这个问题&#xff0c;不是昨天才冒出…

作者头像 李华