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

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字节数据。

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

http://www.jsqmd.com/news/1013851/

相关文章:

  • IWC万国表专业维修养护指南:守护沙夫豪森的精密时光 - 资讯速览
  • 数据类型转换:隐式转换与强制转换实战(避坑全覆盖)
  • 2026年6月最新版克拉玛依正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询
  • 终极指南:5步快速掌握Beat Saber模组管理神器ModAssistant
  • 社交行为与语言特征联合建模识别抑郁风险
  • 2026最新!江苏南通正规叛逆特训学校十大排名|本地靠谱机构清单,就近可送、收费透明,央视正规机构专治孩子网瘾厌学 - 辛云教育资讯
  • 2026上新:增城除甲醛公司实测横评|5家主流品牌深度对比,本地靠谱机构优选和避坑攻略 - 专注室内空气检测治理
  • 2026年6月最新版揭阳正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询
  • 数据结构底层原理:红黑树的工程实现与性能边界
  • 2026年6月最新版湖州正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询
  • 重载极速模块MCM08005H10K00详解
  • 2026年6月最新版昆明正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询
  • 深度解析:从 GitHub 热门项目看 SEO 自动化的技术架构演进
  • 2026年6月最新版呼和浩特正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询
  • 5分钟上手:League Akari - 英雄联盟玩家的终极智能游戏助手
  • 如何让经典DirectX游戏在Windows 11重生:DDrawCompat兼容性方案深度解析
  • TF-IDF文本分类实战:TensorFlow稀疏建模与工业级优化
  • 调查研究-176 taste-skill:AI 编程时代,前端开发最缺的不是代码,而是品味
  • 终极指南:如何用ModAssistant免费快速管理Beat Saber模组
  • 5分钟上手:Arduino红外遥控库完全指南
  • 2026年杭州GEO优化服务商深度评测与选型指南:谁才是企业增长真引擎? - 品牌报告
  • 2026年6月最新版贵阳正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询
  • 从原矿釉到窑火变化 文心素器 蒲石汝瓷解析“一器一色”的形成原因 - 品牌速递
  • 2026年6月最新版呼伦贝尔正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询
  • 让 Agent 在对话中成长:自进化机制的五层实现
  • OpenWebUI 安装、使用方法详细全解
  • 3分钟上手UI-TARS桌面版:用自然语言彻底告别重复GUI操作
  • 怎样在手机上免费运行AI模型:Maid项目的终极HuggingFace集成指南
  • Apate文件伪装技术:数字安全时代的数据防护新方案
  • 2026年6月最新版桂林正规房屋漏水防水补漏维修口碑名单:创维修缮机构等5家深度测评 - 一修哥咨询