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

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

            常用鏈接

            統(tǒng)計

            積分與排名

            BBS

            Blog

            Web

            最新評論

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

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

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

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

            :10000000FF0462FF051EFF0A93FF0572FF0A93FFBC

                   “:”表示一行的開始。

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

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

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

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

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

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

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

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

            :00000001FF

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

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

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

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

            //

             

              1#include "stdafx.h"
              2
              3#include <malloc.h>
              4
              5#include <memory.h>
              6
              7typedef unsigned char BYTE;
              8
              9 
             10
             11//將兩個字符轉(zhuǎn)化為一個字節(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("請輸入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     //將文件長度計算出來用于申請存儲數(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     //因為是每兩個字符表示一個字節(jié),所以最大的數(shù)據(jù)個數(shù)要少于文件字符個數(shù)的一半
            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              //一行的頭兩個字符表示該行包含的數(shù)據(jù)長度
            138
            139              data[0= fgetc(myFile);
            140
            141              data[1= fgetc(myFile);
            142
            143              CharToByte(data,&dataLen);
            144
            145              //一行的第、個字符表示數(shù)據(jù)存儲起始地址的高位
            146
            147              data[0= fgetc(myFile);
            148
            149              data[1= fgetc(myFile);
            150
            151              CharToByte(data,&adressHigh);
            152
            153              //一行的第、個字符表示數(shù)據(jù)存儲起始地址的低位
            154
            155              data[0= fgetc(myFile);
            156
            157              data[1= fgetc(myFile);
            158
            159              CharToByte(data,&adressLow);
            160
            161              //一行的第、個字符表示數(shù)據(jù)類型
            162
            163              data[0= fgetc(myFile);
            164
            165              data[1= fgetc(myFile);
            166
            167              CharToByte(data,&dataType);
            168
            169              //當數(shù)據(jù)類型為時,表示本行包含的是普通數(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              //當數(shù)據(jù)類型為時,表示到了最后一行
            194
            195              if (dataType == 0x01)
            196
            197              {
            198
            199                   printf("文件結(jié)束記錄!");
            200
            201              }

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

            214
            215              //當數(shù)據(jù)類型為時,表示本行包含的是擴展線性地址記錄
            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 閱讀(5122) 評論(1)  編輯 收藏 引用 所屬分類: C++基礎(chǔ)

            評論

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

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

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

            中文版MSDN:
            歡迎體驗

            久久伊人色| 久久人人妻人人爽人人爽| 久久综合亚洲色一区二区三区| 久久人人爽人人爽人人片AV高清| 久久综合给合久久国产免费| 国产福利电影一区二区三区久久老子无码午夜伦不 | 一本一道久久综合狠狠老| 久久夜色tv网站| 亚洲午夜久久久久久久久久| 国产高清美女一级a毛片久久w| 精品久久亚洲中文无码| 久久久精品人妻无码专区不卡| 婷婷久久香蕉五月综合加勒比 | 久久综合噜噜激激的五月天| 久久99精品久久久久久野外| 久久超乳爆乳中文字幕| 热99RE久久精品这里都是精品免费 | 久久久久久精品无码人妻| 大美女久久久久久j久久| 国产综合久久久久| 亚洲色大成网站WWW久久九九| 久久亚洲电影| 久久国产成人午夜aⅴ影院| 久久精品99久久香蕉国产色戒| 亚洲日本va午夜中文字幕久久| 日本久久久久久中文字幕| 97热久久免费频精品99| 亚洲精品国产字幕久久不卡| 亚洲?V乱码久久精品蜜桃| 久久国产精品国语对白| 国产一级做a爰片久久毛片| 久久亚洲AV成人无码国产| 伊人久久大香线蕉综合Av| 亚洲精品乱码久久久久久自慰| 久久丫忘忧草产品| 无码八A片人妻少妇久久| 无码人妻久久一区二区三区蜜桃| 中文字幕无码av激情不卡久久| 亚洲婷婷国产精品电影人久久| 久久综合九色欧美综合狠狠 | 色8激情欧美成人久久综合电|