HEX文件格式+delphi源码

合集下载

Delphi字符串转化

Delphi字符串转化
begin
//if HexToken>#97 then HexToken:=Chr(Ord(HexToken)-32);
{ 将小写字母转换成大写 }
Result:=0;
if (HexToken>#47) and (HexToken<#58) then { chars 0....9 }
Result:=Ord(HexToken)-48
{ 函数 : RESULTINTEGER = Pow(BASE,POWER)
{ 目的 : 指数函数
{===============================================================}
{ 函数 : RESULTINTEGER = BinStrToInt(BINSTRING)
var counter : integer;
begin
Result:=1;
for counter:=1 to power do
Result:=Result*base;
end;
function BinStrToInt(BinStr : string) : integer;
var counter : integer;
Delphi的unicode与GB2312转转换,汉字unicode转GB2312
{===============================================================}
{ 函数 : RESULTSTRING = HexToBin(HEXSTRING)
for Counter2:=1 to 7-length(PrevOctet) do

基础知识hex文件格式详解

基础知识hex文件格式详解

基础知识hex文件格式详解hex文件格式总结•什么是hex文件?•文件格式•指令类型(Record type)•校验和o:04 02B0 00 92020008 AEo:04 0000 05 08000135 B9o:00 0000 01 FF•hex转bin文件什么是hex文件?hex是用于文件格式是intel规定的标准,总体来说,hex是文本文件,经常在微控制器的固件开发中看到hex的身影,例如基于STM32F103硬件,使用MDK开发的话,该软件就可以生成hex文件;如下图所示;这是一个简单的STM32标准外设库工程,代码里什么都没做,具体如下;#include 'stm32f10x.h'#include <stdio.h>/*** @brief Main program.* @param None* @retval None*/int main(void){/* Add your application code here*//* Infinite loop */while (1){}}最终,我们打开生成的hex文件,可以看到,这的确是一个文本文件,所以,直接将hex文件烧入MCU的Flash还是不行的,除非烧录软件可以把hex文件转成bin文件,然后再进行烧录;:020*********F2:10000000000400204901000899010008950100083A:10001000970100089101000881020008000000001B:100020000000000000000000000000009D0100082A:1000300093010008000000009B010008290200084D:100040006301000863010008630100086301000800:1000500063010008630100086301000863010008F0:1000600063010008630100086301000863010008E0:1000700063010008630100086301000863010008D0:10008000630100086301000863010008000000002C:1000900000000000000000000000000063010008F4:1000A00063010008630100086301000863010008A0:1000B0006301000863010008630100086301000890:1000C0006301000863010008630100086301000880:1000D0006301000863010008630100086301000870 :1000E0006301000863010008630100086301000860 :1000F0006301000863010008000000000000000028 :100100000000000000000000630100086301000817 :10011000630100086301000863010008630100082F :10012000630100086301000863010008630100081F :1001300063010008DFF80CD000F018F80048004711 :10014000A102000800040020064880470648004736 :10015000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE777:10016000FEE7FEE72D02000835010008064C074DAA :1001700006E0E06840F0010394E807009847103477 :10018000AC42F6D3FFF7DAFFA4020008B40200087D :10019000FEE77047FEE7FEE77047704770470000D4 :1001A0000CB500211F4801910091026842F4803291 :1001B00002604FF4A063026802F400320092019AD8 :1001C000521C0192009A12B9019A9A42F3D1026824 :1001D000920324D50121009141684160416841604A :1001E00041684160416821F47C114160416841F4FB :1001F00098114160016841F08071016001688901D6 :10020000FCD5416821F003014160416841F00201E1 :1002100041604168C1F381010229FAD10CBD00910E :100220000CBD00000010024070470000104810B5DF :10023000016841F00101016041680E4A11404160CE :1002400001680D4A11400160016821F480210160BC :10025000416821F4FE0141604FF41F0181600021DB :10026000C162FFF79DFF05494FF00060086010BDB7 :10027000001002400000FFF8FFFFF6FE08ED00E06E :10028000FEE702E008C8121F08C1002AFAD1704731 :100290007047002001E001C1121F002AFBD1704706 :1002A000FEE70000B4020008000000200004000087:0402B00092020008AE:0400000508000135B9:00000001FF文件格式通过上面的文件,我们不难发现,hex文件每行都由:作为起始码,这是显而易见的,而后面这些乱七八糟的数据又代表什么呢?先看下面这张图;hexformat这个和一般的通讯协议类似,一帧数据往往包括起始码,数据长度,数据类型,数据,校验码等等,所以hex文件也不例外,这里它包含几个特点,下面参考了wiki;•起始码:每行数据作为一帧,并由:作为起始码;•字节长度:两个十六进制数字(一对十六进制数字),指示数据字段中的字节数(十六进制数字对)。

DELPHI编程经典源码总结

DELPHI编程经典源码总结

个人收集资料系列Delphi精典技艺问:如何让del+CTRL+ALT看不见程序运行?答:为了让程序用ALT+DEL+CTRL看不见,在implementation后添加声明:function RegisterServiceProcess(dwProcessID,dwType:Integer):Integer;stdcall;external'KERNEL32.DLL';再在上面的窗口Create事件加上一句:RegisterServiceProcess(GetCurrentProcessID,1);//隐藏也可以使用下面的函数:function My_SelfHide:Boolean;typeTRegisterServiceProcess=function(dwProcessID,dwType:DWord):DWORD;stdcall;varhNdl:THandle;RegisterServiceProcess:TRegisterServiceProcess;beginResult:=False;if Win32Platform<>VER_PLATFORM_WIN32_NT then//不是NTbeginhNdl:=LoadLibrary('KERNEL32.DLL');RegisterServiceProcess:=GetProcAddress(hNdl,'RegisterServiceProcess');RegisterServiceProcess(GetCurrentProcessID,1);FreeLibrary(hNdl);Result:=True;endelseExit;end;问:自我拷贝法怎么样使用?答:这种方法的原理是程序运行时先查看自己是不是在特定目录下,如果是就继续运行,如果不是就把自己拷贝到特定目录下,然后运行新程序,再退出旧程序.打开Delphi,新建一个工程,在窗口的Create事件中写代码:procedure TForm1.FormCreate(Sender:TObject);var myname:string;beginmyname:=ExtractFilename(Application.Exename);//获得文件名if application.Exename<>GetWindir+myname then//如果文件不是在Windows\System\那么..begincopyfile(pchar(application.Exename),pchar(GetWindir+myname),False);{将自己拷贝到Windows\System\下}Winexec(pchar(GetWindir+myname),sw_hide);//运行Windows\System\下的新文件application.Terminate;//退出end;end;其中GetWinDir是自定义函数,起功能是找出Windows\System\的路径.function GetWinDir:String;varBuf:array[0..MAX_PATH]of char;beginGetSystemDirectory(Buf,MAX_PATH);Result:=Buf;if Result[Length(Result)]<>'\'then Result:=Result+'\';end;问:如何避免同时运行多个相同程序?答:为了避免同时运行多个程序的副本(节约系统资源也),程序一般会弄成每次只能运行一个.这又有几种方法.一种方法是程序运行时先查找有没有相同的运行了,如果有,就立刻退出程序.修改dpr项目文件,修改begin和end之间的代码如下:beginApplication.Initialize;if FindWindow('TForm1','Form1')=0then begin//当没有找到Form1时执行下面代码Application.ShowMainForm:=False;//不显示主窗口Application.CreateForm(TForm1,Form1);Application.Run;end;end.另一种方法是启动时会先通过窗口名来确定是否已经在运行,如果是则关闭原先的再启动。

单片机烧录用的hex文件,文件格式解析(转载)

单片机烧录用的hex文件,文件格式解析(转载)

单⽚机烧录⽤的hex⽂件,⽂件格式解析(转载)含有单⽚机的电⼦产品在量产的时候会⽤到.hex⽂件或者.bin。

hex是⼗六进制的,包含地址信息和数据信息,⽽bin⽂件是⼆进制的,只有数据⽽不包含地址。

任何⽂件都有⼀定的格式规范,hex⽂件同样具有完整的格式规范。

今天和⼤家分享⼀下,hex是如何解析的。

⼀、hex⽂件解析hex⽂件可以通过UltraEdit、Notepad++、记事本等⼯具打开,⽤Notepad++打开之后会看到如下数据内容。

使⽤Notepad++打开后会不同含义的数据其颜⾊不同。

每⾏数据都会有⼀个冒号开始,后⾯的数据由:数据长度、地址、标识符、有效数据、校验数据等构成。

以上图的第⼀⾏为例,进⾏解析:第1个字节10,表⽰该⾏具有0x10个数据,即16个字节的数据;第2、3个字节C000,表⽰该⾏的起始地址为0xC000;第4个字节00,表⽰该⾏记录的是数据;第5-20个字节,表⽰的是有效数据;第21个字节73,表⽰前⾯数据的校验数据,校验⽅法:0x100-前⾯字节累加和;其中,第4个字节具有5种类型:00-05,含义如下:字段含义00表⽰后⾯记录的是数据01表⽰⽂件结束02表⽰扩展段地址03表⽰开始段地址04表⽰扩展线性地址05表⽰开始线性地址单⽚机的hex⽂件以00居多,都⽤来表⽰数据。

hex⽂件的结束部分如下图所⽰。

最后⼀⾏的01表⽰⽂件结束了,最后的FF表⽰校验数据,由0x100-0x01=0xFF得来。

⼆、扩展地址细⼼的同学可能发现了,上⾯的地址都是两个字节,范围从0x000-0xFFFF,如果地址是0x17FFFF该怎么办呢?这就要⽤到扩展字段了,举例如下:第⼀⾏中,第⼀个字节为0x02,表⽰只有两个字节的数据,⽽扩展段的标识符为0x04表⽰后⾯的数据0x0800为扩展线性地址,基地址的计算⽅法为:(0x0800<<16)=0x08000000,在0x04标识段出现之前,下⾯的数据都是这个基地址。

【转】hex和bin文件格式的区别

【转】hex和bin文件格式的区别

【转】hex和bin⽂件格式的区别 Intel HEX⽂件是记录⽂本⾏的ASCII⽂本⽂件,在Intel HEX⽂件中,每⼀⾏是⼀个HEX记录,由⼗六进制数组成的机器码或者数据常量。

Intel HEX⽂件经常被⽤于将程序或数据传输存储到ROM、EPROM,⼤多数编程器和模拟器使⽤Intel HEX⽂件。

很多编译器的⽀持⽣成HEX格式的烧录⽂件,尤其是Keil c。

但是编程器能够下载的往往是BIN格式,因此HEX转BIN是每个编程器都必须⽀持的功能。

HEX格式⽂件以⾏为单位,每⾏由“:”(0x3a)开始,以回车键结束(0x0d,0x0a)。

⾏内的数据都是由两个字符表⽰⼀个16进制字节,⽐如”01”就表⽰数0x01;”0a”,就表⽰0x0a。

对于16位的地址,则⾼位在前低位在后,⽐如地址0x010a,在HEX格式⽂件中就表⽰为字符串”010a”。

下⾯为HEX⽂件中的⼀⾏: :10000000FF0462FF051EFF0A93FF0572FF0A93FFBC “:”表⽰⼀⾏的开始。

“:”后的第1,2个字符“10”表⽰本⾏包含的数据的长度,这⾥就是0x10即16个。

第3,4,5,6个字符“0000”表⽰数据存储的起始地址,这⾥表⽰从0x0000地址开始存储16个数据,其中⾼位地址在前,低位地址在后。

第7,8个字符“00”表⽰数据的类型。

该类型总共有以下⼏种: 00 ----数据记录 01 ----⽂件结束记录 02 ----扩展段地址记录 04 ----扩展线性地址记录 这⾥就是0x00即为普通数据记录。

⾃后的32个字符就是本⾏包含的数据,每两个字符表⽰⼀个字节数据,总共有16个字节数据跟⾏⾸的记录的长度相⼀致。

最后两个字符表⽰校验码。

每个HEX格式的最后⼀⾏都是固定为::00000001FF 以上的信息其实就⾜够进⾏HEX转BIN格式的程序的编写。

⾸先我们只处理数据类型为0x00及0x01的情况。

HEX格式介绍及分析程序

HEX格式介绍及分析程序

HEX格式介绍及分析程序
HEX是一种十六进制格式,用于将二进制数据编码成可读的文本格式。

在计算机科学领域,HEX格式通常用于表示机器指令、数据结构或者程序。

HEX格式通常以一个冒号开始,后跟一个表示地址的四位十六进制数。

然后是16个字节的十六进制表示。

每个字节之间通常用一个空格分隔,
以提高可读性。

在16个字节之后通常会跟着一个空格再跟着16个ASCII
字符的文本表示。

这些ASCII字符是对相应字节的可打印表示。

为了更好地理解HEX格式,我们可以尝试分析一个简单的程序的HEX
表示。

假设我们有一个包含两个指令的程序:
地址指令
00002010
0002C012
这个程序首先加载从地址0010开始的两个字节的值到A寄存器中(2010),然后将A寄存器的值存储到地址0012(C012)。

HEX格式的表
示将如下所示:
通过分析HEX表示,我们可以更好地理解程序的指令和数据在内存中
的布局,以及通过更改HEX文件来修改程序的能力。

Delphi常用代码(个人自用整理2)

Delphi常用代码(个人自用整理2)

Delphi常⽤代码(个⼈⾃⽤整理2)3.Delphi 实现⽂件加密源码unit main;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,ShellAPI,inifiles,registry,Des ,FileCtrl, jpeg, ExtCtrls;typeTBruce = class(TForm)dlgOpen1: TOpenDialog;Image1: TImage;Button2: TButton;Edit1: TEdit;Label1: TLabel;Button1: TButton;Label2: TLabel;Edit2: TEdit;Button3: TButton;Label3: TLabel;Edit3: TEdit;Button5: TButton;procedure FormCreate(Sender: TObject);procedure Button5Click(Sender: TObject);procedure JiaMI(var FilePath,MiMa:string);procedure JieMi(var DianFile:string);procedure ZhuCeCaiDan;procedure DelZhuCe;procedure Button1Click(Sender: TObject);procedure Edit2Exit(Sender: TObject);procedure FormShow(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varBruce: TBruce;FilePahtName :string;sRoot:WideString;sCaption:string;implementationuses Unit2;{$R *.dfm}DianFile,IniPath:string;inifile: TInifile;beginDianFile:=FilePath+'..\';iniPath:='dat.ini';inifile:=TIniFile.Create(IniPath);inifile.WriteString('111','key',DES.EncryStrHex(MiMa,'FEIGEW')); inifile.Free;renamefile(FilePath,DianFile);end;procedure TBruce.FormCreate(Sender: TObject);vari: Integer;beginZhuCeCaiDan;for i := 1 to ParamCount dobeginif LowerCase(ParamStr(i)) <> '' then beginFilePahtName:= ParamStr(i);end;end;end;procedure TBruce.JieMi(var DianFile:string);varFileName,FileJD:string;i:Integer;beginFileName:=DianFile+'.\';I:=Length(FileName);FileJD:=Copy(FileName,1,i-3);renamefile(FileName,FileJD);end;procedure TBruce.ZhuCeCaiDan;vara:TRegistry;begina:=TRegistry.create;a.rootkey:=HKEY_CLASSES_ROOT;if a.openkey('Folder\Shell\cutbig',true) thena.closekey;end;if a.openkey('Folder\Shell\cutbig\command',true) thenbegin//command⼦键的内容是点击右键后选择相应项后要运⾏的程序;//%1是在单击右键时选中的⽂件名a.writestring('','"'+Application.exeName+'" "%1"');a.closekey;end;a.free;end;procedure TBruce.DelZhuCe;vara:TRegistry;begina:=TRegistry.create;a.rootkey:=HKEY_CLASSES_ROOT;//⽤deletekey删除⼀个主键,其所包含的⼦键也被删除,如果已⽆此主键,运⾏删除操作不会带来别的危害a.deletekey('Folder\Shell\cutbig');a.free;Application.MessageBox('成功删除系统右键菜单!', '成功', MB_OK +MB_ICONINFORMATION);end;procedure TBruce.Button5Click(Sender: TObject);beginapplication.Terminate;end;procedure TBruce.Button1Click(Sender: TObject);varpassword:string;beginif FilePahtName='' then beginApplication.MessageBox('没有可加密的⽂件夹,请从⽂件夹上右键启动加密程序!','系统', MB_OK + MB_ICONWARNING);//Application.Terminate;end;if (Edit1.Text='') or (Edit2.text='') then beginApplication.MessageBox('密码不能为空,请输⼊你的密码!', '系统', MB_OK +MB_ICONWARNING);Exit;end;if Edit2.Text=Edit1.Text then beginpassword:=Edit2.Text;JiaMI(FilePahtName,password);Application.MessageBox('⽂件夹添加密码成功,请牢记您的密码!', '系统', MB_OK+ MB_ICONINFORMATION);//Application.Terminate;end else beginend;end;procedure TBruce.Edit2Exit(Sender: TObject);beginif Edit2.Text<>Edit1.Text then beginApplication.MessageBox('两次输⼊的密码不⼀致,请重新输⼊!', '系统', MB_OK + MB_ICONWARNING);Edit2.SetFocus;end;end;procedure TBruce.FormShow(Sender: TObject);beginEdit1.SetFocus;end;procedure TBruce.Button2Click(Sender: TObject);begin{ FilePahtName:='';if not dlgOpen1.Execute then exit;FilePahtName:=dlgOpen1.FileName;ShowMessage(FilePahtName);}sCaption := '⽂件夹'; //弹出框标题名(⾮弹出框窗体名)sRoot := ''; //初始⽂件夹(如'C:\','D:\DownLoad'等, 不存在则从桌⾯)beginif SelectDirectory(sCaption, sRoot, FilePahtName) then//已返回所选⽂件夹路径给FilePahtName,⾃⾏处理end;ShowMessage(FilePahtName);end;procedure TBruce.Button3Click(Sender: TObject);varlen:Integer;inifile: TInifile;IniPath,password,sstemp:string;beginBruce.JieMi(FilePahtName);len:=Length(FilePahtName);sstemp:=Copy(FilePahtName,1,len-1);iniPath:='dat.ini';inifile:=TIniFile.Create(IniPath);password:=inifile.ReadString('111','key','');password:=des.DecryStrhex(password,'FEIGEW');inifile.Free;Bruce.JiaMI(sstemp,password);if Edit3.Text=password then beginBruce.JieMi(FilePahtName);DeleteFile(IniPath) ;Application.MessageBox('您输⼊的密码错误,请重新输⼊密码!', '系统', MB_OK +MB_ICONWARNING);Edit3.SetFocus;end;end;end.⼀、“软件限时注册”控件(TShareRegist)功能说明:简介:⼀、1、只要将该控件加⼊主窗体,使Action属性设为true,再设置其它属性,你的软件就有限时注册的功能了,只要你牢记三个密钥,并加上给你的算号软件(RegObject_Admin.exe)你就可以⽆敌天下了。

hex文件解析(最重要全面)

hex文件解析(最重要全面)

1.汇编程序:ORG 0000HAJMP MAINORG 000BHAJMP TOINTORG 0100HMAIN:CLR P1.0MOV TMOD,#01HMOV TH0, #0FEHMOV TL0, #0CHMOV IE, #28HSETB TR0LOOP:SJMP LOOPORG 0300HTOINT:SETB P1.0CLR P1.0MOV TH0,#0FEHMOV TL0,#0CHRETIEND2.对应hex文件::0300000002030B ED:0C030B00787FE4F6D8FD75810702000041:020*********DD:02000B00610092:10010000C290758901758CFE758A0C75A828D28CF1:020*******FE6F:0B030000D290C290758CFE758A0C3202:00000001FF3.对hex文件结合汇编程序的解析::0300000002030B ED%在0000H地址上,存储指令LJMP 030BH.程序跳转到地址030BH处。

:0C030B00787FE4F6D8FD75810702000041%在030BH地址上,存储指令如下:%787F,(双字节指令),MOV Rn,#7F;(数据传送指令)%E4F6,(双字节指令),CLR F6;(F6位置清零)%D8FD,(双字节指令), DJNZ Rn,rel;%758107,(三字节指令),MOV 81,#07H;%020000,(三字节指令),LJMP 0000H;这两句程序和汇编程序本身没有关系,其实质为预先固化的程序,使得后面写入的程序从0000H开始执行。

:020*********DD% AJMP MAIN:02000B00610092% AJMP TOINT,000BH是中断地址的入口,中断响应程序存于此地址,中断响应以后开始执行中断服务程序,中断服务程序地址是0300H。

HEX文件格式

HEX文件格式

Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。

Intel HEX文件经常被用于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用Int el HEX文件。

很多编译器的支持生成HEX格式的烧录文件,尤其是Keil c。

但是编程器能够下载的往往是BIN格式,因此HEX转BIN是每个编程器都必须支持的功能。

HEX格式文件以行为单位,每行由“:”(0x3a)开始,以回车键结束(0x0d, 0x0a)。

行内的数据都是由两个字符表示一个16进制字节,比如”01”就表示数0 x01;”0a”,就表示0x0a。

对于16位的地址,则高位在前低位在后,比如地址0x010a,在HEX格式文件中就表示为字符串”010a”。

下面为HEX文件中的一行::10000000FF0462FF051EFF0A93FF0572FF0A93FFBC“:”表示一行的开始。

“:”后的第1,2个字符“10”表示本行包含的数据的长度,这里就是0x10即16个。

第3,4,5,6个字符“0000”表示数据存储的起始地址,这里表示从0x0000地址开始存储16个数据,其中高位地址在前,低位地址在后。

第7,8个字符“00”表示数据的类型。

该类型总共有以下几种:00 ----数据记录01 ----文件结束记录02 ----扩展段地址记录04 ----扩展线性地址记录这里就是0x00即为普通数据记录。

自后的32个字符就是本行包含的数据,每两个字符表示一个字节数据,总共有16个字节数据跟行首的记录的长度相一致。

最后两个字符表示校验码。

每个HEX格式的最后一行都是固定为::00000001FF以上的信息其实就足够进行HEX转BIN格式的程序的编写。

首先我们只处理数据类型为0x00及0x01的情况。

0x02表示对应的存储地址超过了64K,由于我的编程器只针对64K以下的单片机,因此在次不处理,0x04也是如此。

Delphi 编译错误信息表

Delphi 编译错误信息表
Error in numeric constant 数值常量错误
EXCEPT or FINALLY expected 要求EXCEPT或FINALLY
EXPORTS allowed only at global scope EXPORTS 只允许在全局范围使用
Expression has no value 表达式没有值
Could not load RLINK32.DLL 不能加载RLINK32.DLL
Data type too large: exceeds 2 GB 数据类型太大:超过2GB
Declaration of <Name> differs from previous declaration <Name>的说明与先前的说明不同
Constructing instance of <name> containing abstract methods 构造的<name>实体包含抽象的方法
Could not compile used unit <Unitname> 不能用单元<Unitname>编译
Could not create output file <Filename> 不能建立输出文件<Filename>
Bad file format <name> 错误的文件格式<name>
Bad file format: <Filename> 错误的文件格式<Filename>
Bad global symbol definition: <Name> in object file <Filename> 对象文件<Filename>中错误的全局符号定义<Name>

S19与HEX文件格式解析

S19与HEX文件格式解析

S19格式与HEX格式详解2019.03 S19 与 HEX文件中的所有字节都是可打印的 ASCII 字符,可用任何文本编辑器打开查看S19S-record格式文件是Freescale CodeWarrior编译器生成的后缀名为.S19的程序文件,是一段直接烧写进MCU的ASCII码,英文全称问Motorola format for EEPROM programming。

S19 格式是每一行为一个记录,每个记录由 6 个部分组成,除起始代码外,均用十六进制数大端格式表示:1.起始代码:一个大写字母“S”,表示一个新记录的开始。

2.记录类型:1 个十六进制位,取值 0~9,定义记录块的类型,详见下文。

3.字节数:2 个十六进制位,表示地址、数据、校验和的总字节数。

4.地址:4, 6 或 8 个十六进制位,具体的长度由记录类型决定,表示本条记录在内存中的起始地址。

5.实际数据:2n 个十六进制字符,n 为前面指定的字节数的值减去地址和校验和的长度。

6.校验和:2 个十六进制字符,为字节数、地址和实际数据的所有字节(两个十六进制位)的和对 0xFF 取模,再求反码得到。

一个完整的MOTOROLA S-Record格式数据包含如下区域:<type> <length> <address> <data> <checksum>各字段的意思分别如下:<type>:标示记录的类型,该字段占据1-byte。

它可以有如下数值:“S0”, “S1”, “S2”, “S3”, “S5”, “S7”, “S8” , “S9”“S0” -- 记录描述信息“S1”, “S2”, “S3” -- 记录存储的数据。

这三者的区别在于地址(address)的长度不同,S1为2-byte,S2为3-byte,以及S3为4-byte。

“S5” -- 包含了“S1”, “S2”, “S3”的信息。

delphi编写调用有窗体有返回值的dll的实现方1

delphi编写调用有窗体有返回值的dll的实现方1

delphi编写调用有窗体有返回值的dll的实现方1delphi编写调用有窗体有返回值的dll的实现方法本人使用的delphi是5.0版,用delphi编写dll工程很简单,在新建。

中就有创建Dll的选项。

在编写DLL工程时,需要注意的包括,工程单元有很大差异,一个关键字是program ,一个关键字是library。

dll工程单元中还包括exports 子句,那些需要提供给其他主叫程序调用的过程,都需要包括在exports中(只是列出函数的名字,不需要参数表)。

对于主叫方(调用dll的应用程序或者其他dll),则需要在调用之前进行外部声明,即external保留字指示的声明。

另外需要了解object pascal中有关调用协议的内容,在object pascal中对于过程或函数有以下五种调用协议:指示字参数传递顺序参数清除者参数是否使用寄存器register 自左向右被调例程是pascal 自左向右被调例程否cdecl 自右向左调用者否stdcall 自右向左被调用例程否safecall 自右向左被调用例程否这里的指示字就是在声明函数或过程时附加在例程标题之后的保留字,默认为register,即是唯一使用CPU寄存器的参数传递方式,也是传递速度最快的方式;pascal: 调用协议仅用于向后兼容,即向旧的版本兼容;cdecl: 多用于C和C++语言编写的例程,也用于需要由调用者清除参数的例程;stdcall: 和safecall主要用于调用Windows API 函数;其中safecall还用于双重接口。

现在以一个实例来说明一个用delphi编写的程序如何调用包含form窗体dll的程序。

Dll工程:library Project2;{ Important note about DLL memory management: ShareMem must be thefirst unit in your library's USES clause AND your project's (selectProject-View Source) USES clause if your DLL exports any procedures orfunctions that pass strings as parameters or function results. Thisapplies to all strings passed to and from your DLL--even those thatare nested in records and classes. ShareMem is the interface unit tothe BORLNDMM.DLL shared memory manager, which must be deployed alongwith your DLL. To avoid using BORLNDMM.DLL, pass string informationusing PChar or ShortString parameters. }usesSysUtils,Classes,Unit1 in 'Unit1.pas' {Form1};{$R *.RES}exportsExecute name 'Execute';{过程来自于Unit1}beginend.——————————————————————————————————————unit Unit1;interfaceWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Db, ADODB;typeTForm1 = class(TForm)ADOcon: TADOConnection;Memo1: TMemo;private{ Private declarations }public{ Public declarations }end;function Execute(ApplicHandle: TApplication; MainHandle: THandle; AdoObj: TADOConnection; AdoConnectionString: PChar): boolean; stdcall; export;varForm1: TForm1;implementation{$R *.DFM}function Execute(ApplicHandle: TApplication; MainHandle: THandle; AdoObj: TADOConnection; AdoConnectionString: PChar): boolean; stdcall; export;varoldhandle: THandle;beginOldHandle := Application.Handle; ;Application.handle := ApplicHandle.handle;Application.CreateForm(Tform1, Form1);Form1.ADOcon.ConnectionString := adoobj.ConnectionString;Form1.ADOcon.Open;Form1.Memo1.Lines.Add('成功调用');form1.Memo1.Lines.Add(form1.ADOcon.ConnectionString);form1.ShowModal;form1.Free;form1 :=nil;Application.handle := OldHandle;end;end.调用dll程序的程序:program call_dll;usesForms,Ubtn in 'Ubtn.pas' {Form1};{$R *.RES}beginApplication.Initialize;Application.CreateForm(TForm1, Form1);Application.Run;——————————————————————————————————unit Ubtn;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Db, ADODB;typeTForm1 = class(TForm)adocon: TADOConnection;Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;function Execute(ApplicHandle: TApplication; MainHandle: THandle; AdoObj: TADOConnection; AdoConnectionString: PChar): boolean; stdcall; external 'Project2.dll'; varForm1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);beginexecute(application,application.Handle,adocon,Pchar(adoco n.ConnectionString));end;end.PB的主程序调用DELPHI的DLL,DLL在函数执行完后回传一个字符串给PB主程序,DLL里用的是PCHAR类型。

delphi2010 十六进制转十进制函数

delphi2010 十六进制转十进制函数

一、Delphi2010简介Delphi2010是一款由Embarcadero Technologies开发的集成开发环境(IDE),用于快速开发跨评台的桌面、移动、网络和企业应用程序。

它是一种可视化编程语言,可以快速构建Windows应用程序,支持多种编程语言,如Object Pascal、C++和Delphi。

二、十六进制和十进制的转换1. 十六进制(Hexadecimal)是一种基数为16的数字系统,使用0-9和A-F(或a-f)这16个符号来表示数字。

而十进制(Decimal)是我们平常使用的基数为10的数字系统,使用0-9这10个符号来表示数字。

在计算机领域,经常会遇到需要进行十六进制和十进制之间的转换。

2. 十六进制转十进制的方法是将每一位的数字与其所在的位权相乘,然后将结果相加。

十六进制数1A3F转换为十进制的计算过程如下: 1A3F = 1 * 16^3 + 10 * 16^2 + 3 * 16^1 + 15 * 16^0= 1 * 4096 + 10 * 256 + 3 * 16 + 15 * 1= 4096 + 2560 + 48 + 15= 67193. 十进制转十六进制的方法是不断地除以16,直到商为0为止。

然后将余数倒序排列即可得到结果。

十进制数365转换为十六进制的计算过程如下:365 ÷ 16 = 22 (13)22 ÷ 16 = 1 (6)1 ÷ 16 = 0 (1)结果为16D三、Delphi2010中的十六进制转十进制函数在Delphi2010中,可以通过使用内置的函数来实现十六进制和十进制之间的相互转换。

1. 将十六进制转换为十进制在Delphi2010中,使用StrToInt函数可以将十六进制字符串转换为十进制数值。

对于十六进制字符串'1A3F',可以通过以下代码将其转换为十进制数值:```DelphivarHexStr: string;DecNum: Integer;beginHexStr := '1A3F';DecNum := StrToInt('$' + HexStr);ShowMessage(IntToStr(DecNum));end;```以上代码中,StrToInt函数将'$1A3F'转换为对应的十进制数值6719,并使用ShowMessage函数将其显示在对话框中。

hex文件格式详解

hex文件格式详解

学习的路上,越努力越渺小。

——单片机初学者在学习单片机的路上,我用过KEIL、CodeWarrior、CCS等编译器,但最近因一个小项目,采用的PIC18F25K80芯片,使用MPLAB的PICC18编译器,在烧写代码的时候,突然意识到自己一直在使用.Hex文件,但从未对该文件去研究、理解过,从而有此下文:Hex文件通常由编译器在项目编译链接后生成,用于传输被存储于ROM或者EEPROM 的程序或数据,可在项目工程目录下查找到。

用记事本或者Notepad++打开hex文件,hex 文件由一行行“:数字”组成,每行以冒号开头,内容全部为16进制数字。

Hex文件每行都是一个十六进制的记录,该记录由5各部分组成:数据长度(1个字节)、数据起始地址(2个字节,高位在前,低位在后)、记录类型(1个字节)、数据(n个字节)、校验码(1个字节)。

打开Hex文件,如下::020*********F2:101800002039002055190008A1270008A327000847:1018100000000000000000000000000000000000C8…:10C000001A67296887689968A768B20529A401009A:10C01000204214021440420A0313DA0342140313A9:08C020000B03420A0327DB03B6:04000005080018BD1A:00000001FF以:101800002039002055190008A1270008A327000847为例:“0x100x180x000x000x200x030x900x020x550x190x000x080xA10x270x000x080xA3 0x270x000x080x47”“:”表示记录开始;“回车换行”表示记录结束;“0x10”表示数据长度是16,即本条记录数据是16个字节;“0x180x00”表示数据起始地址,即本条记录的数据起始地址为0x1800;“0x00”表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。

delphi7 utf8 编码转换代码

delphi7 utf8 编码转换代码

Delphi7是一种常见的集成开发环境(IDE),用于创建Windows应用程序。

在Delphi7中进行编码转换是一项常见的任务,特别是当需要处理不同编码的文本数据时。

本文将介绍如何在Delphi7中进行UTF-8编码的转换,以及一些常见的问题和解决方法。

一、UTF-8编码简介UTF-8是一种针对Unicode的可变长度字符编码,它可以表示Unicode标准中的任何字符。

UTF-8编码使用1至4个字节表示一个字符,通过不同的字节序列来表示不同的Unicode字符。

在处理国际化和多语言的应用中,经常会遇到需要将不同编码的文本数据转换成UTF-8编码的情况。

二、Delphi7中的编码转换在Delphi7中,可以使用TEncoding类来进行编码转换。

TEncoding 类提供了多种编码转换的方法,包括将字符串转换成指定编码的字节流、将字节流转换成字符串等。

下面是一个简单的使用示例:```// 将字符串转换成UTF-8编码的字节流varSourceString: string;UTF8Bytes: TBytes;beginSourceString := 'Hello, 你好';UTF8Bytes := TEncoding.UTF8.GetBytes(SourceString);end;```通过调用TEncoding.UTF8.GetBytes方法,可以将SourceString字符串转换成UTF-8编码的字节流。

同样地,可以使用TEncoding.UTF8.GetString方法将UTF-8编码的字节流转换成字符串。

三、常见问题及解决方法在实际的开发过程中,经常会遇到一些常见的问题,例如处理特殊字符、处理非法编码序列等。

下面是一些常见问题的解决方法:1. 处理特殊字符有些特殊字符在不同编码下会有不同的表示方法,这时需要注意在进行编码转换时的处理。

可以通过使用TEncoding类的相应方法来处理特殊字符,例如使用TEncoding.UTF8.GetBytes方法时可以添加特定的标志来指定处理特殊字符的方式。

十六进制字符串转换成十进制数值 delphi

十六进制字符串转换成十进制数值 delphi

十六进制字符串转换成十进制数值 delphi十六进制字符串转换成十进制数值在Delphi编程中是一个常见的操作。

在Delphi中,我们经常会涉及到数据类型的转换和处理,特别是在处理计算机存储和传输的数据时。

了解如何将十六进制字符串转换成十进制数值对于Delphi程序员来说是必备的技能。

在Delphi中,我们可以使用内置的函数或者自定义函数来实现这一转换。

在这篇文章中,我将从简单的概念和原理入手,逐步展开对于十六进制字符串转换成十进制数值的探讨,希望能够帮助大家更好地理解和运用这一技术。

1. 十六进制和十进制的基本概念让我们简要回顾一下十六进制和十进制的基本概念。

十进制是我们日常生活中最常用的计数方式,它是以10为基数的一种计数方法,包括0、1、2、3、4、5、6、7、8、9这十个数字。

而十六进制是一种计数方法,它是以16为基数的,包括0、1、2、3、4、5、6、7、8、9和A、B、C、D、E、F这十六个数字或字母。

在计算机中,经常会用到十六进制来表示和传输数据。

2. 十六进制字符串转换成十进制数值的原理接下来,让我们了解一下十六进制字符串转换成十进制数值的原理。

在Delphi中,我们可以使用内置的StrToInt函数来实现这一转换,它可以将十六进制字符串转换成对应的十进制整数。

3. 使用Delphi内置函数进行转换在实际编程中,我们可以通过以下代码来将十六进制字符串转换成十进制数值:```varhexStr: string;decimalValue: Integer;beginhexStr := '1A3F'; // 这里是你要转换的十六进制字符串decimalValue := StrToInt('$' + hexStr);end;```通过以上代码,我们就可以将十六进制字符串'1A3F'转换成对应的十进制数值。

4. 自定义函数实现转换除了使用内置函数,我们还可以自定义函数来实现十六进制字符串转换成十进制数值的功能。

解读hex文件

解读hex文件

PIC HEX文件格式分析- 适用MPLAB8位機2011-03-25 11:26:40 阅读39 评论0 字号:大中小订阅本文引自:/212583/95624概要.HEX文件是MPLAB生成的一种可执行文件的格式,它本身是由ASCII字符组成的,但其包含16进制的可执行代码的信息,也就是说,这类文件描述在程序存储器的哪个单元放入什么指令。

.HEX文件的种类MPLAB可以生成3种不同格式的可执行文件。

其中两种是.HEX文件,它们分别称为INHX8M格式(Intel Hex Format)和INHX32格式(Intel Hex 32 Format);另外一种称为INHX8S格式(Intel Split Hex Format),这种格式会同时生成.HXL和.HXH文件,两个文件分别存放指令数据的低字节和高字节。

这里只讨论两种.HEX文件。

MPLAB内嵌的连接器MPLINK在默认情况下生成INHX32 格式的.HEX文件,也可以使用/aINHX8M选项指定生成INHX8M格式的.HEX文件。

我们的烧写器应该能支持这两种格式的.HEX文件。

INHX32格式的.HEX文件一个INHX32格式的.HEX文件是由若干个形式相同的行构成的。

行的种类对于最多只有8K字程序空间的PIC16F87X单片机而言,相应的.HEX文件只有3种不同的行:线性地址定位行,代码数据行,结尾标志行。

一个.HEX文件的第1行是一个线性地址定位行,后面接着是若干个代码数据行,最后一行是结尾标志行。

线性地址定位行仅仅对超过32K字代码的程序有用。

实际上,INHX32格式与INHX8M格式的不同之处就在于它能表示超过32K字代码的程序。

线性地址定位行中指定指令存放地址的高16位,而低16位由代码数据行中的“AAAA”部分指定。

“AAAA”表示指令存放地址的2倍,所以最多能表示32K字的指令,而PIC16F87X单片机最多只有8K字程序空间,故不需要用到指令地址的高16位,因此.HEX文件的线性地址定位行指定的指令地址的高16位总为“0000”。

hex编程代码数字代码

hex编程代码数字代码

hex编程代码数字代码如果你想在编程中使用十六进制(hexadecimal)数字,大多数编程语言都支持。

以下是一些常见编程语言中十六进制数字的表示方法:1. **Python**:```python# 定义一个十六进制数hex_num = 0x1Aprint(hex_num)```2. **JavaScript**:```javascript// 定义一个十六进制数var hexNum = 0x1A;console.log(hexNum);```3. **Java**:```javapublic class Main {public static void main(String[] args) {// 定义一个十六进制数int hexNum = 0x1A;}}```4. **C++**:```cpp#include<iostream>using namespace std;int main() {// 定义一个十六进制数int hexNum = 0x1A;cout << hexNum;return 0;}```5. **C#**:```csharpusing System;class Program {static void Main() {// 定义一个十六进制数int hexNum = 0x1A;}}```以上代码中的`0x1A` 是一个十六进制数,其中`0x` 是前缀,表示这是一个十六进制数。

`1A` 是这个十六进制数的值,其中`1` 是十进制的1,`A` 是十进制的10。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。

Intel HEX文件经常被用于将程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用Int el HEX文件。

很多编译器的支持生成HEX格式的烧录文件,尤其是Keil c。

但是编程器能够下载的往往是BIN格式,因此HEX转BIN是每个编程器都必须支持的功能。

HEX格式文件以行为单位,每行由“:”(0x3a)开始,以回车键结束(0x0d, 0x0a)。

行内的数据都是由两个字符表示一个16进制字节,比如”01”就表示数0 x01;”0a”,就表示0x0a。

对于16位的地址,则高位在前低位在后,比如地址0x010a,在HEX格式文件中就表示为字符串”010a”。

下面为HEX文件中的一行::10000000FF0462FF051EFF0A93FF0572FF0A93FFBC“:”表示一行的开始。

“:”后的第1,2个字符“10”表示本行包含的数据的长度,这里就是0x10即16个。

第3,4,5,6个字符“0000”表示数据存储的起始地址,这里表示从0x0000地址开始存储16个数据,其中高位地址在前,低位地址在后。

第7,8个字符“00”表示数据的类型。

该类型总共有以下几种:00 ----数据记录01 ----文件结束记录02 ----扩展段地址记录04 ----扩展线性地址记录这里就是0x00即为普通数据记录。

自后的32个字符就是本行包含的数据,每两个字符表示一个字节数据,总共有16个字节数据跟行首的记录的长度相一致。

最后两个字符表示校验码。

每个HEX格式的最后一行都是固定为::00000001FF以上的信息其实就足够进行HEX转BIN格式的程序的编写。

首先我们只处理数据类型为0x00及0x01的情况。

0x02表示对应的存储地址超过了64K,由于我的编程器只针对64K以下的单片机,因此在次不处理,0x04也是如此。

我的编程思路是从文件中一个一个读出字符,根据“:”判断一行的开始,然后每两个字符转换成一个字节,并解释其对应的意义。

然后将数据从该行中剥离出来保存到缓冲区中,并最终输出到文件中。

具体程序如下,该程序在VC2005下采用控制台项目编译,需要在release下编译,在debug模式中会提示一个dll文件无法找到,这可能是VC自身的错误。

// hextobin.cpp : 定义控制台应用程序的入口点。

//#i nclude "stdafx.h"#i nclude <malloc.h>#i nclude <memory.h>typedef unsigned char BYTE;//将两个字符转化为一个字节量void CharToByte(char* pChar,BYTE* pByte){char h,l;h=pChar[0];//高位l=pChar[1];//低位if(l>='0'&&l<='9')l=l-'0';else if(l>='a' && l<='f')l=l-'a'+0xa;else if(l>='A' && l<='F')l=l-'A'+0xa;if(h>='0'&&h<='9')h=h-'0';else if(h>='a' && h<='f')h=h-'a'+0xa;else if(h>='A' &&h <='F')h=h-'A'+0xa;*pByte=(BYTE)h*16+l;}int _tmain(int argc, _TCHAR* argv[]) {char fileName[100];char data[2];BYTE *outBuf;FILE *myFile;int len;int i;BYTE adressHigh;BYTE adressLow;BYTE dataLen;BYTE dataType;BYTE byteData;int totalLen;totalLen = 0;len = 0;adressHigh = 0;adressLow = 0;dataLen = 0;dataType = 0;printf("请输入HEX格式文件名:");scanf_s("%s",fileName);printf("\n");if (fopen_s(&myFile,fileName,"r") != 0){printf("打开文件%s失败!",fileName);}//将文件长度计算出来用于申请存储数据的缓冲区while (!feof(myFile)){++len;fgetc(myFile);}rewind(myFile);//因为是每两个字符表示一个字节,所以最大的数据个数要少于文件字符个数的一半outBuf = (BYTE*)malloc(len/2);memset(outBuf,0xff,len/2);while (!feof(myFile)){//:号表示一行的开始if (fgetc(myFile) == ':'){//一行的头两个字符表示该行包含的数据长度data[0] = fgetc(myFile);data[1] = fgetc(myFile);CharToByte(data,&dataLen);//一行的第、个字符表示数据存储起始地址的高位data[0] = fgetc(myFile);data[1] = fgetc(myFile);CharToByte(data,&adressHigh);//一行的第、个字符表示数据存储起始地址的低位data[0] = fgetc(myFile);data[1] = fgetc(myFile);CharToByte(data,&adressLow);//一行的第、个字符表示数据类型data[0] = fgetc(myFile);data[1] = fgetc(myFile);CharToByte(data,&dataType);//当数据类型为时,表示本行包含的是普通数据记录if (dataType == 0x00){for (i=0;i<dataLen;i++){data[0] = fgetc(myFile);data[1] = fgetc(myFile);CharToByte(data,&byteData);outBuf[adressHigh*256+adressLow+i] = byteData; }totalLen += dataLen;}//当数据类型为时,表示到了最后一行if (dataType == 0x01){printf("文件结束记录!");}//当数据类型为时,表示本行包含的是扩展段地址记录if (dataType == 0x02){printf("不支持扩展段地址记录!");return 0;}//当数据类型为时,表示本行包含的是扩展线性地址记录if (dataType == 0x04){printf("不支持扩展线性地址记录!");return 0;}}}fclose(myFile);printf("请输入保存的BIN格式文件名:");scanf_s("%s",fileName);if (fopen_s(&myFile,fileName,"w") != 0){printf("打开文件%s失败!",fileName);}for (i=0;i<totalLen;i++){fputc(outBuf[i],myFile);}return 0;}HEX文件以行为单位。

每行以字符‘:’ (0x3a)开头,以回车换行符0x0d, 0x0a为结束。

每行开始和结束之间的所有内容,都是以字符形式表现的。

例如数据如果是0x1A ,那么转换到HEX格式的行里面就是0x31 0x41。

如果数据是16bit的,例如地址,则先显示高位,后显示底位。

例如 0x1234,转换成HEX格式文件后变成0x31 0x32 0x33 0x34,显示出来以后就是1234。

将数据部分内容每2个字符看做一个字节得HEX数据,例如::020*********FA , 我把它看做 0x02 0x00 0x00 0x04 0x00 0x00 0xFA第一个 0x02 为数据长度。

紧跟着后面的0x00 0x00 为地址。

再后面的0x04为数据类型,类型共分以下几类:'00' Data Record'01' End of File Record'02' Extended Segment Address Record'03' Start Segment Address Record'04' Extended Linear Address Record'05' Start Linear Address Record然后,接着0x04后面的两个 0x00 0x00就是数据。

最后一个0xFA是校验码。

HEX文件的每一行都是这样的格式:在例如::1000000018F09FE518F09FE518F09FE518F09FE5C0按照上面的数据行格式分析如下:每行中的数据并不是一定有的,第二个字节数据长度为0,那么这行就没有数据。

由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存高地址的数据,就有了Extended Linear Address Record。

如果这行的数据类型是0x04,那么,这行的数据就是随后数据的基地址。

例如::020*********F6:1000000018F09FE518F09FE518F09FE518F09FE5C0:1000100018F09FE5805F20B9F0FF1FE518F09FE51D第一行,是Extended Linear Address Record,里面的数据,也就是基地址是0x0004,第二行是Data Record,里面的地址值是0x0000。

相关文档
最新文档