• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            山寨:不是最好的,是最適合我們的!歡迎體驗山寨 中文版MSDN

            Blog @ Blog

            當華美的葉片落盡,生命的脈絡才歷歷可見。 -- 聶魯達

            常用鏈接

            統計

            積分與排名

            BBS

            Blog

            Web

            最新評論

            hex格式介紹及轉bin格式的源程序

            Intel HEX文件是記錄文本行的ASCII文本文件,在Intel HEX文件中,每一行是一個HEX記錄,由十六進制數組成的機器碼或者數據常量。Intel HEX文件經常被用于將程序或數據傳輸存儲到ROMEPROM,大多數編程器和模擬器使用Intel HEX文件。

                   很多編譯器的支持生成HEX格式的燒錄文件,尤其是Keil c。但是編程器能夠下載的往往是BIN格式,因此HEXBIN是每個編程器都必須支持的功能。

                   HEX格式文件以行為單位,每行由“:”(0x3a)開始,以回車鍵結束(0x0d,0x0a)。行內的數據都是由兩個字符表示一個16進制字節,比如01”就表示數0x010a,就表示0x0a。對于16位的地址,則高位在前低位在后,比如地址0x010a,在HEX格式文件中就表示為字符串010a。下面為HEX文件中的一行:

            :10000000FF0462FF051EFF0A93FF0572FF0A93FFBC

                   “:”表示一行的開始。

                   “:”后的第12個字符“10表示本行包含的數據的長度,這里就是0x1016個。

                   3456個字符“0000表示數據存儲的起始地址,這里表示從0x0000地址開始存儲16個數據,其中高位地址在前,低位地址在后。

                   78個字符“00表示數據的類型。該類型總共有以下幾種:

            00 ----數據記錄      
            01 ----
            文件結束記錄
            02 ----
            擴展段地址記錄
            04 ----
            擴展線性地址記錄

            這里就是0x00即為普通數據記錄。

            自后的32個字符就是本行包含的數據,每兩個字符表示一個字節數據,總共有16個字節數據跟行首的記錄的長度相一致。

            最后兩個字符表示校驗碼。

            每個HEX格式的最后一行都是固定為:

            :00000001FF

                   以上的信息其實就足夠進行HEXBIN格式的程序的編寫。首先我們只處理數據類型為0x000x01的情況。0x02表示對應的存儲地址超過了64K,由于我的編程器只針對64K以下的單片機,因此在次不處理,0x04也是如此。

                   我的編程思路是從文件中一個一個讀出字符,根據“:”判斷一行的開始,然后每兩個字符轉換成一個字節,并解釋其對應的意義。然后將數據從該行中剝離出來保存到緩沖區中,并最終輸出到文件中。

                   具體程序如下,該程序在VC2005下采用控制臺項目編譯,需要在release下編譯,在debug模式中會提示一個dll文件無法找到,這可能是VC自身的錯誤。

            // hextobin.cpp : 定義控制臺應用程序的入口點。

            //

             

              1#include "stdafx.h"
              2
              3#include <malloc.h>
              4
              5#include <memory.h>
              6
              7typedef unsigned char BYTE;
              8
              9 
             10
             11//將兩個字符轉化為一個字節量
             12
             13void CharToByte(char* pChar,BYTE* pByte)
             14
             15{
             16
             17     char h,l;
             18
             19     h=pChar[0];//高位
             20
             21     l=pChar[1];//低位
             22
             23     if(l>='0'&&l<='9')
             24
             25         l=l-'0';
             26
             27     else if(l>='a' && l<='f')
             28
             29         l=l-'a'+0xa;
             30
             31     else if(l>='A' && l<='F')
             32
             33         l=l-'A'+0xa;
             34
             35     if(h>='0'&&h<='9')
             36
             37         h=h-'0';
             38
             39     else if(h>='a' && h<='f')
             40
             41         h=h-'a'+0xa;
             42
             43     else if(h>='A' &&<='F')
             44
             45         h=h-'A'+0xa;
             46
             47     *pByte=(BYTE)h*16+l;
             48
             49}

             50
             51 
             52
             53int _tmain(int argc, _TCHAR* argv[])
             54
             55{
             56
             57     char fileName[100];
             58
             59     char data[2];
             60
             61     BYTE *outBuf;
             62
             63     FILE *myFile;
             64
             65     int len;
             66
             67     int i;
             68
             69     BYTE adressHigh;
             70
             71     BYTE adressLow;
             72
             73     BYTE dataLen;
             74
             75     BYTE dataType; 
             76
             77     BYTE byteData;
             78
             79     int totalLen;
             80
             81     totalLen = 0;
             82
             83     len = 0;
             84
             85     adressHigh = 0;
             86
             87     adressLow = 0;
             88
             89     dataLen = 0;
             90
             91     dataType = 0;
             92
             93     printf("請輸入HEX格式文件名:");
             94
             95     scanf_s("%s",fileName);
             96
             97     printf("\n");
             98
             99     if (fopen_s(&myFile,fileName,"r"!= 0)
            100
            101     {
            102
            103         printf("打開文件%s失敗!",fileName);
            104
            105     }

            106
            107     //將文件長度計算出來用于申請存儲數據的緩沖區
            108
            109     while (!feof(myFile))
            110
            111     {
            112
            113         ++len;
            114
            115         fgetc(myFile);
            116
            117     }

            118
            119     rewind(myFile);
            120
            121     //因為是每兩個字符表示一個字節,所以最大的數據個數要少于文件字符個數的一半
            122
            123     outBuf = (BYTE*)malloc(len/2);
            124
            125     memset(outBuf,0xff,len/2);
            126
            127     while (!feof(myFile))
            128
            129     {
            130
            131         //:號表示一行的開始
            132
            133         if (fgetc(myFile) == ':')
            134
            135         {
            136
            137              //一行的頭兩個字符表示該行包含的數據長度
            138
            139              data[0= fgetc(myFile);
            140
            141              data[1= fgetc(myFile);
            142
            143              CharToByte(data,&dataLen);
            144
            145              //一行的第、個字符表示數據存儲起始地址的高位
            146
            147              data[0= fgetc(myFile);
            148
            149              data[1= fgetc(myFile);
            150
            151              CharToByte(data,&adressHigh);
            152
            153              //一行的第、個字符表示數據存儲起始地址的低位
            154
            155              data[0= fgetc(myFile);
            156
            157              data[1= fgetc(myFile);
            158
            159              CharToByte(data,&adressLow);
            160
            161              //一行的第、個字符表示數據類型
            162
            163              data[0= fgetc(myFile);
            164
            165              data[1= fgetc(myFile);
            166
            167              CharToByte(data,&dataType);
            168
            169              //當數據類型為時,表示本行包含的是普通數據記錄
            170
            171              if (dataType == 0x00)
            172
            173              {
            174
            175                   for (i=0;i<dataLen;i++)
            176
            177                   {
            178
            179                       data[0= fgetc(myFile);
            180
            181                       data[1= fgetc(myFile);
            182
            183                       CharToByte(data,&byteData);
            184
            185                       outBuf[adressHigh*256+adressLow+i] = byteData;
            186
            187                   }

            188
            189                   totalLen += dataLen;
            190
            191              }

            192
            193              //當數據類型為時,表示到了最后一行
            194
            195              if (dataType == 0x01)
            196
            197              {
            198
            199                   printf("文件結束記錄!");
            200
            201              }

            202
            203              //當數據類型為時,表示本行包含的是擴展段地址記錄
            204
            205              if (dataType == 0x02)
            206
            207              {
            208
            209                   printf("不支持擴展段地址記錄!");
            210
            211                   return 0;
            212
            213              }

            214
            215              //當數據類型為時,表示本行包含的是擴展線性地址記錄
            216
            217              if (dataType == 0x04)
            218
            219              {
            220
            221                   printf("不支持擴展線性地址記錄!");
            222
            223                   return 0;
            224
            225              }

            226
            227         }

            228
            229     }

            230
            231     fclose(myFile);
            232
            233     printf("請輸入保存的BIN格式文件名:");
            234
            235     scanf_s("%s",fileName);
            236
            237     if (fopen_s(&myFile,fileName,"w"!= 0)
            238
            239     {
            240
            241         printf("打開文件%s失敗!",fileName);
            242
            243     }

            244
            245     for (i=0;i<totalLen;i++)
            246
            247     {
            248
            249         fputc(outBuf[i],myFile);
            250
            251     }

            252
            253     return 0;
            254
            255}

            256

            posted on 2007-12-21 17:15 isabc 閱讀(5137) 評論(1)  編輯 收藏 引用 所屬分類: C++基礎

            評論

            # re: hex格式介紹及轉bin格式的源程序 2012-12-13 14:42

            很好,不過程序上有一點問題
            if (fopen_s(&myFile,fileName,"w") != 0)
            改成
            if (fopen_s(&myFile,fileName,"wb") != 0)
            我用bcb轉不行,用vs還是不行.  回復  更多評論   

            廣告信息(免費廣告聯系)

            中文版MSDN:
            歡迎體驗

            精品久久久久久综合日本| 97精品国产97久久久久久免费| 国产成人精品综合久久久| 大香伊人久久精品一区二区| 亚洲AV无码久久精品蜜桃| 91精品国产高清久久久久久91 | 久久无码AV一区二区三区| 久久99国产精品久久99小说| 久久精品水蜜桃av综合天堂| 亚州日韩精品专区久久久| 伊人久久精品无码二区麻豆| 久久国产精品二国产精品| 国产精品久久久久久影院| 国产精品99精品久久免费| 亚洲国产精品无码久久久不卡| 久久精品中文字幕久久| 亚洲精品乱码久久久久久蜜桃图片| 伊人久久精品无码二区麻豆| 国产精品一区二区久久精品涩爱| 久久亚洲精品中文字幕三区| 久久不射电影网| 99久久精品国产一区二区| 亚洲精品无码久久毛片| 国产A三级久久精品| 狠狠色婷婷久久一区二区三区| 久久国产精品77777| 国产成人无码精品久久久久免费 | 品成人欧美大片久久国产欧美| 亚洲天堂久久久| 久久66热人妻偷产精品9| 久久精品中文无码资源站| 久久亚洲2019中文字幕| 午夜不卡久久精品无码免费| 国产毛片久久久久久国产毛片 | 亚洲精品国产第一综合99久久| 久久国产乱子伦精品免费午夜| 久久精品国产精品亚洲艾草网美妙| 国产精品无码久久综合网| 亚洲欧美伊人久久综合一区二区 | 久久久精品一区二区三区| 亚洲精品99久久久久中文字幕|