szjqt 发表于 2022-6-5 17:48:41

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

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




NM2012 发表于 2022-6-5 18:27:01

厉害老哥。   

armok. 发表于 2022-6-5 18:31:55

点赞!

LM5017 发表于 2022-6-5 18:36:07

windows defender 报毒了

SUPER_CRJ 发表于 2022-6-5 21:06:39

不错!!顶一个!

qwe2231695 发表于 2022-6-5 23:06:29

可以单独设置 bin2 的偏移地址就好了, 比如bin1 是0x8000000开始,文件长度 0x3000, 但是bin2要从0x8004000 开始,这样bin1末尾要填充0x1000长度的0xFF,然后开始bin2.

szjqt 发表于 2022-6-6 09:55:22

LM5017 发表于 2022-6-5 18:36
windows defender 报毒了
(引用自4楼)

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

szjqt 发表于 2022-6-6 09:58:55

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

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

LM5017 发表于 2022-6-6 11:51:45

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

文件自动被删除

szjqt 发表于 2022-6-6 12:30:36

LM5017 发表于 2022-6-6 11:51
文件自动被删除
(引用自9楼)

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

2nd 发表于 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.

shandian007 发表于 2022-6-7 13:07:48

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

dukelec 发表于 2022-6-7 13:34:28

直接用 cat 或者 dd 命令就好了,還可以指定偏移,以及批量和自動化操作

szjqt 发表于 2022-6-7 13:46:43

2nd 发表于 2022-6-7 12:54
我用这个,命令行调用,省事:

• -merge
(引用自11楼)

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

szjqt 发表于 2022-6-7 13:49:31

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

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

shandian007 发表于 2022-6-7 14:36:29

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

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

dgtg 发表于 2022-6-7 19:18:30

不错,支持一下!

kkklk123 发表于 2022-6-9 15:03:17

老哥 有源码吗?

szjqt 发表于 2022-6-9 19:02:02

kkklk123 发表于 2022-6-9 15:03
老哥 有源码吗?
(引用自18楼)

unit main;

interface

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


//用于通用控件的Object属性定义
type TListObj=record
row:integer;
name:string;
position:integer;
size:integer;
end;
type PListObj= ^TListObj;

type
TFormMain = class(TForm)
    Panel2: TPanel;
    ImageList1: TImageList;
    RzToolbar1: TRzToolbar;
    RzToolButton1: TRzToolButton;
    BtnSaveAll: TRzToolButton;
    BtnSave: TRzToolButton;
    BtnClose: TRzToolButton;
    RzListView1: TRzListView;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    Panel1: TPanel;
    Memo1: TMemo;
    RzToolButton2: TRzToolButton;
    RzToolButton3: TRzToolButton;
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure BtnSaveClick(Sender: TObject);
    procedure RzToolButton1Click(Sender: TObject);
    procedure BtnCloseClick(Sender: TObject);
    procedure BtnSaveAllClick(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure RzToolButton2Click(Sender: TObject);
    procedure RzToolButton3Click(Sender: TObject);
private
    { Private declarations }
    //rownum:Integer;
    savefilename:string;
    dirty:Boolean;
    function OpenDialog(ft,ext:string ;var fn:string):Boolean;
    function SaveDialog(ft,ext:string ;var fn:string):Boolean;
    function GetFileSize(fn:string):Integer;
    function GetPosition(idx:Integer):Integer;
    procedure RefreshList;
    procedure AddFileItem(filename:string);
    procedure SaveAsFile;
public
    { Public declarations }
end;

var
FormMain: TFormMain;

implementation
uses inifiles,Help;

{$R *.dfm}

//公共打开文件对话框
function TFormMain.OpenDialog(ft,ext:string ;var fn:string):Boolean;
begin
    with TOpenDialog.Create(Self) do try
    Filter :=Format('%s(*.%s)|*.%s',);
    if Execute then begin
       fn:=(FileName);
       Result:=true;
    end;
finally
    Free;
end;
end;
//公共保存文件对话框
function TFormMain.SaveDialog(ft,ext:string ;var fn:string):Boolean;
begin
    with TSaveDialog.Create(Self) do try
    Filter :=Format('%s(*.%s)|*.%s',);
    if Execute then begin
       fn:=(FileName);
       Result:=true;
    end;
finally
    Free;
end;
end;

procedure TFormMain.BtnCloseClick(Sender: TObject);
var
i:Integer;
listItem:TListItem;
begin
if dirty and (Dialogs.MessageDlg('项目未保存,是否现在保存?',
    mtConfirmation, , 0, mbYes) = mrYes) then
BtnSaveClick(nil);
//清界面
for i:=0 toRzListView1.Items.Count-1 do begin
    RzListView1.Items.Item.Data:=nil;
end;
RzListView1.Clear;

end;

//保存为工程文件
procedure TFormMain.SaveAsFile;
var
i:Integer;
listItem:TListItem;
begin
if (savefilename='') or (RzListView1.Items.Count=0) thenexit;

   with TIniFile.Create(savefilename) do try
    EraseSection('filelist');
      for i := 0 to RzListView1.Items.Count - 1 do begin
      listItem:=RzListView1.Items.Item;
      WriteString('filelist',IntToStr(i),PListObj(listItem.Data)^.name);
      end;
      dirty:=false;
    finally
   Free;
    end;
end;

procedure TFormMain.BtnSaveAllClick(Sender: TObject);
var fn:string;
begin
if SaveDialog('项目文件','ini',fn) then begin
savefilename:=fn;
SaveAsFile ;
end;
end;

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

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

end;

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



//得到指定文件的大小
function TFormMain.GetFileSize(fn:string):Integer;
var myfile:TFileStream;
begin
Result:=0;
myfile:=TFileStream.Create(fn,fmOpenRead);
try
    Result:=myfile.Size;
finally
    myfile.Free;
end;
end;
//得到起始地址 把这之前的所有size相加
function TFormMain.GetPosition(idx:Integer):Integer;
var i,j:Integer;
begin
j:=0;
for i:=0 toRzListView1.Items.Count-1 do begin
   if idx>i then
   inc(j, PListObj(RzListView1.Items.Item.Data)^.size)
   else break;
end;
Result:=j;
end;
//刷新列表
procedure TFormMain.RefreshList;
var i,pos:Integer;
listItem:TListItem;
str:string;
begin
Memo1.Clear;
Memo1.Lines.Add('{');
for i:=0 toRzListView1.Items.Count-1 do begin
   listItem:= RzListView1.Items.Item;
   PListObj(listItem.Data)^.row:=i;
   pos:=GetPosition(i);
   PListObj(listItem.Data)^.position:= pos;
   listItem.SubItems.Strings:= Format('%x',);
   listItem.Caption:=IntToStr(i+1);
   str:=Format('{0x%x,0x%x},',[
   PListObj(listItem.Data)^.position,
   PListObj(listItem.Data)^.size]);
   Memo1.Lines.Add(str);
end;
Memo1.Lines.Add('}');
end;
//添加新的文件行
procedure TFormMain.AddFileItem(filename:string);
var
rowObj:PListObj;
listItem:TListItem;
begin   
if filename='' then exit;

      new(rowObj);
      rowObj^.row:=RzListView1.Items.Count;
      rowObj^.name:=filename;
      rowObj^.position:=GetPosition(rowObj^.row);
      rowObj^.size:=GetFileSize(filename);
      listItem:=RzListView1.Items.Add;
      listItem.Caption:=IntToStr(rowObj^.row+1);
      listItem.Data:=rowObj;
      listItem.SubItems.Add(ExtractFileName(filename)) ;
      listItem.SubItems.Add(Format('%x',));
      listItem.SubItems.Add(Format('%x',));

end;
procedure TFormMain.RzToolButton1Click(Sender: TObject);
var fn,str:string;
fl,vl:TStringList;
i:Integer;
begin
BtnCloseClick(nil);
if OpenDialog('项目文件','ini',fn) thenbegin
savefilename:=fn;
    fl:=TStringList.Create;
    vl:=TStringList.Create;
   vl.Delimiter:='=';
    withTIniFile.Create(savefilename) do try
      ReadSection( 'filelist',fl);
       for i:=0 to fl.Count-1 do begin
      str:=ReadString('filelist',fl.Strings,'');
      AddFileItem(str);
       end;

    finally
      Free;
    end;
    vl.Free;
    fl.Free;
    RefreshList;
end;
end;

//导出连接文件
procedure TFormMain.RzToolButton2Click(Sender: TObject);
var fn,filename:string;
listItem:TListItem;
i:integer;
f1,f2:TFileStream;
begin
if SaveDialog('合并bin文件','bin',fn) then begin
f2:=TFileStream.Create(fn,fmCreate);
   for i:=0 to RzListView1.Items.Count-1 do begin
    listItem:= RzListView1.Items.Item;
    filename:=PListObj(listItem.Data)^.name;
    f1:=TFileStream.Create(filename,fmOpenRead);
    f2.Position:= PListObj(listItem.Data)^.position;
    f2.CopyFrom(f1,f1.Size);

   end;
   f2.Free;
end;
end;


procedure TFormMain.RzToolButton3Click(Sender: TObject);
begin
FormHelp.ShowModal;
end;

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

begin
    if OpenDialog('二进制文件','bin',fn) then begin
      AddFileItem(fn);
      dirty:=true;
    end;
end;


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

listItem.Data:=nil;
listItem.Delete;
RefreshList;
dirty:=true;
end;

procedure TFormMain.N3Click(Sender: TObject);
var listItem,itemtmp:TListItem;
pos:integer;
begin
listItem:=RzListView1.Selected;
pos:=listItem.index;

if pos>0 then begin
itemtmp:=RzListView1.Items.Insert(pos-1);
itemtmp.Assign(listItem);
listItem.Data:=nil;
listItem.Delete;
dirty:=true;
RefreshList;
end;
end;

procedure TFormMain.N4Click(Sender: TObject);
var listItem,itemtmp:TListItem;
pos:integer;
begin
listItem:=RzListView1.Selected;
pos:=listItem.index;

if pos<RzListView1.Items.Count-1 then begin
itemtmp:=RzListView1.Items.Insert(pos+2);
itemtmp.Assign(listItem);
listItem.Data:=nil;
listItem.Delete;
dirty:=true;
RefreshList;
end;

end;

end.

szjqt 发表于 2022-6-9 19:03:18

虽然不复杂但我也没打算开源,没什么太大的开源价值。既然你开口要源码了,那就给你吧。会用delphi的一看就知道怎么恢复工程了。

kkklk123 发表于 2022-6-9 19:57:48

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

感谢老哥分享

LaserSong 发表于 2022-12-13 09:26:38

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

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

zchong 发表于 2022-12-13 09:31:35

是不是有个软件SRecord,处理bin,hex之类的功能比较强。

fbwcpu 发表于 2023-2-22 11:18:46

bin文件不能指定起始地址。这个问题比较严重呀。实用性大打折扣

selme 发表于 2023-2-23 09:28:05

单个项目重复导出2次会报错

鲜衣怒马 发表于 2023-2-23 09:55:37

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

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

selme 发表于 2023-3-13 11:54:35

本帖最后由 selme 于 2023-3-13 13:40 编辑

感觉挺有意思,也上传一个工具,抛抛砖
页: [1]
查看完整版本: 今天做了个BIN合并的工具,替代网上那个UBIN