今天做了个BIN合并的工具,替代网上那个UBIN
不是重复造轮子,只因原有的轮子不好用,不合我用。改进的内容:
增加了工程项目保存,不用每次都把那些bin文件一个一个重新添加。那么修改编辑就简单方便了。还可以另存为其他的工程文件。
写这个软件目的用于多个 bin文件烧写到flash中,在单片机调用时根据偏移值大大小去读取。
绿色软件,免费软件,就一个文件。
厉害老哥。 点赞! windows defender 报毒了 不错!!顶一个! 可以单独设置 bin2 的偏移地址就好了, 比如bin1 是0x8000000开始,文件长度 0x3000, 但是bin2要从0x8004000 开始,这样bin1末尾要填充0x1000长度的0xFF,然后开始bin2. LM5017 发表于 2022-6-5 18:36
windows defender 报毒了
(引用自4楼)
报什么毒?有截屏吗?一共几百行代码,没有任何涉及权限的请求,怎么会报毒。? qwe2231695 发表于 2022-6-5 23:06
可以单独设置 bin2 的偏移地址就好了, 比如bin1 是0x8000000开始,文件长度 0x3000, 但是bin2要从0x80040 ...
(引用自6楼)
这个要求合理。我会后面有空加上。因为我做文件时把长度已经补充完了,所以不存在你提出的这个问题。但很多人难免会需要指定偏移点。 szjqt 发表于 2022-6-6 09:55
报什么毒?有截屏吗?一共几百行代码,没有任何涉及权限的请求,怎么会报毒。? ...
(引用自7楼)
文件自动被删除
LM5017 发表于 2022-6-6 11:51
文件自动被删除
(引用自9楼)
那么微软的这个就不可信了。我这里没有任何恶意代码。我用的win10 ,未见提示。 使用32位的delphi2005开发。 没有使用64位。估计只要没有证书的都被视为威胁吧。检查自己的电脑是不是设置什么了。 我用这个,命令行调用,省事:
• -merge<FILENAME>
• -merge<FILENAME>.bin,<ADDR>
Merges a given data file with the one currently opened in J-Flash. 能否支持批量文件添加?也就是添加文件的时候可以框选多个文件。导出的时候能否支持导出地址和大小数据到CSV,或者在表格里允许直接框选需要的数据,并允许复制也行。
这样除了用来合并烧写的bin文件,用来合并GUI中使用到的图片,以便烧录到Flash里,也会是一个非常方便的工具,程序里也可以直接调用图片的起始地址和图片大小数据。 直接用 cat 或者 dd 命令就好了,還可以指定偏移,以及批量和自動化操作 2nd 发表于 2022-6-7 12:54
我用这个,命令行调用,省事:
• -merge
(引用自11楼)
是的。我有个同事也是喜欢用命令行,以前没有工具又不值得去开发一个工具时我们也用命令行,后来有工具了,问他怎么不用工具,他说这样看起来酷一些嘛。 shandian007 发表于 2022-6-7 13:07
能否支持批量文件添加?也就是添加文件的时候可以框选多个文件。导出的时候能否支持导出地址和大小数据到CS ...
(引用自12楼)
批量添加会加上。 起始地址和长度已经已C语音数组的形式显示在右侧的编辑框里了,你可以试试看。
关于直接打开图片文件的问题。由于图片文件格式不一,转换需求的格式也不一,目前有很多图片转bin的工具了比如Img2Lcd.exe,我就不重复造轮子了。
szjqt 发表于 2022-6-7 13:49
批量添加会加上。 起始地址和长度已经已C语音数组的形式显示在右侧的编辑框里了,你可以试试看。
关于直 ...
(引用自15楼)
嗯,图片格式转换功能不需要的,我一般都是用PIC2RAW软件来转为BIN格式。捆绑工具只需实现bin文件的合并,以及输出起始地址和大小就行了。
我看看右侧编辑框。 不错,支持一下! 老哥 有源码吗? 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.
虽然不复杂但我也没打算开源,没什么太大的开源价值。既然你开口要源码了,那就给你吧。会用delphi的一看就知道怎么恢复工程了。 szjqt 发表于 2022-6-9 19:03
虽然不复杂但我也没打算开源,没什么太大的开源价值。既然你开口要源码了,那就给你吧。会用delphi的一看 ...
(引用自20楼)
感谢老哥分享 shandian007 发表于 2022-6-7 14:36
嗯,图片格式转换功能不需要的,我一般都是用PIC2RAW软件来转为BIN格式。捆绑工具只需实现bin文件的合并 ...
(引用自16楼)
方便发一个 软件包吗? 感谢! 是不是有个软件SRecord,处理bin,hex之类的功能比较强。 bin文件不能指定起始地址。这个问题比较严重呀。实用性大打折扣 单个项目重复导出2次会报错 fbwcpu 发表于 2023-2-22 11:18
bin文件不能指定起始地址。这个问题比较严重呀。实用性大打折扣
(引用自24楼)
是的,如果仅合并我都是用win自带的copy命令搞定 本帖最后由 selme 于 2023-3-13 13:40 编辑
感觉挺有意思,也上传一个工具,抛抛砖
页:
[1]