日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基础知识 | hex文件格式详解

發布時間:2023/12/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基础知识 | hex文件格式详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

hex文件格式總結

  • 什么是hex文件?

  • 文件格式

  • 指令類型(Record type)

  • 校驗和

    • :04 02B0 00 92020008 AE

    • :04 0000 05 08000135 B9

    • :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文件,然后再進行燒錄;

:020000040800F2 :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;

  • 起始碼:每行數據作為一幀,并由:作為起始碼;

  • 字節長度:兩個十六進制數字(一對十六進制數字),指示數據字段中的字節數(十六進制數字對)。最大字節數為255(0xFF)。16(0x10)和32(0x20)是常用的字節數;

  • 地址:四個十六進制數字,代表數據的16位起始存儲器地址偏移量。數據的物理地址是通過將此偏移量添加到先前建立的基地址來計算的,因此允許內存尋址超過16位地址的64 KB限制。基地址默認為零,可以通過各種類型的記錄進行更改?;刂泛偷刂菲屏渴冀K表示為大端值。

  • 指令類型:兩個十六進制數字00到05,定義了這行數據的具體含義;

  • 數據:n字節數據序列,由2個n十六進制數字表示;

  • 校驗碼:(兩個十六進制數字),可以用來驗證記錄沒有錯誤的計算值;

指令類型(Record type)

Record type的值一般是00~05,這表示了,當前這行hex格式的數據,所代表的含義:

Hex codeRecord typeDescriptionExample
00數據包含數據和該數據的16位起始地址。字節計數指定記錄中的數據字節數。右側顯示的示例為0B (十一)個數據字節(61, 64, 64, 72, 65, 73, 73, 20, 67, 61, 70)位于以地址開頭的連續地址 0010。:0B0010006164647265737320676170A7
01文件結束每個文件在文件的最后一行必須恰好發生一次。數據字段為空(因此字節數為00),并且地址字段通常為 0000。:00000001FF
02擴展段地址數據字段包含一個16位的段基址(因此字節數始終為02)與80x86實模式尋址兼容。地址字段(通常為0000)被忽略。最近的段地址02記錄乘以16,然后加到每個后續數據記錄地址,以形成數據的物理起始地址。這允許尋址多達1 MB的地址空間。:020000021200EA
03起始段地址對于80x86處理器,請指定CS:IP寄存器的初始內容(即起始執行地址)。地址字段是0000,字節數始終為04,前兩個數據字節是CS值,后兩個是IP值。:0400000300003800C1
04擴展線性地址允許32位尋址(最大4GiB)。記錄的地址字段將被忽略(通常是0000),其字節數始終為02。兩個數據字節(大字節序)為所有后續類型指定32位絕對地址的高16位00記錄; 這些高位地址位適用于下一個04記錄。類型的絕對地址00 通過組合最近的高16位地址位形成記錄 04 用低16位的地址記錄 00記錄。如果是類型00 記錄之前沒有任何類型 04 記錄,然后其高16位地址位默認為0000。:02000004FFFFFC
05起始線性地址地址字段是 0000(未使用),字節數始終為04。四個數據字節代表一個32位地址值(big-endian)。對于80386和更高版本的CPU,此地址將加載到EIP寄存器中。:0400000508000135B9

校驗和

最后一個字節表示除了起始碼之后,其余字節的校驗和,其計算方式,下面簡單介紹一下,這里為更加直觀 對之前的hex做了一些簡單處理,便于后面分析:

:02?0000?04?0800?F2 :10?0000?00?00040020490100089901000895010008?3A :10?0010?00?97010008910100088102000800000000?1B :10?0020?00?0000000000000000000000009D010008?2A :10?0030?00?93010008000000009B01000829020008?4D :10?0040?00?63010008630100086301000863010008?00 :10?0050?00?63010008630100086301000863010008?F0 :10?0060?00?63010008630100086301000863010008?E0 :10?0070?00?63010008630100086301000863010008?D0 :10?0080?00?63010008630100086301000800000000?2C :10?0090?00?00000000000000000000000063010008?F4 :10?00A0?00?63010008630100086301000863010008?A0 :10?00B0?00?63010008630100086301000863010008?90 :10?00C0?00?63010008630100086301000863010008?80 :10?00D0?00?63010008630100086301000863010008?70 :10?00E0?00?63010008630100086301000863010008?60 :10?00F0?00?63010008630100080000000000000000?28 :10?0100?00?00000000000000006301000863010008?17 :10?0110?00?63010008630100086301000863010008?2F :10?0120?00?63010008630100086301000863010008?1F :10?0130?00?63010008DFF80CD000F018F800480047?11 :10?0140?00?A1020008000400200648804706480047?36 :10?0150?00?FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7?77 :10?0160?00?FEE7FEE72D02000835010008064C074D?AA :10?0170?00?06E0E06840F0010394E8070098471034?77 :10?0180?00?AC42F6D3FFF7DAFFA4020008B4020008?7D :10?0190?00?FEE77047FEE7FEE77047704770470000?D4 :10?01A0?00?0CB500211F4801910091026842F48032?91 :10?01B0?00?02604FF4A063026802F400320092019A?D8 :10?01C0?00?521C0192009A12B9019A9A42F3D10268?24 :10?01D0?00?920324D5012100914168416041684160?4A :10?01E0?00?41684160416821F47C114160416841F4?FB :10?01F0?00?98114160016841F08071016001688901?D6 :10?0200?00?FCD5416821F003014160416841F00201?E1 :10?0210?00?41604168C1F381010229FAD10CBD0091?0E :10?0220?00?0CBD00000010024070470000104810B5?DF :10?0230?00?016841F00101016041680E4A11404160?CE :10?0240?00?01680D4A11400160016821F480210160?BC :10?0250?00?416821F4FE0141604FF41F0181600021?DB :10?0260?00?C162FFF79DFF05494FF00060086010BD?B7 :10?0270?00?001002400000FFF8FFFFF6FE08ED00E0?6E :10?0280?00?FEE702E008C8121F08C1002AFAD17047?31 :10?0290?00?7047002001E001C1121F002AFBD17047?06 :10?02A0?00?FEE70000B40200080000002000040000?87 :04?02B0?00?92020008?AE :04?0000?05?08000135?B9 :00?0000?01?FF

這里取最后三條指令,做一下檢查;

:04?02B0?00?92020008?AE :04?0000?05?08000135?B9 :00?0000?01?FF

:04 02B0 00 92020008 AE

0x04 + 0x02 + 0xB0 + 0x92 + 0x02 + 0x08 = 0x152 ~0x52 + 1 = 0xAE

~按位取反

:04 0000 05 08000135 B9

0x04 + 0x05 + 0x80 + 0x01 + 0x35 = 0X47 ~0x47 + 1 = 0XB9

~按位取反

:00 0000 01 FF

~0x01 + 1 = 0xFF

~按位取反

hex轉bin文件

資深調包俠找到一個可以使用的包;

pip?install?intelhex Per?example,?converting?content?of?foo.hex?to?foo.bin?addresses?from?0?to?FF:$?python?hex2bin.py?-r?0000:00FF?foo.hex Or?(equivalent):$?python?hex2bin.py?-r?0000:?-s?256?foo.hex

坐電梯到GitHub

https://github.com/python-intelhex/intelhex

長按下圖二維碼關注,獨自前進,走得快;結伴而行,走得遠;在這里除了肝出來的文章,還有一步一個腳印學習的點點滴滴;

總結

以上是生活随笔為你收集整理的基础知识 | hex文件格式详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。