HEX文件格式+DELPHI源码
Delphi常见错误代码
Delphi常见错误代码及中文解释';' not allowed before 'ELSE' ElSE前不允许有“;”'<clause>' clause not allowed in OLE automation section 在OLE自动区段不允许“<clause>”子句'<name>' is not a type identifier <name>不是类型标识符'<name>' not previously declared as a PROPERTY <name>前面没有说明PROPERTY'GOTO <label>' leads into or out of TRY statement GOTO <label>进入或超出TRY语句的范围<clause1> clause expected, but <clause2> found 要求子句<clause1>,但出现<clause2>16-Bit fixup encountered in object file '<text>' 在对象文件<text>遇到16位修复486/487 instructions not enabled 不能用486/487指令Abstract methods must be virtual or dynamic 抽象方法必须为虚拟的或动态的Array type required 需要数组类型Assignment to FOR-Loop variable '<Name>' 给FOR循环变量<Name>赋值Bad argument type in variable type array constructor 在变量类型数组结构中不正确的参数类型Bad file format '<name>' 错误的文件格式<name>Bad file format: <Filename> 错误的文件格式<Filename> Bad global symbol definition: '<Name>' in object file '<Filename>' 对象文件'<Filename>'中错误的全局符号定义'<Name>'Bad unit format: <Filename> 错误的单元格式<Filename> BREAK or CONTINUE outside of loop BREAK或CONTINUE超出循环Cannot add or subtract relocatable symbols 不能增加或减少可重置的符号Cannot assign to a read-only property 不能指定只读属性Cannot BREAK, CONTINUE or EXIT out of a FINALLY clause 超出FINALLY 子句的范围,不能使用BREAK,CONTINUE或EXIT语句Cannot initialize local variables 不能初始化局部变量Cannot initialize multiple variables 不能初始化多个变量Cannot initialize thread local variables 不能初始化线程局部变量Cannot override a static method 不能覆盖静态方法Cannot read a write-only property 不能读取只写属性Case label outside of range of case expression CASE标号超出了CASE 表达式的范围Circular unit reference to <Unitname> 对单元<Unitname>循环引用Class already has a default property 类已具有默认的属性Class does not have a default property 类没有默认的属性Class or object types only allowed in type section 在类型区段只允许有类或对象类型Class type required 需要类类型Close error on <Filename> 文件<Filename>关闭错误Compile terminated by user 用户中止编译Constant expected 要求常量Constant expression expected 要求常量表达式Constant expression violates subrange bounds 常量表达式超出子界范围Constant object cannot be passed as var parameter 常量对象不能作为变量参数传递Constant or type identifier expected 要求常量或类型标识符Constants cannot be used as open array arguments 常量不能用作打开数组参数Constructing instance of '<name>' containing abstract methods 构造的<name>实体包含抽象的方法Could not compile used unit '<Unitname>' 不能用单元<Unitname>编译Could not create output file <Filename> 不能建立输出文件<Filename>Could not load RLINK32.DLL 不能加载RLINK32.DLLData type too large: exceeds 2 GB 数据类型太大:超过2GB Declaration of <Name> differs from previous declaration <Name>的说明与先前的说明不同Default property must be an array property 默认的属性必须为数组属性Default values must be of ordinal, pointer or small set type 默认的值必须为序数、指针或小集类型Destination cannot be assigned to 目标不能指定Destination is inaccessible 目标不能存取Dispid '<number>' already used by '<name>' DISPID标识号已被<name>使用Dispid clause only allowed in OLE automation section DISPID子句只能在OLE自动区段中使用Division by zero 除数为零Duplicate case label CASE标号重复Duplicate tag value 重复的标志值Dynamic method or message handler not allowed here 这里不允许有动态方法或信息处理程序Dynamic methods and message handlers not allowed in OLE automation section在OLE 自动区段不允许有动态方法或消息处理程序Element 0 inaccessible - use 'Length' or 'SetLength' 元素0不能存取-使用LENGTH或SETLENGTHError in numeric constant 数值常量错误EXCEPT or FINALLY expected 要求EXCEPT或FINALLY EXPORTS allowed only at global scope EXPORTS只允许在全局范围使用Expression has no value 表达式没有值Expression too complicated 表达式太复杂Field definition not allowed in OLE automation section 在OLE自动区段中不允许域定义Field definition not allowed after methods or properties 在方法或属性后不允许域定义Field or method identifier expected 要求域或方法标识符File not found: <Filename> 文件<Filename>没有找到File type not allowed here 这儿不允许文件类型For loop control variable must be simple local variable FOR循环控制变量必须为简单局部变量For loop control variable must have ordinal type FOR循环控制变量必须为序数类型FOR or WHILE loop executes zero times - deleted FOR或WHILE循环执行零次-删除FOR-Loop variable '<name>' cannot be passed as var parameter FOR循环变量<name>不能作为参数传递FOR-Loop variable '<Name>' may be undefined after loop 在循环后的FOR循环变量<NAME>是不确定的Function needs result type 函数需要结果类型Identifier redeclared: '<name>' 标识符<name>重复说明Illegal character in input file: '<char>' ($<hex>) 在输入文件中的非法字符'<char>'Illegal message method index 非法的消息方法指针Illegal reference to symbol '<Name>' in object file '<Filename>' 在对象文件<filename>中对符号<name>的非法引用Illegal type in OLE automation section: '<typename>' 在OLE自动区段中的非法类型<typename>Illegal type in Read/Readln statement 在Read/Readln语句中的非法类型Illegal type in Write/Writeln statement 在Write/Writeln语句中的非法类型Inaccessible value 不可存取的值Incompatible types: '<name>' and '<name>' 不兼容的类型<name>和<name>Incompatible types: <text> 不兼容的类型<text>Inline assembler stack overflow 内联汇编溢出Inline assembler syntax error 内联汇编语法错误Instance variable '<name>' inaccessible here 实体变量<name>在这里不能存取Integer constant or variable name expected 要求整形常量或变量名Integer constant too large 整型常量太大Internal error: <ErrorCode> 内部错误<errorcode>Invalid combination of opcode and operands 操作码与操作对象的无效组合Invalid compiler directive: '<Directive>' 无效的编译指令<DIRECTIVE> Invalid function result type 无效的函数值类型Invalid message parameter list 无效的消息参数列表Invalid register combination 无效的寄存器组合Invalid typecast 无效的TYPECASELabel '<Name>' is not declared in current procedure 在当前的过程中没有说明标号<NAME>Label already defined: '<Labelname>' 标号<LABELNAME>已经定义Label declaration not allowed in interface part 在界面部分不允许标号说明Label declared and referenced, but not set: '<label>' 标号被<label>说明及引用,但不能设置Label expected 要求标号Left side cannot be assigned to 左边不能赋值Line too long (more than 255 characters) 行太长(超出255个字符) Local class or object types not allowed 不允许局部的类或对象类型Local procedure/function '<Name>' assigned to procedure variable 局部过程/函数<NAME>赋给过程变量LOOP/JCXZ distance out of range LOOP/JCXZ距离超出范围Low bound exceeds high bound 下界超过上界Memory reference expected 要求内存引用Method '<name>' hides virtual method of base type '<name>' 方法<NAME>隐藏了基类型为<NAME>的虚拟方法Method '<name>' not found in base class 在基类中没有找到方法<NAME>Method identifier expected 要求方法标识符Missing ENDIF directive 缺少ENDIF指令Missing operator or semicolon 缺少操作符或分号Missing or invalid conditional symbol in '$<symbol>' directive 在$<symbol>指令中缺少或无效的条件符号Missing parameter type 缺少参数类型Necessary library helper function was eliminated by linker 必要的库帮助函数被连接程序删除No definition for abstract method '<name>' allowed 抽象方法<NAME>没有定义Not enough actual parameters 没有足够的实际参数Number of elements differs from declaration 元素数与说明不同Numeric overflow 数值溢出Object or class type required 需要对象或类类型Object type required 需要对象类型Only register calling convention allowed in OLE automation section 在OLE自动区段中只允许寄存器调用约定Operand size mismatch 运算对象大小匹配Operator not applicable to this operand type 运算符不使用于这一运算对象类型Order of fields in record constant differs from declaration 在记录常量中的域次序与说明不同Ordinal type required 需要序数类型Out of memory 内存溢出Overflow in conversion or arithmetic operation 转换或算术操作溢出Overriding automated virtual method '<name>' cannot specify a dispid 覆盖的自动虚拟方法<NAME>不能指定DISPIDPACKED not allowed here 这里不允许PACKED Pointer type required 需要指针类型Procedure cannot have a result type 过程不能有结果类型Procedure DISPOSE needs destructor 过程DISPOSE需要destructorProcedure FAIL only allowed in constructor 过程FAIL只允许在constructor方法中Procedure NEW needs constructor 过程NEW需要constructor 方法PROCEDURE or FUNCTION expected 要求PROCEDURE或FUNCTIONProcedure or function name expected 要求过程或函数名Program or unit '<name>' recursively uses itself 程序或单元递归Property '<name>' does not exist in base class 在基类中<NAME>属性不存在Published property '<name>' cannot be of type <type> Published属性<NAME>不能具有类型<type>Published Real48 property '<name>' must be Single, Double or Extended Published REAL属性<NAME>必须为Single, Double或ExtendedRe-raising an exception only allowed in exception handler 在意外处理中只允许重新引起意外处理Read error on <Filename> 文件<FILENAME>读出错Record, object or class type required 需要记录,对象或类类型Redeclaration of '<name>' hides a member in the base class <NAME>的重新说明隐藏了基类中一个元素Redeclaration of property not allowed in OLE automation section 在OLE自动区段中不允许属性重复说明Return value of function '<Functionname>' might be undefined 函数<Functionname>的返回值可能没有定义Seek error on <Filename> 在<FILENAME>中搜索错误Segment/Offset pairs not supported in Borland 32-bit Pascal 在Borland 32位的PASCAL中不支持Segment/Offset对Sets may have at most 256 elements 集至少有256个元素Size of published set '<name>' is >32 bits published集<NAME>的大小大于32字节Slice standard function only allowed as open array argument Slice标准函数只允许作为打开数组参数Statement expected, but expression of type '<type>' found 要求语句,但出现类型<TYPE>的表达式Statements not allowed in interface part 在界面中不允许的语句String constant too long 字符串常量太长String constant truncated to fit STRING[<number>] 字符串常量截取到适合STRING[<number>]Strings may have at most 255 elements 字符串至少255个元素Structure field identifier expected 要求结构域标识符Syntax error in real number 实数语法错误System unit out of date or corrupted: missing '<name>' 系统单元超出日期或损坏:缺少<NAME>Text after final 'END. 编译器忽略END.后的文本This form of method call only allowed for class methods 该方法的窗体只允许类方法This form of method call only allowed in methods of derived types 该方法的窗体只允许在导出类型的方法中This type cannot be initialized 这一类型不能初始化Thread local variables cannot be ABSOLUTE 线程局部变量不能是ABSOLUTEThread local variables cannot be local to a function or procedure 线程局部变量对函数不能是局部的Too many actual parameters 太多的实际参数Too many conditional symbols 太多的条件符号Type '<name>' has no type info 类型<NAME>没有类型信息Type '<Name>' is not yet completely defined 类型<NAME>至今没有定义Type '<name>' must be a class to have a PUBLISHED section 类型<NAME>必须是在PUBLISHED区段中的类Type '<name>' must be a class to have OLE automation 类型<NAME>必须是具有OLE自动的类Type '<name>' needs finalization - not allowed in file type 类型<NAME>需要初始化-不允许在文件类型中Type '<name>' needs finalization - not allowed in variant record 类型<NAME>需要初始化-不允许在变体记录Type expected 要求TYPEType not allowed in OLE Automation call 在OLE自动调用中不允许的类型Type of expression must be BOOLEAN 表达式的类型必须为BOOLEAN型Type of expression must be INTEGER 表达式的类型必须为INTEGER型TYPEINFO standard function expects a type identifier TYPEINFO标准函数要求类型标识符TYPEOF can only be applied to object types with a VMT TYPEOF只能用于具有VMT的对象类型Types of actual and formal var parameters must be identical 形参与实参必须一致Undeclared identifier: '<name>' 未说明的标识符<NAME> Unexpected end of file in comment started on line <Number> 以行<Number>开始的注释中出现不应有的文件结束Unit <Unit1> was compiled with a different version of <Unit2> 单元<UNIT1>与不同版本的<UNIT2>编译Unit name mismatch: '<Unitname>' 单元名不匹配<UNITNAME> Unknown directive: '<Directive>' 未知的指令<DIRECTIVE> Unnamed arguments must precede named arguments in OLE Automation call 在OLE自动调用中未命名的参数必须在命名的参数前Unsatisfied forward or external declaration: '<Procedurename>' 不满足的向前或外部说明<Procedurename>Unterminated string 未结束的字符串Value assigned to '<Name>' never used 赋给<NAME>的值从未使用过Variable '<name>' inaccessible here due to optimization 由于优化,变量名<NAME>在这里不能存取Variable '<name>' is declared but never used in '<name>' 变量名<NAME>已说明,但不曾使用Variable '<Name>' might not have been initialized 变量名<NAME>可能没有初始化Variable required 需要变量Virtual constructors are not allowed 不允许虚拟的constructors方法Write error on <Filename> 文件<Filename>写错误Wrong or corrupted version of RLINK32.DLL RLINK32.DLL版本错误或不能用*********************************************************************************************** ******************************** 运行错误信息** 运行时出现的错误信息形式为: ** Run-time error nnn at xxxx ** 其中nnn 是运行时的错误编号** xxxx 是运行时的错误地址********************************运行时的错误分为以下三类:* I/O错误:错误编号为100-149编号说明---------------------------------------------------------100 磁盘读错误,若要对超过格式文件尾进行读取时101 磁盘写错误,若磁盘满时,由CloseFile,Write,Writeln或Flush报告102 没有指定文件,若文件变量没有由Assign或AssignFile赋值,由Reset,Rewrite,Append,Rename和Erase报告103 文件没有打开,若文件未打开,由CloseFile,Read,Write,Seek,Eof,FilePos,FileSize,Flush,BlockRead或BlockWrite报告104 输入文件未打开,由Read,Readln,Eof,Eoln,SeekEof或SeekEoln报告有关输入的文本文件未打开105 输出文件未打开,由Write和Writeln报告有关文本文件没有用Console应用程序生成106 无效的数据格式,由Read或Readln报告从文本文件读取的数据格式不正确* 致命错误:错误编号为200-255编号说明---------------------------------------------------------200 被零除201 范围检查错误202 栈上溢203 栈上溢错误204 无效的指针操作205 浮点上溢206 浮点下溢207 无效的浮点操作215 算术上溢错误216 存取非法217 控制-C218 授权指令219 无效的TYPECAST220 无效的变体TYPECAST221 无效的变体操作222 没有变体方法调用DISPATCHER223 不能建立变体数组224 变体不包含数组225 变体数组边界错误226 TLS初始化错误* 操作系统错误编号说明---------------------------------------------------------1899L 不能生成端点映射数据库1752L 不能执行操作1751L 入口点非法1753L 端点映射中没有更多可用的端点5L 存取非法1331L 帐号当前不能用,因此不能登录1793L 用户帐号过期1327L 用户名是有效的,但一些限制不能验明用户57L 网络适配器硬件错误1379L 指定的别名已存在1344L 分配用于更新的内存块不足85L 本地设备名已在使用183L 试图建立已存在的文件1074L 系统当前正以最新最好的配置运行7L 存储控制块被破坏534L 运算结果超出32位174L 文件系统不支持锁定类型的原子变化199L 操作系统不能运行这一程序160L 传递给DosExecPgm的参数串不正确22L 设备不能识别的命令1361L 安全描述符不在要求的格式66L 网络资源类型不正确1200L 指定的设备名无效119L 系统不支持请求的命令10L 环境不正确193L %1不是有效的基于Windows的应用程序11L 企图装载不正确格式的程序1346L 指定的模拟级无效或没有提供要求的模拟级1340L 试图建立继承的ACL或没有继承的ACE 24L 程序指定的命令长度不正确1365L 登录段与要求的操作状态不一致67L 网络名找不到58L 指定的服务器不能执行请求的命令53L 网络路径没有找到161L 指定的路径名无效230L 管道状态无效1206L 网络连接协议被损坏1204L 指定的网络提供者名无效60L 远程适配器不兼容159L 线程ID地址不正确1349L 符号对象类型不当20L 系统不能找到指定的设备2202L 指定的用户名无效1348L 请求的确定信息类是无效的1009L 配置记录数据库被破坏1010L 配置记录密钥无效1102L 遇到磁带头或分区1076L 当前引导已接受为最新的控制设置109L 管道结束111L 文件名太长1111L I/O总线重新设置170L 请求的资源在使用142L 此时系统不能执行JOIN或SUBST120L 输入的API只能在Windows/NT模式下工作1003L 由于一些原因不能完成的功能173L 锁定请求对提供撤消区未解决266L 不能使用1407L 不能找到Windows类1368L 表示要试图通过命名管道的模拟还没有读取82L 不能生成目录或文件1205L 不能打开网络连接协议1351L 没有联系的域控制器或在域内对象被保护,因此不能存取必要信息1310L 委托组不能禁止1347L 试图打开匿名的符号,匿名级的符号不能打开1011L 配置记录密钥不能打开1012L 配置记录密钥不能读取1013L 配置记录密钥不能写1021L 试图在易变的父关键字下建立稳定的子关键字129L 应用程序%1不能在Windows模式下运行1436L 子窗口不能有菜单1059L 指定子循环服务从属1410L 类已存在1411L 类不存在1412L 类仍在打开的窗口中1418L 线程没有打开的剪切板1201L 设备当前没有连接,但要记住连接1421L 没有找到控制ID1121L 由于超时已到,一系列的I/O操作完成23L 数据错误16L 目录不能删除1065L 指定的数据库不存在1425L 传递给ReleaseDC的无效HDC1051L 终止控制已送到其他独立运行服务的服务中1435L 不能破坏其他线程产生的对象55L 指定的网络资源不再有效1202L 试图记住先前记住的设备2404L 设备由激活的进程在使用,不能断开连接1107L 当装载磁带时,找不到磁带的分区信息145L 目录非空144L 目录不是根目录的子目录130L 试图使用文件句柄来打开磁盘操作267L 目录名无效157L 段已丢失,不能锁定107L 由于没有插入交换磁盘,程序终止1393L 磁盘结构损坏,不能在读取112L 磁盘上没有足够的空间1127L 即使重试,存取硬盘也失败1126L 在存取硬盘时,即使重试,存取校准操作也失败1128L 即使磁盘控制器重新设置,存取硬盘也失败1114L DLL初始化例程失败1356L 指定的域已存在1357L 在该版本中试图超出每个服务器域的限制1810L 指定域的名字或安全ID与该域的受托信息不一致108L 磁盘在使用或被其他进程锁定1221L 工作族或域名已被网络上的其他计算机使用52L 网络上存在重名1078L 名字已在作服务器名或服务显示名使用196L 操作系统不能运行这一应用程序994L 对EA的存取非法276L 在安装文件系统上的EA文件被损坏255L EA不一致277L 在安装文件系统的EA文件上的EA表用完275L EA不适合在缓冲区中282L 安装文件系统不支持扩展属性1100L 在操作中出现磁带尾部标志203L 系统不能找到输入的环境选项1129L 遇到磁带的物理尾部1501L 没有打开的日志文件事件,因此事件登录服务没有启动1503L 在读取之间事件日志文件已改变1500L Eventlog登录文件之一破坏1064L 在处理控制请求时出现意外101L 专门信号被其他进程所拥有192L 操作系统不能运行%11208L 出现扩展错误83L INT24失败1063L 服务进程不能连接到服务控制器1392L 文件或目录被损坏,不能在读取80L 文件存在1006L 文件卷已变化,因此打开的文件不再有效2L 系统不能找到指定的文件1101L 磁带存取达到文件标志206L 文件名或后缀太长1125L 软盘控制器返回与登记不一致的结果1122L 在软盘上没有找到ID地址标志1123L 软盘扇区ID域与软盘控制器道地址不匹配1124L 软盘控制器报告出现不能由软驱识别的错误1007L 请求的操作在全屏幕模式不能执行31L 连接到系统上的设备不正常1360L 通配存取类型包含在存取屏蔽中1429L 该异常分支只能为全局设置1318L 指定的组已存在39L 磁盘满38L 到达文件末1428L 没有模块处理,不能设置非局部的异常处理1431L 异常分支没有安装1409L 热键已登记1419L 热键没有登记1441L 所有的DeferWindowsPosHWND必须具有相同的父1324L 在更新口令时,该返回状态表示新口令中包含不允许的值202L 操作系统不能运行%1122L 传递给系统调用的数据区太小1358L 由于灾难性的介质错误或磁盘数据结构破坏引起请求的操作不能完成1383L LSA数据库内部不一致1359L SAM遇到内部数据库不一致的错误,可防止SAM的进一步操作1800L 指定的优先级无效1448L 滚动条范围大于0x7FFF1338L 安全描述符结构无效198L 操作系统不能运行%1180L 系统检测到不正确的段号1799L 指定的分隔符文件无效1352L SAM服务器状态错误,不能完成期望的操作1057L 帐号名无效或不存在1052L 对该服务请求的控制无效1071L 指定的服务数据锁定无效1213L 指定的服务名格式无效1215L 指定的共享名格式不正确1449L SHOWWINDOWS命令无效1337L SID结构无效209L 公布的信号不正确1439L 参数无效189L 操作系统不能运行%1188L 操作系统不能运行%11335L 子权限值无效114L 目标内部文件标识符不正确1444L 线程ID无效1784L 提供的用户缓冲区对请求操作失效118L 写后验证开关参数值不正确1400L 窗口处理无效1329L 用户帐号限制,不能从源工作站登录1117L 由于I/O设备错误,请求不能完成996L 重叠的IO时间不在发信号状态997L 重叠的IO操作在处理中197L 操作系统当前不能配置来运行应用程序1119L 不能打开与其它设备共享IRQ的设备,至少有一使用该IRQ的其他设备已打开147L 没有足够的可用资源来处理这一命令133L 由于驱动器已包含连接,JOIN或SUBST命令不能使用134L 试图在已连接的驱动器上使用JOIN或SUBST命令146L 指定的路径正在用替换149L 试图替代先前已替代的驱动器目录135L 试图在已替代的驱动器上使用JOIN或SUBST命令194L 操作系统不能运行%1138L 系统试图替代已替代的目录140L 系统试图替代已替代的目录1430L 日常异常处理已安装1018L 在有删除标志的登记键上非法操作1020L 试图在已有子键或值的登记键建立符号连接154L 输入的卷标超过11个字符的限制,前11个字符写在磁盘上,其余字符自动删除1322L 请求的操作被禁止或删除最新的其余管理员帐号1434L 该列表框不支持制表符1416L 列表符ID没有找到1390L 试图修改用户口令,但没有提供要求的LM口令1303L 联接局部RPC,要求用户话路密钥167L 试图锁定文件失败的区域33L 由于其他进程已锁定部分文件,该文件不能被进程存取212L 端锁定,因此不能重新分配1502L 事件登录文件已满1326L 由于用户名或验证信息不正确,试图登录无效1380L 请求登录的类型(如网络,服务等)没有被目标系统授权1366L 登录话路ID已在使用1363L 试图启动新的话路管理程序或用已在使用的LSA登录话路1385L 请求登录的类型(如网络,服务等)没有授权1334L 没有更多可分配的LUID164L 在系统中不能生成更多的线程1110L 驱动器中的介质已改变1378L 指定的帐号名不是别名的成员1320L 指定的用户帐号已在指定的组帐号中或由于组中有成员,不能删除1377L 指定的帐号名不是别名的成员1321L 指定的用户帐号不是指定组帐号的成员1374L 由于组是基本组,因此成员不能从该组中删除208L 取决文件名符号*或?输入不正确或指定的全局文件符号更多126L 不能找到指定的模块234L 需要更多的数据1120L 一系列的I/O操作被其他写到串口的操作完成317L 系统不能找到消息号为0x%1的消息131L 试图在超出文件头的位置移动文件指针215L 不能嵌套调用LoadModule1792L 试图登录,但网络登录服务没有启动88L 网络写失败64L 指定的网络名不再有效65L 网络存取非法54L 网络在忙6118L 该工作组的服务器列表当前不可用232L 管道在进程中关闭1104L 在磁带存取中,到达数据标志尾部1309L 试图由当前不在模拟客户的线程上操作模拟符号1391L ACL不包含可继承的组件1019L 系统不能分配记录文件要求的空间1807L 使用的帐号在内域受托帐号中,使用正常的帐号或远程用户帐号来存取该服务器1809L 使用的帐号在服务器受托帐号中,使用正常的帐号或远程用户帐号来存取该服务器1311L 当前没有可用的登录服务器来服务登录请求1808L 使用的帐号在工作站受托帐号中,使用正常的帐号或远程用户帐号来存取该服务器1112L 由于驱动器中没有介质,磁带查询失败18L 没有更多的文件259L 没有更多的可用数据113L 没有更多的可用内部文件标识符1203L 没有网络提供者接收给定的路径2138L 没有网络或网络未启动89L 此时系统不能启动另一进程1302L 对该帐号没有指定限额1447L 窗口不能有滚动条1350L 试图对没有安全性的对象操作1116L 由于没有关机在处理中,试图放弃关机失败205L 在命令子树中没有进程有信号句柄62L 在服务器上存储等待打印文件的空间不足1376L 指定的别名不存在1355L 指定的域不存在1319L 指定的组不存在1312L 指定的登录话路不存在,可能已终止1387L 不存在的新成员不能添加到别名中1364L 指定的验证包未知1313L 指定的特权不存在1317L 指定的用户不存在1437L 窗口不能具有系统菜单1008L 试图引用不存在的符号1786L 工作站没有受托秘密1787L 域控制器对该工作站没有帐号1113L 对目标多字节代码页存在的Unicode字符没有映射1394L 对指定的登录话路没有用户话路密钥125L 磁盘没有卷标1417L 没有找到通配符998L 对内存位置的无效存取1445L 用非MDI子窗口调用DefMDIChildProc1332L 映射的信息没有转变1300L 不是所有权限赋给调用者1442L 窗口不是子窗口2250L 网络连接不存在1207L 不能枚举非容器26L 指定的磁盘不能存取8L 没有足够的空间处理该命令1130L 没有足够的空间处理该命令服务器136L 系统试图删除没有连接的驱动器158L 段已锁定1362L 请求的动作只受登录进程的限制,调用进程没有登记为登录进程288L 试图释放不被调用者拥有的互斥法21L 驱动器没有准备好1017L 系统试图装载或恢复文件到登记中,但指定的文件格式不正确17L 系统不能将文件移动到不同的驱动器上137L 系统试图删除没有替代的驱动器50L 不支持网络请求1022L 改变请求正在完成,信息没有返回在调用者的缓冲区.调用者现在需要模拟文件,以找到所做的修改1386L 没有提供必要的NT交叉保密口令而试图以安全帐号管理员改变用户口令1304L WindowsNT的口令太复杂,无法将其转换为Windows的网络口令(该口令返回NULL字符串)110L 系统不能打开指定的设备或文件2401L 有打开文件或请求在连接期995L 由于线程退出或应用程序请求,I/O操作放弃28L 打印机没有纸84L 处理该请求没有足够的空间14L 处理该操作没有足够的空间1105L 磁带没有分区1330L 用户帐号的口令已到期1325L 在更新口令,该状态表示违反一些口令更新规则148L 指定的路径现在不能用3L 系统不能找到指定的路径231L 所有的管道实体在忙535L 在管道的另一端有进程536L 等待进程打开管道的另一端233L 在管道的另一端没有进程1446L 下拉式菜单已激活1131L 已检测到潜在的僵局条件63L 要打印的等待文件被删除1802L 打印机已存在1795L 指定的打印驱动程序已安装61L 打印队列已满。
基础知识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精典技艺问:如何让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⽂件或者.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标识段出现之前,下⾯的数据都是这个基地址。
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)你就可以⽆敌天下了。
分享一个Delphi制作的文档编辑器源代码(仿Word)
分享⼀个Delphi制作的⽂档编辑器源代码(仿Word)
功能挺多的,就是很多地⽅都没有完善。
不过简单使⽤,是没有问题的。
我也忘记是在哪个⽹站下载的,可能是Git国外的⽹站。
仿Word⽂档编辑器,不过其实没有必要的,因为⽤户会直接使⽤微软或者其他软件来制作⾃⼰的⽂档。
但是却具有参考价值,虽然代码需要优化的地⽅还有很多。
⽐如那些添加控件这些可以去除,把代码结构处理得紧凑⼀些,⽽且增加更多可以⾃定义的地⽅就更理想了。
其实⼤家最最讨厌都是⼀些滚动条和控件背景颜⾊都⽆法⾃定义,都被写得死死的,就像原来Vcl那些玩意⼀样。
想弄个⾃定义界⾯都办不到。
这套代码也是这样,所以需要⼤家⾃⼰改。
下⾯这个是我改的,多页功能,我去掉了,改成单页,跟RichEdit这种类型⼀样。
不过完全⽀持表格、图⽚、GIF图⽚这些添加,⽽且可以⾃定义编辑框背景图⽚的添加和更换。
这样⼀来,也算是解决了⼀直以来的⼼愿。
⾄少收集和管理各种⽂档资料更加⽅便了。
在这⾥提供原来代码的下载地址,原来的忘记了:
有兴趣的,⾃⼰下载看看,⾄于我改的就不提供了。
它⾥⾯带有作者的通讯⽅式,有兴趣可以联系交流。
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文件格式
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 修改源码编译Delphi是一种用于开发Windows应用程序的编程语言,它具有易学易用、高效稳定的特点。
在开发过程中,我们经常需要修改源码并重新编译程序,以满足特定的需求或修复bug。
本文将介绍如何使用Delphi修改源码并编译程序的步骤和注意事项。
我们需要打开Delphi集成开发环境(IDE)。
在IDE中,我们可以找到源码文件,这些文件通常以.pas作为扩展名。
源码文件包含了程序的逻辑代码,我们可以在这里进行修改。
在打开源码文件之前,我们需要确保已经安装了Delphi的开发环境,并且具备对源码文件的读写权限。
如果没有安装Delphi,可以从官方网站上下载并安装最新版本的Delphi开发环境。
一旦我们打开了源码文件,就可以开始进行修改。
根据需求,我们可以添加新的功能、修改现有功能或修复bug。
在修改之前,我们应该仔细阅读源码,了解程序的结构和逻辑。
在修改源码时,我们应该遵循一些编码规范。
例如,我们可以使用有意义的变量名和函数名,以增加代码的可读性。
此外,我们应该注释代码,解释每个函数或过程的作用和用法。
这样,其他开发人员在阅读我们的代码时就能更容易理解。
完成源码的修改后,我们需要重新编译程序。
在Delphi IDE中,我们可以点击“编译”按钮或通过菜单栏中的选项来进行编译。
编译过程将检查代码的语法和错误,并生成可执行文件。
在编译过程中,我们应该注意编译器的输出信息。
如果有错误或警告信息,我们应该及时修复。
有时,修改源码可能会导致其他部分的代码出现问题,这就需要我们仔细检查和调试程序。
一旦编译成功,我们就可以运行程序并测试修改的功能。
在测试过程中,我们应该尽可能地覆盖各种场景和输入,以确保程序的稳定性和正确性。
如果测试通过,我们可以将修改后的程序部署到生产环境中。
在部署之前,我们应该先备份原始程序,以防止意外情况发生。
然后,我们可以将新的可执行文件复制到目标系统,并进行必要的配置和测试。
delphi实现计算器源码-完整版
private{ Private declarations }protected// procedure CreateParams(var Params: TCreateParams);override; public{ Public declarations }end;TRightEdit = class(TEdit)protectedprocedure CreateParams(var Params : TCreateParams);override; end;typeoperator = (Emp,add,sub,mul,divid); //空、加、减、乘、除varFrmCounter: TFrmCounter;MyRightEdit: TRightEdit;operate: Operator = emp;operate1: Operator = emp; //记录上一次用户按下的运算符Pointed: Boolean = False; //是否输入小数点temp: string = '';tempnum: Real = 0.0;implementation{$R *.dfm}//重载TRightEdit的CreateParams自定义编辑框的一些样式procedure TRightEdit.CreateParams(var Params : TCreateParams); begininherited;Params.Style := params.Style + ES_Right;end;//创建窗体时初始化一些参数procedure TFrmCounter.FormCreate(Sender: TObject);beginMyRightEdit := TrightEdit.Create(nil);with MyRightEdit dobeginparent := panel1;text := '0.';MyRightEdit.Height := 100;Align := alTop;Enabled := False;ReadOnly := True;show;end;end;//清零的响应函数procedure TFrmCounter.SBClearClick(Sender: TObject);beginPointed := False;MyRightEdit.Text := '0.';TempNum := 0.0;Operate := emp;temp := '';end;//数字键输入响应函数procedure TFrmCounter.SpeedButton1Click(Sender: TObject);varStrWidth: Integer;beginif (temp = '')or(Operate <> emp) thenTempNum := StrToFloat(MyRightEdit.Text);if Operate <> emp thenMyRightEdit.Text := '0.';Temp := Trim(MyRightEdit.Text);StrWidth := Length(temp);if Sender is TSpeedButton thenbeginif Operate <> emp thenbeginMyRightEdit.Text := '0.';Operate := emp;end;if Pointed = False thenbeginif StrToFloat(MyRightEdit.Text) = 0 thenMyRightEdit.Text := FloatToStr(StrToFloat(MyRightEdit.Text)+StrToInt(TSpeedButton(Sender).Caption))+'.'else beginInsert(Trim(TspeedButton(Sender).Caption),temp,StrWidth);MyRightEdit.Text := temp;end;endelse beginInsert(Trim(TSpeedButton(Sender).Caption),temp,StrWidth+1);MyRightEdit.Text := temp;end;end;end;//正负符号响应函数procedure TFrmCounter.SpeedButton13Click(Sender: TObject);beginif Operate <> emp thenbeginTempNum := StrToFloat(MyRightEdit.Text);MyRightEdit.Text := '0.';Operate := emp;end;if StrToFloat(MyRightEdit.Text) > 0 thenbeginMyRightEdit.Text := FloatToStr(-StrToFloat(MyRightEdit.Text));if Pos('.',Trim(MyRightEdit.Text))=0 thenMyRightEdit.Text := FloatToStr(StrToFloat(MyRightEdit.Text))+'.'; endelse if StrToFloat(MyRightEdit.Text)<0 thenbeginMyRightEdit.Text := FloatToStr(abs(StrToFloat(MyRightEdit.Text)));if Pos('.',Trim(MyRightEdit.Text))=0 thenMyRightEdit.Text := FloatToStr(StrToFloat(MyRightEdit.Text))+'.'; end;end;//小数点的输入procedure TFrmCounter.SpeedButton14Click(Sender: TObject);beginif Operate <> emp thenbeginOperate := emp;MyRightEdit.Text := '0';end;if Pointed = True thenBeepelsePointed := True;end;//显示运算结果procedure TFrmCounter.SpeedButton19Click(Sender: TObject);beginif (Operate = emp)and(Trim(temp)<>'') thenbegincase Operate1 ofadd: beginMyRightEdit.Text := FloatToStr(StrToFloat(MyRightEdit.Text)+TempNum);end;sub: beginMyRightEdit.Text := FloatToStr(TempNum-StrToFloat(MyRightEdit.Text));end;mul: beginMyRightEdit.Text := FloatToStr(TempNum*StrToFloat(MyRightEdit.Text));end;divid: beginif StrToFloat(MyRightEdit.Text)<>0 thenMyRightEdit.Text := FloatToStr(TempNum/StrToFloat(MyRightEdit.Text))elseApplication.MessageBox('除数不能为零。
HEX文件下载细节
看一下驱动是如何处理 IOCTL_EZUSB_ANCHOR_DOWNLOAD 的,驱动很简单,
irpStack = IoGetCurrentIrpStackLocation (Irp);
ioBuffer
= Irp->AssociatedIrp.SystemBuffer;
inputBufferLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
struct TMemImg {
CHAR data[TGT_IMG_SIZE]; //target image ห้องสมุดไป่ตู้tore };
struct TMemCache
{
TMemImg *pImg;
//pointer to image
int
nSeg;
//segment count
MemSeg pSeg[ TGT_IMG_SIZE/TGT_SEG_SIZE ]; //info about segments
while(EP0CS & bmEPBUSY);
bc = EP0BCL; // Get the new bytecount
// Is this a RAM download ? if(SETUPDAT[1] == VR_RAM) {
for(i=0; i<bc; i++) *((BYTE xdata *)addr+i) = *(EP0BUF+i);
USB 固件的处理
addr = SETUPDAT[2];
// Get address and length
addr |= SETUPDAT[3] << 8;
曾经用Delphi写的一个上位机
曾经⽤Delphi写的⼀个上位机基于SPCOMM控件。
源码:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, SPComm, ExtCtrls;typeTForm1 = class(TForm)Comm1: TComm;GroupBox1: TGroupBox;go: TButton;left: TButton;right: TButton;back: TButton;left30: TButton;right30: TButton;yuan90: TButton;yuan360: TButton;GroupBox2: TGroupBox;Label5: TLabel;Label6: TLabel;Label7: TLabel;Memo4: TMemo;Memo5: TMemo;Memo6: TMemo;GroupBox3: TGroupBox;opencom: TButton;lianjie: TButton;xinxi: TMemo;procedure SendHex(S: String);procedure left30Click(Sender: TObject);procedure opencomClick(Sender: TObject);procedure goClick(Sender: TObject);procedure backClick(Sender: TObject);procedure CommReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);procedure leftClick(Sender: TObject);procedure rightClick(Sender: TObject);procedure w(Sender: TObject; var Key: Word; Shift: TShiftState);procedure FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);procedure FormKeyUp(Sender: TObject; var Key: Word;Shift: TShiftState);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;BUF: string;implementation{$R *.dfm}function StrToHex(mStr:String;stlen:word):string;varI:Integer;Result:='';for I := 1 to stlen dobeginif mstr[i]=#0 thenResult:=Result+'00 'elseResult:=Result+IntToHex(Ord(mStr[I]),2)+' ';end;end;procedure TForm1.SendHex(S: String);vars2:string;buf1:array[0..50000] of char;i:integer;begins2:='';for i:=1 to length(s) dobeginif ((copy(s,i,1)>='0') and (copy(s,i,1)<='9'))or((copy(s,i,1)>='a') and (copy(s,i,1)<='f')) or((copy(s,i,1)>='A') and (copy(s,i,1)<='F')) thenbegins2:=s2+copy(s,i,1);end;end;for i:=0 to (length(s2) div 2-1) dobuf1[i]:=char(strtoint('$'+copy(s2,i*2+1,2)));Comm1.WriteCommData(buf1,(length(s2) div 2));end;procedure TForm1.left30Click(Sender: TObject);beginSendHex('aa'); //发送⼗六进制end;procedure TForm1.opencomClick(Sender: TObject);beginbuf:='0';SendHex(buf);if opencom.Caption = '打开端⼝' thenbeginComm1.StartComm;opencom.Caption := '关闭端⼝';endelse //if Button1.Caption = '关闭串⼝' thenbeginComm1.StopComm;opencom.Caption := '打开端⼝';end;end;procedure TForm1.goClick(Sender: TObject);beginbuf:='11';SendHex(buf);end;procedure TForm1.backClick(Sender: TObject);beginbuf:='12';SendHex(buf);procedure TForm1.leftClick(Sender: TObject);beginbuf:='14';SendHex(buf);end;procedure TForm1.rightClick(Sender: TObject);beginbuf:='13';SendHex(buf);end;procedure mReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);varstrRecv : string;beginsetLength(strRecv,BufferLength);Move(Buffer^,pchar(strRecv)^,BufferLength);xinxi.Lines.Add('已收到:'+intTostr(BufferLength)+'字节的数据');xinxi.Lines.Add(strRecv);xinxi.Invalidate ;end;procedure TForm1.w(Sender: TObject; var Key: Word; Shift: TShiftState); beginbuf:='11';SendHex(buf);end;procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);beginif Key=87 thenbuf:='11';SendHex(buf);if Key=83 thenbuf:='12';SendHex(buf);if Key=68 thenbuf:='13';SendHex(buf);if Key=65 thenbuf:='14';SendHex(buf);end;procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;Shift: TShiftState);beginif Key=87 thenSendHex('ff');if Key=65 thenSendHex('ff');if Key=68 thenSendHex('ff');if Key=83 thenSendHex('ff');end;end.。
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。
delphi 十六进制异或运算
delphi 十六进制异或运算Delphi 十六进制异或运算引言:在计算机编程中,异或运算是一种常用的逻辑运算符。
它可以用于加密、校验和计算、数据处理等多个领域。
本文将介绍Delphi中的十六进制异或运算,并提供一些实例来帮助读者更好地理解和应用这一运算。
一、概述十六进制异或运算是指对两个十六进制数进行位异或操作。
异或运算的规则是:对应位相同为0,不同为1。
在Delphi中,我们可以使用XOR函数来执行这一运算。
二、Delphi中的十六进制异或运算在Delphi中,我们可以使用XOR函数来执行十六进制异或运算。
该函数接受两个参数,分别是待运算的十六进制数。
下面是一个示例代码:```delphifunction HexXOR(hex1, hex2: string): string;varint1, int2, result: Integer;beginint1 := StrToInt('$' + hex1);int2 := StrToInt('$' + hex2);result := int1 xor int2;Result := IntToHex(result, 2);end;```在上面的代码中,我们定义了一个HexXOR函数,该函数接受两个十六进制数作为输入,并返回它们的异或结果。
首先,我们使用StrToInt函数将十六进制字符串转换为整数,然后使用xor运算符执行异或运算,最后使用IntToHex函数将结果转换回十六进制字符串。
这样,我们就可以方便地在Delphi中进行十六进制异或运算了。
三、实例应用十六进制异或运算在实际应用中有着广泛的用途。
下面是一些常见的应用场景:1. 数据加密十六进制异或运算可以用于数据加密。
通过对明文和密钥进行异或运算,可以得到密文。
只有拥有相同密钥的人才能正确解密。
这种加密算法简单高效,被广泛应用于网络传输、文件加密等领域。
2. 校验和计算十六进制异或运算可以用于校验和的计算。
单片机烧录文件HEX文件格式说明
HEX文件格式说明在我讲解《微型计算机控制技术》的时候,一个学生问我关于HEX的内容解释时,我的解释不够清晰,感觉不太,我下课后立刻上网查找收集资料,并且整理如下,同时发给学生一份。
整理如下:概念描述HEX文件格式是一种能够烧写到单片机中,被单片机执行的文件格式。
可以使用不同的编辑器将C 或汇编源文件编译成HEX文件,如IAR,KEIL等。
Hex文件是遵循Hex文件格式的ASCII文本文件。
在Hex文件的每一行中都包含了一个hex记录。
这些记录是由一些代表机器语言代码和常量的16进制数据组成。
Hex文件常用来传输要存储在ROM、EPROM或者Flash中的程序和数据。
大部分的EPROM编程器都能使用Hex文件。
格式介绍Hex由任意数量的十六进制记录组成。
每个记录包含6个域,它们按下列格式排列。
| MARK | RECLEN | OFFSET | RECTYP | DA TA | CHKSUM |,实际表示如下例1::04010C00303230005D用以下表1解释上述格式:1Byte(8 bit)用表 1 HEX格式组成| MARK |——(1Byte)Start Code(冒号):每个HEX记录都由冒号开头;| RECLEN |——(1Byte)Byte count(本行数据长度):是数据长度域,它代表记录中数据的字节量,如例1中的04表示本条记录中有4个字节的数据;| OFFSET |——(2 Byte)Address(本行数据的起始地址):是地址域,它代表记录当中数据的起始地址;如例1中的010C表示本条记录中第一个数据30的地址为010C。
| RECTYP |-----> (1 Byte)Record type(数据类型):是代表HEX记录类型的域,它可能是以下数据当中的一个:例子中的00表示该行为数据记录。
表 2 数据类型对照表| DATA |——(n Byte)Data(数据):是数据域,一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域中指定的数字相符;最多0xFF个。
十六进制字符串转换成十进制数值 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文件
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”。
Delphi进制转换(二进制十进制十六进制)
Delphi进制转换(⼆进制⼗进制⼗六进制)Delphi进制转换(⼆进制/⼗进制/⼗六进制) 2009-11-27 11:42:24| 分类:计算机知识 | 标签: |字号⼤中⼩订阅 . Delphi进制转换(⼆进制/⼗进制/⼗六进制)2008-08-29 10:24⼀、完全⽤API完成:es Windows;function IntToStr(I: integer): string;beginStr(I, Result);end;function StrToInt(S: string): integer;beginVal(S, Result, Result);end;function HexToInt(Const HexValue: String) : Integer;beginVal('$'+HexValue, Result, Result);end;function IntToHex(Const Value: Integer): string;constHexChars: array[0..15] of Char = '0123456789ABCDEF';variTemp: Integer;i: Integer;beginResult := '';i := 0;while i<4 dobegincase i of0: iTemp := Value shr 24 and $FF;1: iTemp := Value shr 16 and $FF;2: iTemp := Value shr 8 and $FF;3: iTemp := Value and $FF;end;Result := Result + HexChars[iTemp div 16];Result := Result + HexChars[iTemp mod 16];Inc(i);end;function LowerCase(const S: string): String;beginResult:=CharLower(Pchar(S));end;function UpperCase(const S: string): String;beginResult:=CharUpper(Pchar(S));end;⼆、函数实现//⼗进制 to ⼆进制function IntToBin(Value: LongInt;Size: Integer): String; vari: Integer;beginResult:='';for i:=Size-1 downto 0 do beginif Value and (1 shl i)<>0 then beginResult:=Result+'1';end else beginResult:=Result+'0';end;end;end;//⼆进制 to ⼗进制function BintoInt(Value: String): LongInt;vari,Size: Integer;beginResult:=0;Size:=Length(Value);for i:=Size downto 1 dobeginif Copy(Value,i,1)='1' thenResult:=Result+(1 shl (Size-i));end;end;function floatBintoInt(Value: String): real;i,Size: Integer;beginResult:=0;Size:=Length(Value);for i:=Size downto 1 dobeginif Copy(Value,i,1)='1' thenResult:=Result+1/(1 shl i);end;end;//⼗六进制 to ⼆进制function HextoBinary(Hex:string):string; constBOX: array [0..15] of string =('0000','0001','0010','0011','0100','0101','0110','0111','1000','1001','1010','1011','1100','1101','1110','1111');vari:integer;beginfor i:=Length(Hex) downto 1 doResult:=BOX[StrToInt('$'+Hex[i])]+Result; end;//⼗六进制 to ⼗进制浮点型function HextoFloat(s:string):real;var b,temp:string;e:integer;f:real;beginb:=HextoBinary(s);temp := copy(b,2,8);e:=BintoInt(temp)-127;temp := copy(b,10,23);f := 1+floatBintoInt(temp);if(copy(b,1,1)='0')thenresult := power(2,e)*felseresult :=-power(2,e)*f; end;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
按照上面的数据行格式分析如下:
<0x3a> [数据长度 1Byte] [数据地址 2Byte] [数据类型 1Byte]
10 00 00
00
[数据 nByte] [校验 1Byte]
<0x0d> <0x0a>
18F09FE518F09FE518F09FE518F09FE5 C0
每行中的数据并不是一定有的,第二个字节数据长度为 0,那么这行就没 有数据。
++len; fgetc(myFile); } rewind(myFile); //因为是每两个字符表示一个字节,所以最大的数据个数要少于文件字符个数 的一半
outBuf = (BYTE*)malloc(len/2); memset(outBuf,0xff,len/2); while (!feof(myFile)) {
//将两个字符转化为一个字节量 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')
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) {
End of File Record 行是每一个 HEX 文件的最后一行。例如: :00000001FF 这样的一行数据内容是固定的,数据长度为 0,地址为 0。
校验值:每一行的最后一个值为此行数据的校验和。例如:
:1000000018F09FE518F09FE518F09FE518F09FE5C0 这行中的 0xC0
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; }
scanf_s("%s",fileName); printf("\n"); if (fopen_s(&myFile,fileName,"r") != 0) {
printf("打开文件%s 失败!",fileName); } //将文件长度计算出来用于申请存储数据的缓冲区 while (!feof(myFile)) {
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D
第一行,是 Extended Linear Address Record,里面的数据,也就是基地址 是 0x0004,第二行是 Data Record,里面的地址值是 0x0000。那么数据 18F09FE518F09FE518F09FE518F09FE5 要写入 FLASH 中的地址为 (0x0004 << 16) | 0x0000,也就是写入 FLASH 的 0x40000 这个地址。同样,第三行的数据 的写入地址为 0x40010。当一个 HEX 文件的数据超过 64k 的时候,文件中就会 出现多个 Extended Linear Address Record。
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
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) {
具体程序如下,该程序在 VC2005 下采用控制台项目编译,需要在 release 下 编译,在 debug 模式中会提示一个 dll 文件无法找到,这可能是 VC 自身的错 误。 // hextobin.cpp : 定义控制台应用程序的入口点。 //
#i nclude "stdafx.h" #i nclude <malloc.h> #i nclude <memory.h> typedef unsigned char BYTE;
以上的信息其实就足够进行 HEX 转 BIN 格式的程序的编写。首先我们只处理 数据类型为 0x00 及 0x01 的情况。0x02 表示对应的存储地址超过了 64K不处理,0x04 也是如此。
我的编程思路是从文件中一个一个读出字符,根据“:”判断一行的开始,然后 每两个字符转换成一个字节,并解释其对应的意义。然后将数据从该行中剥离出来 保存到缓冲区中,并最终输出到文件中。
*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 格式文件名:");
然后,接着 0x04 后面的两个 0x00 0x00 就是数据。最后一个 0xFA 是校验码。
HEX 文件的每一行都是这样的格式:
<0x3a> [数据长度 1Byte] [数据地址 2Byte] [数据类型 1Byte]
[数据 nByte] [校验 1Byte]
<0x0d> <0x0a>
在例如:
:1000000018F09FE518F09FE518F09FE518F09FE5C0
:020000040000FA , 我把它看做 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
//:号表示一行的开始 if (fgetc(myFile) == ':') {
//一行的头两个字符表示该行包含的数据长度 data[0] = fgetc(myFile); data[1] = fgetc(myFile); CharToByte(data,&dataLen); //一行的第、个字符表示数据存储起始地址的高位 data[0] = fgetc(myFile); data[1] = fgetc(myFile);