恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

嵌入式固件BIN与HEX互转合并实战:srec_cat命令与避坑指南

  • 首页
  • 资讯中心
  • /
  • 嵌入式固件BIN与HEX互转合并实战:srec_cat命令与避坑指南

相关资讯

变量在内存中到底是什么:地址、长度与类型解释三要素 2026/10/19 3:58:20
RTD2660数据手册与源码解析:驱动板点亮到固件定制 2026/10/19 3:58:20
嵌入式固件BIN与HEX互转合并实战:格式解析、地址管理与避坑指南 2026/10/19 3:58:20

最新资讯

让Code Review自动化:基于CI的增量代码审查流水线实践
YOLO26涨点优化:RepViTBlock与C3k2二次创新融合方案
双狐地质建模软件:构造曲面缝合与T0时深转换实战指南
用Groovy脚本搞定Tomcat压测:从动态参数到JMX监控实战
开源代码审查工具 open-code-review:原理、部署与工程化实践
SELinux 不再关:从拒绝日志到策略配置的完整排错实战

今日推荐

OpenCowork 实测:支持本地文件、飞书机器人的 Windows AI 助手(只需配置 Token)
GPT-6 Sol 与 Luna 怎么选?Chat、Work、Codex 版本差异与 TaoToken 接入实测
openclaw.net 集成 ElBruno.MempalaceNet 记忆系统:把 MCP 配置改到 TaoToken 的完整实践

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

嵌入式固件BIN与HEX互转合并实战:srec_cat命令与避坑指南

发布时间:2026/10/19 3:58:20
嵌入式固件BIN与HEX互转合并实战:srec_cat命令与避坑指南 简介这是一款面向嵌入式开发者的BIN与HEX文件互转合并工具基于对话框程序实现适合需要处理单片机固件格式转换的工程师使用。工具支持BIN转HEX、HEX转BIN以及HEX文件合并三类操作并针对实际使用中的典型问题做了持续修正20230205版本将转HEX时输入的A~F字符统一为大写避免Keil使用出错20230215版本修复了BIN文件超过64K时数据错乱的问题20230709版本解决了C8051所用Keil编译的HEX文件转BIN时的错误。资源包共22个文件包含5个h头文件、4个cpp源文件、2个exe可执行程序以及txt说明文档、rc资源脚本、ico图标等压缩包约654KB源码结构清晰可直接编译或运行。目前已有3664人学习下载适合需要快速完成固件格式转换、排查转换异常或参考对话框程序实现的开发者自取使用。1. 烧录前的格式焦虑BIN 和 HEX 到底谁在管地址做嵌入式烧录的人多半遇到过这种场景从产线拿回来一个.bin想用仿真器下载结果工具只认.hex或者从 IDE 导出一个.hex想丢给量产工具批量刷写对方偏偏只吃.bin。两个文件明明描述的是同一段固件却因为格式不同卡在门口。BIN 和 HEX 的互转与合并就是解决这类格式不对口的基础操作也是固件打包、OTA 差分、多区固件拼接绕不开的一环。它适合刚接触 MCU 烧录的新手也适合需要把 bootloader、app、参数区拼成一个镜像的熟手。这篇就把转换和合并的规则、命令、参数和坑一次讲透让你拿到任意一种格式都能自己动手处理。2. 先搞懂 BIN 与 HEX 的地址模型为什么不能直接拼接2.1 BIN 是纯字节流地址靠外部约定BIN 文件本质上就是一段连续的二进制字节文件里不包含任何地址信息。第 0 个字节对应哪个 Flash 地址完全由烧录工具或链接脚本约定。常见做法是烧录时手动指定起始地址比如0x08000000工具就从这里开始把字节一个个写进去。这带来一个直接后果两个 BIN 文件不能简单用cat拼在一起。因为拼接后第二个文件的起始地址变成了第一个文件的结束地址而你真正想要的往往是第二个文件落在另一个固定地址比如参数区0x08080000。所以 BIN 的合并必须先知道每段的加载地址再按地址填充空隙而不是首尾相接。2.2 HEX 自带地址记录天然支持多段HEX 文件Intel HEX 格式是文本文件每行是一条记录格式大致是:LLAAAATT[DD...]CCLL本行数据字节数AAAA16 位地址TT记录类型00数据、01结束、02扩展段地址、04扩展线性地址DD实际数据CC校验和关键在TT04的扩展线性地址记录它把地址高 16 位抬起来于是 HEX 能表达 32 位地址空间并且允许数据在地址上不连续。也就是说一个 HEX 里可以同时存在0x08000000的 bootloader 和0x08080000的参数区中间的空洞不需要填充。这正是 HEX 适合多区固件的原因也是它转 BIN 时必须处理空洞的原因。2.3 转换方向决定了你要不要补 0xFF理解了两者模型转换的难点就清楚了HEX 转 BIN要把地址不连续的部分用填充字节补齐否则 BIN 里两个区会挨在一起烧进去地址全错。BIN 转 HEX要告诉工具这段 BIN 的起始地址工具才能生成正确的地址记录。合并HEX 合并可以直接按地址叠加BIN 合并必须先转成带地址的中间形态或者用工具指定每段的偏移。填充字节通常是0xFF因为 Flash 擦除后的状态就是全 1用0xFF填充不会破坏未写区域。这一点在后面的命令里会反复出现。3. 用 srec_cat 做转换与合并一条命令覆盖四种场景3.1 工具选型为什么优先 srec_cat能处理 BIN/HEX 的工具不少比如objcopy、hex2bin、各家 IDE 自带的小工具。但如果要同时做转换和合并srec_cat是最省事的它属于 SRecord 工具集跨平台命令行参数清晰支持 Intel HEX、Motorola S-record、BIN、甚至带地址的文本格式。常见做法是用它做固件打包流水线里的格式归一化。安装方式按平台来Linux 下一般包管理器直接装# Debian/Ubuntu 系 sudo apt-get install srecord # macOS brew install srecord # Windows 可从官网下载预编译包解压后把目录加入 PATH装完执行srec_cat --version能打印版本就说明可用。下面所有命令都基于这个工具。3.2 HEX 转 BIN指定输出格式和填充值最基础的转换# 把 input.hex 转成 output.bin # -o 指定输出文件-binary 声明输出为纯二进制 srec_cat input.hex -intel -o output.bin -binary逻辑说明input.hex -intel告诉工具输入是 Intel HEX 格式-o output.bin -binary指定输出为二进制。工具会自动扫描 HEX 里的地址范围从最低地址到最高地址输出中间不连续的部分默认用0x00填充。这里就是第一个坑默认填充是0x00不是0xFF。如果你的 Flash 擦除态是0xFF用0x00填充会在空洞区域写入 0烧录后可能影响未使用区域的读取。正确做法是显式指定填充值# -fill 0xFF 指定空洞填充字节 # 后面跟的是填充范围的起止地址通常覆盖整个地址空间 srec_cat input.hex -intel -fill 0xFF 0x00000000 0xFFFFFFFF -o output.bin -binary参数说明-fill 0xFF 0x00000000 0xFFFFFFFF表示在0x00000000到0xFFFFFFFF范围内凡是 HEX 没覆盖到的地址都填0xFF。实际使用时把范围收窄到你的 Flash 实际地址区间更稳妥避免生成超大文件。3.3 BIN 转 HEX必须显式给起始地址BIN 没有地址信息所以转换时必须告诉工具这段数据从哪开始# 把 input.bin 当作从 0x08000000 开始的数据转成 Intel HEX srec_cat input.bin -binary -offset 0x08000000 -o output.hex -intel逻辑说明input.bin -binary声明输入是纯二进制-offset 0x08000000是关键它把 BIN 的第 0 字节映射到地址0x08000000-o output.hex -intel输出 Intel HEX。参数说明-offset的值必须和你的链接脚本或烧录地址一致。如果 BIN 是从0x08004000开始的 app 区这里就要写0x08004000。写错了烧进去就是跑飞而且这种错误在 HEX 里看不出来只有烧录后才暴露。3.4 合并多段固件按地址叠加而不是首尾相接假设你有 bootloader 在0x08000000app 在0x08004000参数区在0x08080000想把它们合成一个 HEX# 三段 BIN 按各自地址合并成一个 HEX srec_cat \ boot.bin -binary -offset 0x08000000 \ app.bin -binary -offset 0x08004000 \ param.bin -binary -offset 0x08080000 \ -o merged.hex -intel逻辑说明srec_cat支持多个输入段每段用-offset指定自己的加载地址工具会按地址把它们放到同一个地址空间里重叠部分会报错空洞部分在输出 HEX 时不填充因为 HEX 允许地址不连续。参数说明如果两段地址有重叠srec_cat默认会报错并退出这是好事能防止你无意中覆盖数据。如果确实需要后一段覆盖前一段可以加-contradictory选项但一般不建议因为覆盖行为容易埋雷。如果输入本身就是 HEX合并更简单不需要-offset# 两个 HEX 直接按地址合并 srec_cat boot.hex -intel app.hex -intel -o merged.hex -intel3.5 合并后转 BIN注意空洞填充和文件体积合并成 HEX 后如果要转 BIN 给量产工具# 合并后转 BIN空洞填 0xFF srec_cat merged.hex -intel -fill 0xFF 0x08000000 0x080FFFFF -o merged.bin -binary这里要特别注意填充范围。如果范围写成0x00000000到0xFFFFFFFF生成的文件会大到无法处理。正确做法是填你的 Flash 实际区间比如0x08000000到0x080FFFFF这样文件大小就是 Flash 容量量产工具能正确识别。4. 避坑与排查转换合并里最容易翻车的五件事4.1 转出来的 BIN 比预期大很多现象一个几十 KB 的 HEX 转成 BIN 后变成几 MB。原因HEX 里存在高地址的零散记录比如配置字在0x1FFFF800srec_cat从最低地址到最高地址输出中间全部填充文件自然膨胀。解决用-fill限定填充范围或者先用-crop裁掉不需要的地址段# 只保留 0x08000000 到 0x0807FFFF 范围 srec_cat input.hex -intel -crop 0x08000000 0x0807FFFF -o output.bin -binary4.2 烧录后程序跑飞地址对不上现象转换后的文件烧进去MCU 不运行或 HardFault。原因BIN 转 HEX 时-offset写错或者 HEX 转 BIN 时没指定起始地址烧录工具按默认地址写入。解决核对链接脚本里的FLASH ORIGIN确保-offset和它一致。烧录前用srec_info查看 HEX 的地址范围# 查看 HEX 文件的地址分布 srec_info input.hex -intel输出会列出每段的起止地址对照链接脚本确认无误再烧。4.3 合并时提示地址重叠现象srec_cat报错contradictory或地址冲突。原因两段固件的地址范围有交集常见于 app 区大小算错或者 bootloader 预留空间不够。解决先用srec_info分别查看各段的地址范围确认没有交集。如果确实需要覆盖检查是不是链接脚本的区间划分有问题而不是急着加-contradictory掩盖。4.4 填充值用了 0x00 导致参数区异常现象合并后的固件烧录参数区读出来全是 0而不是默认值。原因HEX 转 BIN 时默认填充0x00把本该是0xFF的擦除态写成了 0。解决所有转 BIN 的命令都显式加-fill 0xFF并且填充范围覆盖整个 Flash 区间。这是血泪经验默认值坑过不少人。4.5 Windows 下路径和换行符问题现象在 Windows 命令行里执行srec_cat报找不到文件或者生成的 HEX 在某些工具里解析失败。原因路径里有空格没加引号或者输出 HEX 的换行符是\n而某些老工具只认\r\n。解决路径统一加引号如果遇到换行符问题可以在srec_cat输出后用一个简单脚本转换或者直接用支持\n的烧录工具。常见做法是在流水线里统一用 Linux 环境处理避免这类平台差异。5. 进阶技巧用脚本把转换合并串成可复现的流水线单次转换用命令行就够了但如果你经常要处理多区固件手动敲命令迟早会出错。我一般会写一个打包脚本把地址配置抽成变量转换和校验一步到位。下面是一个可复现的模板#!/bin/bash # firmware_pack.sh - 多区固件打包脚本 set -e # 任何一步失败就退出避免生成半成品 # 地址配置按实际链接脚本修改 BOOT_ADDR0x08000000 APP_ADDR0x08004000 PARAM_ADDR0x08080000 FLASH_START0x08000000 FLASH_END0x080FFFFF # 输入文件 BOOT_BINboot.bin APP_BINapp.bin PARAM_BINparam.bin # 第一步合并成 HEX按地址叠加 srec_cat \ $BOOT_BIN -binary -offset $BOOT_ADDR \ $APP_BIN -binary -offset $APP_ADDR \ $PARAM_BIN -binary -offset $PARAM_ADDR \ -o merged.hex -intel # 第二步转成量产用的 BIN空洞填 0xFF srec_cat merged.hex -intel \ -fill 0xFF $FLASH_START $FLASH_END \ -o merged.bin -binary # 第三步打印地址信息人工核对 echo merged.hex 地址分布 srec_info merged.hex -intel echo 输出文件 ls -lh merged.hex merged.bin逻辑说明脚本用set -e保证任何一步失败立即停止不会留下半成品。地址全部抽成变量放在开头换项目只改这几行。第三步用srec_info打印地址分布是最后一道人工核对确认每段落在预期地址再交付。参数说明FLASH_START和FLASH_END决定最终 BIN 的大小填成实际 Flash 容量即可。如果 Flash 是 512KBFLASH_END就是0x0807FFFF1MB 则是0x080FFFFF。这个值写错会导致 BIN 过大或截断。再补一个校验习惯转换完成后把生成的 BIN 再转回 HEX和原始 HEX 做地址范围对比。如果两者地址分布一致说明转换没有丢数据或错位。这个反向验证花不了几秒但能挡住大部分低级错误。从那以后我每次打包固件都强制走一遍合并 → 转 BIN → 反向转 HEX → 对比地址的流程再急也不跳过。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号