搜索
bottom↓
回复: 26

今天做了个BIN合并的工具,替代网上那个UBIN

[复制链接]

出0入89汤圆

发表于 2022-6-5 17:48:41 | 显示全部楼层 |阅读模式
不是重复造轮子,只因原有的轮子不好用,不合我用。
改进的内容:
增加了工程项目保存,不用每次都把那些bin文件一个一个重新添加。那么修改编辑就简单方便了。还可以另存为其他的工程文件。
写这个软件目的用于多个 bin文件烧写到flash中,在单片机调用时根据偏移值大大小去读取。
绿色软件,免费软件,就一个文件。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出5入0汤圆

发表于 2022-6-5 18:27:01 来自手机 | 显示全部楼层
厉害老哥。     

出16170入6148汤圆

发表于 2022-6-5 18:31:55 来自手机 | 显示全部楼层
点赞!

出10入29汤圆

发表于 2022-6-5 18:36:07 | 显示全部楼层
windows defender 报毒了

出590入992汤圆

发表于 2022-6-5 21:06:39 | 显示全部楼层
不错!!顶一个!

出105入79汤圆

发表于 2022-6-5 23:06:29 | 显示全部楼层
可以单独设置 bin2 的偏移地址就好了, 比如bin1 是0x8000000开始,文件长度 0x3000, 但是bin2要从0x8004000 开始,这样bin1末尾要填充0x1000长度的0xFF,然后开始bin2.

出0入89汤圆

 楼主| 发表于 2022-6-6 09:55:22 | 显示全部楼层
LM5017 发表于 2022-6-5 18:36
windows defender 报毒了
(引用自4楼)

报什么毒?有截屏吗?  一共几百行代码,没有任何涉及权限的请求,怎么会报毒。?

出0入89汤圆

 楼主| 发表于 2022-6-6 09:58:55 | 显示全部楼层
qwe2231695 发表于 2022-6-5 23:06
可以单独设置 bin2 的偏移地址就好了, 比如bin1 是0x8000000开始,文件长度 0x3000, 但是bin2要从0x80040 ...
(引用自6楼)

这个要求合理。我会后面有空加上。因为我做文件时把长度已经补充完了,所以不存在你提出的这个问题。但很多人难免会需要指定偏移点。

出10入29汤圆

发表于 2022-6-6 11:51:45 | 显示全部楼层
szjqt 发表于 2022-6-6 09:55
报什么毒?有截屏吗?  一共几百行代码,没有任何涉及权限的请求,怎么会报毒。? ...
(引用自7楼)

文件自动被删除

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入89汤圆

 楼主| 发表于 2022-6-6 12:30:36 | 显示全部楼层
LM5017 发表于 2022-6-6 11:51
文件自动被删除
(引用自9楼)

那么微软的这个就不可信了。我这里没有任何恶意代码。我用的win10 ,未见提示。 使用32位的delphi2005开发。 没有使用64位。估计只要没有证书的都被视为威胁吧。检查自己的电脑是不是设置什么了。

出15入178汤圆

发表于 2022-6-7 12:54:22 | 显示全部楼层
我用这个,命令行调用,省事:

• -merge<FILENAME>
• -merge<FILENAME>.bin,<ADDR>

Merges a given data file with the one currently opened in J-Flash.

出0入42汤圆

发表于 2022-6-7 13:07:48 | 显示全部楼层
能否支持批量文件添加?也就是添加文件的时候可以框选多个文件。导出的时候能否支持导出地址和大小数据到CSV,或者在表格里允许直接框选需要的数据,并允许复制也行。
这样除了用来合并烧写的bin文件,用来合并GUI中使用到的图片,以便烧录到Flash里,也会是一个非常方便的工具,程序里也可以直接调用图片的起始地址和图片大小数据。

出615入1076汤圆

发表于 2022-6-7 13:34:28 来自手机 | 显示全部楼层
直接用 cat 或者 dd 命令就好了,還可以指定偏移,以及批量和自動化操作

出0入89汤圆

 楼主| 发表于 2022-6-7 13:46:43 | 显示全部楼层
2nd 发表于 2022-6-7 12:54
我用这个,命令行调用,省事:

• -merge
(引用自11楼)

是的。我有个同事也是喜欢用命令行,以前没有工具又不值得去开发一个工具时我们也用命令行,后来有工具了,问他怎么不用工具,他说这样看起来酷一些嘛。

出0入89汤圆

 楼主| 发表于 2022-6-7 13:49:31 | 显示全部楼层
shandian007 发表于 2022-6-7 13:07
能否支持批量文件添加?也就是添加文件的时候可以框选多个文件。导出的时候能否支持导出地址和大小数据到CS ...
(引用自12楼)

批量添加会加上。 起始地址和长度已经已C语音数组的形式显示在右侧的编辑框里了,你可以试试看。
关于直接打开图片文件的问题。由于图片文件格式不一,转换需求的格式也不一,目前有很多图片转bin的工具了比如Img2Lcd.exe,我就不重复造轮子了。

出0入42汤圆

发表于 2022-6-7 14:36:29 | 显示全部楼层
szjqt 发表于 2022-6-7 13:49
批量添加会加上。 起始地址和长度已经已C语音数组的形式显示在右侧的编辑框里了,你可以试试看。
关于直 ...
(引用自15楼)

嗯,图片格式转换功能不需要的,我一般都是用PIC2RAW软件来转为BIN格式。捆绑工具只需实现bin文件的合并,以及输出起始地址和大小就行了。
我看看右侧编辑框。

出10入0汤圆

发表于 2022-6-7 19:18:30 | 显示全部楼层
不错,支持一下!

出0入0汤圆

发表于 2022-6-9 15:03:17 | 显示全部楼层
老哥 有源码吗?

出0入89汤圆

 楼主| 发表于 2022-6-9 19:02:02 | 显示全部楼层
kkklk123 发表于 2022-6-9 15:03
老哥 有源码吗?
(引用自18楼)
  1. unit main;

  2. interface

  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, ImgList, RzButton, StdCtrls, RzLabel, Mask, RzEdit, RzBtnEdt,
  6.   ExtCtrls, RzPanel, ComCtrls, RzListVw, Menus;


  7. //用于通用控件的Object属性定义
  8. type TListObj=record
  9.   row:integer;
  10.   name:string;
  11.   position:integer;
  12.   size:integer;
  13. end;
  14. type PListObj= ^TListObj;

  15. type
  16.   TFormMain = class(TForm)
  17.     Panel2: TPanel;
  18.     ImageList1: TImageList;
  19.     RzToolbar1: TRzToolbar;
  20.     RzToolButton1: TRzToolButton;
  21.     BtnSaveAll: TRzToolButton;
  22.     BtnSave: TRzToolButton;
  23.     BtnClose: TRzToolButton;
  24.     RzListView1: TRzListView;
  25.     PopupMenu1: TPopupMenu;
  26.     N1: TMenuItem;
  27.     N2: TMenuItem;
  28.     N3: TMenuItem;
  29.     N4: TMenuItem;
  30.     Panel1: TPanel;
  31.     Memo1: TMemo;
  32.     RzToolButton2: TRzToolButton;
  33.     RzToolButton3: TRzToolButton;
  34.     procedure N1Click(Sender: TObject);
  35.     procedure N2Click(Sender: TObject);
  36.     procedure BtnSaveClick(Sender: TObject);
  37.     procedure RzToolButton1Click(Sender: TObject);
  38.     procedure BtnCloseClick(Sender: TObject);
  39.     procedure BtnSaveAllClick(Sender: TObject);

  40.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  41.     procedure N3Click(Sender: TObject);
  42.     procedure N4Click(Sender: TObject);
  43.     procedure RzToolButton2Click(Sender: TObject);
  44.     procedure RzToolButton3Click(Sender: TObject);
  45.   private
  46.     { Private declarations }
  47.     //rownum:Integer;
  48.     savefilename:string;
  49.     dirty:Boolean;
  50.     function OpenDialog(ft,ext:string ;var fn:string):Boolean;
  51.     function SaveDialog(ft,ext:string ;var fn:string):Boolean;
  52.     function GetFileSize(fn:string):Integer;
  53.     function GetPosition(idx:Integer):Integer;
  54.     procedure RefreshList;
  55.     procedure AddFileItem(filename:string);
  56.     procedure SaveAsFile;
  57.   public
  58.     { Public declarations }
  59.   end;

  60. var
  61.   FormMain: TFormMain;

  62. implementation
  63. uses inifiles,Help;

  64. {$R *.dfm}

  65. //公共打开文件对话框
  66. function TFormMain.OpenDialog(ft,ext:string ;var fn:string):Boolean;
  67. begin
  68.     with TOpenDialog.Create(Self) do try
  69.     Filter :=Format('%s(*.%s)|*.%s',[ft,ext,ext]);
  70.     if Execute then begin
  71.        fn:=(FileName);
  72.        Result:=true;
  73.     end;
  74.   finally
  75.     Free;
  76.   end;
  77. end;
  78. //公共保存文件对话框
  79. function TFormMain.SaveDialog(ft,ext:string ;var fn:string):Boolean;
  80. begin
  81.     with TSaveDialog.Create(Self) do try
  82.     Filter :=Format('%s(*.%s)|*.%s',[ft,ext,ext]);
  83.     if Execute then begin
  84.        fn:=(FileName);
  85.        Result:=true;
  86.     end;
  87.   finally
  88.     Free;
  89.   end;
  90. end;

  91. procedure TFormMain.BtnCloseClick(Sender: TObject);
  92. var
  93. i:Integer;
  94. listItem:TListItem;
  95. begin
  96. if dirty and (Dialogs.MessageDlg('项目未保存,是否现在保存?',
  97.     mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes) then
  98. BtnSaveClick(nil);
  99. //清界面
  100. for i:=0 to  RzListView1.Items.Count-1 do begin
  101.     RzListView1.Items.Item[i].Data:=nil;
  102. end;
  103. RzListView1.Clear;

  104. end;

  105. //保存为工程文件
  106. procedure TFormMain.SaveAsFile;
  107. var
  108. i:Integer;
  109. listItem:TListItem;
  110. begin
  111. if (savefilename='') or (RzListView1.Items.Count=0) then  exit;

  112.    with TIniFile.Create(savefilename) do try
  113.     EraseSection('filelist');
  114.       for i := 0 to RzListView1.Items.Count - 1 do begin
  115.         listItem:=RzListView1.Items.Item[i];
  116.         WriteString('filelist',IntToStr(i),PListObj(listItem.Data)^.name);
  117.       end;
  118.       dirty:=false;
  119.     finally
  120.      Free;
  121.     end;
  122. end;

  123. procedure TFormMain.BtnSaveAllClick(Sender: TObject);
  124. var fn:string;
  125. begin
  126. if SaveDialog('项目文件','ini',fn) then begin
  127.   savefilename:=fn;
  128.   SaveAsFile ;
  129. end;
  130. end;

  131. procedure TFormMain.BtnSaveClick(Sender: TObject);
  132. var fn:string;

  133. begin
  134. if (savefilename='') and (SaveDialog('项目文件','ini',fn)) then
  135.   savefilename:=fn;
  136.   if (savefilename<>'') and (RzListView1.Items.Count>0) then begin
  137.      SaveAsFile;
  138.   end;

  139. end;

  140. procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
  141. begin
  142.   BtnCloseClick(nil);
  143. end;



  144. //得到指定文件的大小
  145. function TFormMain.GetFileSize(fn:string):Integer;
  146. var myfile:TFileStream;
  147. begin
  148. Result:=0;
  149.   myfile:=TFileStream.Create(fn,fmOpenRead);
  150.   try
  151.     Result:=myfile.Size;
  152.   finally
  153.     myfile.Free;
  154.   end;
  155. end;
  156. //得到起始地址 把这之前的所有size相加
  157. function TFormMain.GetPosition(idx:Integer):Integer;
  158. var i,j:Integer;
  159. begin
  160. j:=0;
  161.   for i:=0 to  RzListView1.Items.Count-1 do begin
  162.    if idx>i then
  163.      inc(j, PListObj(RzListView1.Items.Item[i].Data)^.size)
  164.      else break;
  165.   end;
  166.   Result:=j;
  167. end;
  168. //刷新列表
  169. procedure TFormMain.RefreshList;
  170. var i,pos:Integer;
  171. listItem:TListItem;
  172. str:string;
  173. begin
  174. Memo1.Clear;
  175. Memo1.Lines.Add('{')  ;
  176.   for i:=0 to  RzListView1.Items.Count-1 do begin
  177.      listItem:= RzListView1.Items.Item[i];
  178.      PListObj(listItem.Data)^.row:=i;
  179.      pos:=GetPosition(i);
  180.      PListObj(listItem.Data)^.position:= pos;
  181.      listItem.SubItems.Strings[1]:= Format('%x',[pos]);
  182.      listItem.Caption:=IntToStr(i+1);
  183.      str:=Format('{0x%x,0x%x},',[
  184.      PListObj(listItem.Data)^.position,
  185.      PListObj(listItem.Data)^.size]);
  186.      Memo1.Lines.Add(str);
  187.   end;
  188. Memo1.Lines.Add('}');
  189. end;
  190. //添加新的文件行
  191. procedure TFormMain.AddFileItem(filename:string);
  192. var
  193. rowObj:PListObj;
  194. listItem:TListItem;
  195. begin   
  196. if filename='' then exit;

  197.       new(rowObj);
  198.       rowObj^.row:=RzListView1.Items.Count;
  199.       rowObj^.name:=filename;
  200.       rowObj^.position:=GetPosition(rowObj^.row);
  201.       rowObj^.size:=GetFileSize(filename);
  202.       listItem:=RzListView1.Items.Add;
  203.       listItem.Caption:=IntToStr(rowObj^.row+1);
  204.       listItem.Data:=rowObj;
  205.       listItem.SubItems.Add(ExtractFileName(filename)) ;
  206.       listItem.SubItems.Add(Format('%x',[rowObj^.position]));
  207.       listItem.SubItems.Add(Format('%x',[rowObj^.size]));

  208. end;
  209. procedure TFormMain.RzToolButton1Click(Sender: TObject);
  210. var fn,str:string;
  211. fl,vl:TStringList;
  212. i:Integer;
  213. begin
  214. BtnCloseClick(nil);
  215.   if OpenDialog('项目文件','ini',fn) then  begin
  216.   savefilename:=fn;
  217.     fl:=TStringList.Create;
  218.     vl:=TStringList.Create;
  219.      vl.Delimiter:='=';
  220.     with  TIniFile.Create(savefilename) do try
  221.       ReadSection( 'filelist',fl);
  222.        for i:=0 to fl.Count-1 do begin
  223.         str:=ReadString('filelist',fl.Strings[i],'');
  224.         AddFileItem(str);
  225.        end;

  226.     finally
  227.       Free;
  228.     end;
  229.     vl.Free;
  230.     fl.Free;
  231.     RefreshList;
  232.   end;
  233. end;

  234. //导出连接文件
  235. procedure TFormMain.RzToolButton2Click(Sender: TObject);
  236. var fn,filename:string;
  237. listItem:TListItem;
  238. i:integer;
  239. f1,f2:TFileStream;
  240. begin
  241.   if SaveDialog('合并bin文件','bin',fn) then begin
  242.   f2:=TFileStream.Create(fn,fmCreate);
  243.    for i:=0 to RzListView1.Items.Count-1 do begin
  244.     listItem:= RzListView1.Items.Item[i];
  245.     filename:=PListObj(listItem.Data)^.name;
  246.     f1:=TFileStream.Create(filename,fmOpenRead);
  247.     f2.Position:= PListObj(listItem.Data)^.position;
  248.     f2.CopyFrom(f1,f1.Size);

  249.    end;
  250.    f2.Free;
  251.   end;
  252. end;


  253. procedure TFormMain.RzToolButton3Click(Sender: TObject);
  254. begin
  255. FormHelp.ShowModal;
  256. end;

  257. procedure TFormMain.N1Click(Sender: TObject);
  258. var fn:string;

  259. begin
  260.     if OpenDialog('二进制文件','bin',fn) then begin
  261.       AddFileItem(fn);
  262.       dirty:=true;
  263.     end;
  264. end;


  265. procedure TFormMain.N2Click(Sender: TObject);
  266. var listItem:TListItem;
  267. begin
  268. listItem:=RzListView1.Selected;
  269. if listItem=nil then exit;

  270. listItem.Data:=nil;
  271. listItem.Delete;
  272. RefreshList;
  273. dirty:=true;
  274. end;

  275. procedure TFormMain.N3Click(Sender: TObject);
  276. var listItem,itemtmp:TListItem;
  277. pos:integer;
  278. begin
  279. listItem:=RzListView1.Selected;
  280. pos:=listItem.index;

  281. if pos>0 then begin
  282.   itemtmp:=RzListView1.Items.Insert(pos-1);
  283.   itemtmp.Assign(listItem);
  284.   listItem.Data:=nil;
  285.   listItem.Delete;
  286.   dirty:=true;
  287.   RefreshList;
  288. end;
  289. end;

  290. procedure TFormMain.N4Click(Sender: TObject);
  291. var listItem,itemtmp:TListItem;
  292. pos:integer;
  293. begin
  294. listItem:=RzListView1.Selected;
  295. pos:=listItem.index;

  296. if pos<RzListView1.Items.Count-1 then begin
  297.   itemtmp:=RzListView1.Items.Insert(pos+2);
  298.   itemtmp.Assign(listItem);
  299.   listItem.Data:=nil;
  300.   listItem.Delete;
  301.   dirty:=true;
  302.   RefreshList;
  303. end;

  304. end;

  305. end.
复制代码

出0入89汤圆

 楼主| 发表于 2022-6-9 19:03:18 | 显示全部楼层
虽然不复杂但我也没打算开源,没什么太大的开源价值。既然你开口要源码了,那就给你吧。  会用delphi的一看就知道怎么恢复工程了。

出0入0汤圆

发表于 2022-6-9 19:57:48 来自手机 | 显示全部楼层
szjqt 发表于 2022-6-9 19:03
虽然不复杂但我也没打算开源,没什么太大的开源价值。既然你开口要源码了,那就给你吧。  会用delphi的一看 ...
(引用自20楼)

感谢老哥分享

出0入0汤圆

发表于 2022-12-13 09:26:38 | 显示全部楼层
shandian007 发表于 2022-6-7 14:36
嗯,图片格式转换功能不需要的,我一般都是用PIC2RAW软件来转为BIN格式。捆绑工具只需实现bin文件的合并 ...
(引用自16楼)

方便发一个 软件包吗? 感谢!

出0入31汤圆

发表于 2022-12-13 09:31:35 | 显示全部楼层
是不是有个软件SRecord,处理bin,hex之类的功能比较强。

出0入4汤圆

发表于 2023-2-22 11:18:46 | 显示全部楼层
bin文件不能指定起始地址。这个问题比较严重呀。实用性大打折扣

出5入0汤圆

发表于 2023-2-23 09:28:05 | 显示全部楼层
单个项目重复导出2次会报错

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出50入58汤圆

发表于 2023-2-23 09:55:37 | 显示全部楼层
fbwcpu 发表于 2023-2-22 11:18
bin文件不能指定起始地址。这个问题比较严重呀。实用性大打折扣
(引用自24楼)

是的,如果仅合并我都是用win自带的copy命令搞定

出5入0汤圆

发表于 2023-3-13 11:54:35 | 显示全部楼层
本帖最后由 selme 于 2023-3-13 13:40 编辑

感觉挺有意思,也上传一个工具,抛抛砖

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 15:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表