1. 程式人生 > >C# Hex檔案轉Bin檔案

C# Hex檔案轉Bin檔案

好吧···我接觸到微控制器的一點點東西了

今天要在web上面做一個對硬體的遠端升級,給我的是bin檔案或者是Hex檔案,傻了沒搞過,發現讀bin不太會搞,讀Hex是Ascii碼然後轉哈哈
 首先需要了解以下HEX的檔案資訊: 
  Intel HEX檔案是記錄文字行的ASCII文字檔案,在Intel HEX檔案中,每一行是一個HEX記錄,由十六進位制陣列成的機器碼或者資料常量。Intel HEX檔案經常被用

於將程式或資料傳輸儲存到ROM、EPROM,大多數程式設計器和模擬器使用Intel HEX檔案。 
  HEX格式檔案以行為單位,每行由":"(0x3A)開始,以回車鍵結束(0x0D,0x0A)。行內的資料都是由兩個字元表示一個16進位制位元組,比如"01"就表示數0x01;"0A"就

表示0x0A。對於16位的地址, 則高位在前低位在後, 比如地址0x010A,在HEX格式檔案中就表示為字串"010a". 下面為HEX檔案中的一行: 
 :10000000FF0462FF051EFF0A93FF0572FF0A93FFBC 
 : 號表示一行的開始 
 : 後的第1, 2個字元表示本行包含的資料的長度,這裡就是0x10即16個. 
 : 後的第3, 4, 5, 6個字元表示資料儲存的起始地址,這裡表示從0x0000地址開始儲存16個數據,其中高位地址在前,低位地址在後。 
 : 後的第7, 8個字元表示資料的型別
  00 ----資料記錄        
  01 ----檔案結束記錄 
  02 ----擴充套件段地址記錄 
  04 ----擴充套件線性地址記錄

 這裡就是0x00即為普通資料記錄。 
 自後的32個字元就是本行包含的資料,每兩個字元表示一個位元組資料,總共有16個位元組資料跟行首的記錄的長度相一致。 
 最後兩個字元表示校驗碼。 
 
 每個HEX格式的最後一行都是固定為:
 :00000001FF

 以上的資訊其實就足夠進行HEX轉BIN格式的程式的編寫。
 我只處理資料型別為0x00及0x01的情況。0x02, 0x04表示對應的儲存地址超過了64K,我沒有用到.

StreamReader HexReader = new StreamReader(“你檔案地址”);
                
                while (true)
                {
                    szLine = HexReader.ReadLine(); //讀取一行資料

                    if (szLine == null) //讀完所有行
                    {
                        break;
                    }
                    if (szLine.Substring(0, 1) == ":") //判斷第1字元是否是:
                    {

                        if (szLine.Substring(1, 8) == "00000001")//資料結束
                        {
                            break;
                        }
                        if (szLine.Substring(1, 1) == "1")
                        {
                            szHex += szLine.Substring(9, szLine.Length - 11); //讀取有效字元:後0和1
                        }

                       
                    }

                }
Int32 i;
                Int32 j = 0;
                Int32 Length = szHex.Length;
                byte[] szBin = new byte[Length / 2];
                for (i = 0; i < Length; i += 2) //兩字符合併成一個16進位制位元組
                {
                    szBin[j] = (byte)Int16.Parse(szHex.Substring(i, 2), NumberStyles.HexNumber);
                    j++;                    
                }