• <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>

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

            Blog @ Blog

            當(dāng)華美的葉片落盡,生命的脈絡(luò)才歷歷可見。 -- 聶魯達(dá)

            常用鏈接

            統(tǒng)計(jì)

            積分與排名

            BBS

            Blog

            Web

            最新評(píng)論

            hex格式介紹及轉(zhuǎn)bin格式的源程序

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

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

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

            :10000000FF0462FF051EFF0A93FF0572FF0A93FFBC

                   “:”表示一行的開始。

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

                   3456個(gè)字符“0000表示數(shù)據(jù)存儲(chǔ)的起始地址,這里表示從0x0000地址開始存儲(chǔ)16個(gè)數(shù)據(jù),其中高位地址在前,低位地址在后。

                   78個(gè)字符“00表示數(shù)據(jù)的類型。該類型總共有以下幾種:

            00 ----數(shù)據(jù)記錄      
            01 ----
            文件結(jié)束記錄
            02 ----
            擴(kuò)展段地址記錄
            04 ----
            擴(kuò)展線性地址記錄

            這里就是0x00即為普通數(shù)據(jù)記錄。

            自后的32個(gè)字符就是本行包含的數(shù)據(jù),每兩個(gè)字符表示一個(gè)字節(jié)數(shù)據(jù),總共有16個(gè)字節(jié)數(shù)據(jù)跟行首的記錄的長度相一致。

            最后兩個(gè)字符表示校驗(yàn)碼。

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

            :00000001FF

                   以上的信息其實(shí)就足夠進(jìn)行HEX轉(zhuǎn)BIN格式的程序的編寫。首先我們只處理數(shù)據(jù)類型為0x000x01的情況。0x02表示對(duì)應(yīng)的存儲(chǔ)地址超過了64K,由于我的編程器只針對(duì)64K以下的單片機(jī),因此在次不處理,0x04也是如此。

                   我的編程思路是從文件中一個(gè)一個(gè)讀出字符,根據(jù)“:”判斷一行的開始,然后每兩個(gè)字符轉(zhuǎn)換成一個(gè)字節(jié),并解釋其對(duì)應(yīng)的意義。然后將數(shù)據(jù)從該行中剝離出來保存到緩沖區(qū)中,并最終輸出到文件中。

                   具體程序如下,該程序在VC2005下采用控制臺(tái)項(xiàng)目編譯,需要在release下編譯,在debug模式中會(huì)提示一個(gè)dll文件無法找到,這可能是VC自身的錯(cuò)誤。

            // hextobin.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。

            //

             

              1#include "stdafx.h"
              2
              3#include <malloc.h>
              4
              5#include <memory.h>
              6
              7typedef unsigned char BYTE;
              8
              9 
             10
             11//將兩個(gè)字符轉(zhuǎn)化為一個(gè)字節(jié)量
             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("請(qǐng)輸入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     //將文件長度計(jì)算出來用于申請(qǐng)存儲(chǔ)數(shù)據(jù)的緩沖區(qū)
            108
            109     while (!feof(myFile))
            110
            111     {
            112
            113         ++len;
            114
            115         fgetc(myFile);
            116
            117     }

            118
            119     rewind(myFile);
            120
            121     //因?yàn)槭敲績蓚€(gè)字符表示一個(gè)字節(jié),所以最大的數(shù)據(jù)個(gè)數(shù)要少于文件字符個(gè)數(shù)的一半
            122
            123     outBuf = (BYTE*)malloc(len/2);
            124
            125     memset(outBuf,0xff,len/2);
            126
            127     while (!feof(myFile))
            128
            129     {
            130
            131         //:號(hào)表示一行的開始
            132
            133         if (fgetc(myFile) == ':')
            134
            135         {
            136
            137              //一行的頭兩個(gè)字符表示該行包含的數(shù)據(jù)長度
            138
            139              data[0= fgetc(myFile);
            140
            141              data[1= fgetc(myFile);
            142
            143              CharToByte(data,&dataLen);
            144
            145              //一行的第、個(gè)字符表示數(shù)據(jù)存儲(chǔ)起始地址的高位
            146
            147              data[0= fgetc(myFile);
            148
            149              data[1= fgetc(myFile);
            150
            151              CharToByte(data,&adressHigh);
            152
            153              //一行的第、個(gè)字符表示數(shù)據(jù)存儲(chǔ)起始地址的低位
            154
            155              data[0= fgetc(myFile);
            156
            157              data[1= fgetc(myFile);
            158
            159              CharToByte(data,&adressLow);
            160
            161              //一行的第、個(gè)字符表示數(shù)據(jù)類型
            162
            163              data[0= fgetc(myFile);
            164
            165              data[1= fgetc(myFile);
            166
            167              CharToByte(data,&dataType);
            168
            169              //當(dāng)數(shù)據(jù)類型為時(shí),表示本行包含的是普通數(shù)據(jù)記錄
            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              //當(dāng)數(shù)據(jù)類型為時(shí),表示到了最后一行
            194
            195              if (dataType == 0x01)
            196
            197              {
            198
            199                   printf("文件結(jié)束記錄!");
            200
            201              }

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

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

            226
            227         }

            228
            229     }

            230
            231     fclose(myFile);
            232
            233     printf("請(qǐng)輸入保存的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 閱讀(5123) 評(píng)論(1)  編輯 收藏 引用 所屬分類: C++基礎(chǔ)

            評(píng)論

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

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

            廣告信息(免費(fèi)廣告聯(lián)系)

            中文版MSDN:
            歡迎體驗(yàn)

            久久精品国产亚洲AV无码麻豆| 精品国产一区二区三区久久| 2022年国产精品久久久久| 久久久久av无码免费网| 久久亚洲国产精品成人AV秋霞| 久久九九免费高清视频| 久久99精品国产麻豆婷婷| 久久精品国产黑森林| 午夜福利91久久福利| 久久天天躁狠狠躁夜夜2020一 | 精品久久一区二区| 狠狠久久综合| 亚洲精品乱码久久久久久按摩 | 久久中文骚妇内射| 日本久久久久久中文字幕| 91秦先生久久久久久久| 欧美午夜A∨大片久久 | 久久午夜伦鲁片免费无码| 99久久99这里只有免费费精品 | 精品无码久久久久久午夜| 久久久精品午夜免费不卡| 久久强奷乱码老熟女网站| 精品伊人久久大线蕉色首页| 久久成人小视频| 色综合久久最新中文字幕| 久久久久一级精品亚洲国产成人综合AV区 | 漂亮人妻被黑人久久精品| 国产精品久久久久久一区二区三区 | 久久―日本道色综合久久| 久久久精品国产亚洲成人满18免费网站 | 九九精品久久久久久噜噜| 久久精品人人做人人爽97| 久久精品国产一区二区三区不卡| 久久伊人五月丁香狠狠色| 久久久精品午夜免费不卡| 热99RE久久精品这里都是精品免费 | 久久久久一级精品亚洲国产成人综合AV区 | 久久人人爽人人爽人人片AV东京热 | 无码AV中文字幕久久专区| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 色综合久久久久无码专区|