資源簡介
單片機(jī)開發(fā)過程中,需要將不同的bin文件(boot、app,data)合并,合并之后的文件需要轉(zhuǎn)成16進(jìn)制文件時(shí)使用此工具。
可以直接使用,也可以對(duì)源文件編輯,編譯,按照自定義的要求實(shí)現(xiàn)特定的功能。

代碼片段和文件信息
#include?
#include?
#include?
#ifndef?BIN2HEX_H
#define?BIN2HEX_H
typedef?unsigned?char?uint8_t;
typedef?unsigned?short?uint16_t;
typedef?unsigned?long?uint32_t;
/***********************************
*********************************************
就是每次讀寫bin文件N個(gè)字節(jié),然后再轉(zhuǎn)化為hex格式流,hex格式流長度計(jì)算方式
:?+?長度?+?地址?+?類型?+?N個(gè)數(shù)據(jù)(N?>=?0)?+?校驗(yàn)
1?+?2????+?4????+?2????+?N?*?2???????????+?2
********************************************************************************/
#define?NUMBER_OF_ONE_LINE?????0x10//0x20
#define?MAX_BUFFER_OF_ONE_LINE??(NUMBER_OF_ONE_LINE?*2?+?11)
typedef?struct?{
uint8_t?len;
uint8_t?addr[2];
uint8_t?type;
uint8_t?*data;
}?HexFormat;
typedef?enum?{
RES_OK?=?0????????????????????//操作完成
RES_BIN_FILE_NOT_EXIST????????//相當(dāng)于bin文件不存在,包括輸入的路徑可能存在不正確
RES_HEX_FILE_PATH_ERROR????????//目標(biāo)文件路徑可能輸入有誤?????????
RES_HEX_ADDRRESS_ERROR?????????//目標(biāo)文件地址可能輸入有誤?????????
}?RESULT_STATUS;
RESULT_STATUS?BinFile2HexFile(char*src?char?*dest);
#endif
/********************************************************************************
input:
dest:?為轉(zhuǎn)換后的結(jié)果
p->addr[0]:?高地址
p->addr[1]:?低地址
p->type:?記錄類型
p->data:?為bin格式流有效數(shù)據(jù)指針
p->len:?為bin格式流有效數(shù)據(jù)長度
output:
返回有效數(shù)據(jù)的長度
********************************************************************************/
uint16_t?BinFormatEncode(uint8_t?*dest?HexFormat?*p)
{
uint16_t?offset?=?0;
uint8_t?check?=?0?num?=?0;????//:(1)?+?長度(2)?+?地址(4)?+?類型(2)
sprintf(&dest[offset]?“:%02X%02X%02X%02X“?p->len?p->addr[0]?p->addr[1]?p->type);
offset?+=?9;???????????????????//hex格式流數(shù)據(jù)指針偏移2
check?=?p->len?+?p->addr[0]?+?p->addr[1]?+?p->type;?//計(jì)算校驗(yàn)和
while?(num?len)??????????//當(dāng)數(shù)據(jù)長度不為0,繼續(xù)在之前的hex格式流添加數(shù)據(jù)
{
sprintf(&dest[offset]?“%02X“?p->data[num]);
check?+=?p->data[num];??????//計(jì)算校驗(yàn)和
offset?+=?2;???????????????//hex格式數(shù)據(jù)流數(shù)據(jù)指針偏移2
num++;?????????????????????//下一個(gè)字符
}
check?=?~check?+?1;?????????????//反碼+1
sprintf(&dest[offset]?“%02X“?check);
offset?+=?2;
return?offset;??????????????????//返回hex格式數(shù)據(jù)流的長度
}
RESULT_STATUS?BinFile2HexFile(char*src?char?*dest?char?*addr)
{
FILE?*src_file?*dest_file;
uint16_t?tmp;
HexFormat?gHexFor;
uint32_t?low_addr?=?0x8000?hign_addr?=?0;
uint8_t?buffer_bin[NUMBER_OF_ONE_LINE*10]?buffer_hex[MAX_BUFFER_OF_ONE_LINE*10];
uint32_t?src_file_length;
uint16_t?src_file_quotient?cur_file_page?=?0;
uint8_t?src_file_remainder;
//low_addr?=?addr[0]?-?0x30;
//low_addr?*=?256;
//low_addr?+=?(addr[1]?-?0x30);
//low_addr?*=?256;
////low_addr?+=?(addr[2]?-?0x30);
////low_addr?*=?256;
////low_addr?+=?(addr[3]?-?0x30);
//printf(“%d?help\r\n“l(fā)ow_addr);
//if?(low_addr?>?0x10000)
//{
// return?RES_HEX_ADDRRESS_ERROR;
//}
src_file?=?fopen(src?“rb“);????????//源文件為bin文件以二進(jìn)制的形式打開
if?(!src_file)??????????????????????//這里也是相當(dāng)于用來檢查用戶的輸入是否準(zhǔn)備
{
return?RES_BIN_FILE_NOT_EXIST;
}
dest_file?=?fopen(dest?“w“);???????//目的文件為hex文件,以文本的形式打開
if?(!dest_file)
{
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-04-22?14:11??bin2hex\
?????目錄???????????0??2018-04-22?11:53??bin2hex\.vs\
?????目錄???????????0??2018-04-22?11:53??bin2hex\.vs\ConsoleApplication1\
?????目錄???????????0??2018-04-22?11:53??bin2hex\.vs\ConsoleApplication1\v14\
?????文件???????43008??2018-04-22?14:11??bin2hex\.vs\ConsoleApplication1\v14\.suo
?????目錄???????????0??2018-04-22?11:53??bin2hex\ConsoleApplication1\
?????文件????????1339??2018-04-20?19:20??bin2hex\ConsoleApplication1.sln
?????文件?????1847296??2018-04-22?14:11??bin2hex\ConsoleApplication1.VC.db
?????文件????????7716??2018-04-22?11:56??bin2hex\ConsoleApplication1\ConsoleApplication1.vcxproj
?????文件?????????946??2018-04-22?11:56??bin2hex\ConsoleApplication1\ConsoleApplication1.vcxproj.filters
?????文件???????59149??2018-04-20?23:26??bin2hex\ConsoleApplication1\DCT100_1.hex
?????文件???????24576??2018-04-20?22:57??bin2hex\ConsoleApplication1\DCT100_App.bin
?????目錄???????????0??2018-04-22?11:56??bin2hex\ConsoleApplication1\Debug\
?????文件???????25646??2018-04-22?09:44??bin2hex\ConsoleApplication1\Debug\aaaaa.obj
?????目錄???????????0??2018-04-22?12:18??bin2hex\ConsoleApplication1\Debug\ConsoleA.31457AA2.tlog\
?????文件????????2290??2018-04-22?12:18??bin2hex\ConsoleApplication1\Debug\ConsoleA.31457AA2.tlog\CL.command.1.tlog
?????文件????????7952??2018-04-22?12:18??bin2hex\ConsoleApplication1\Debug\ConsoleA.31457AA2.tlog\CL.read.1.tlog
?????文件?????????994??2018-04-22?12:18??bin2hex\ConsoleApplication1\Debug\ConsoleA.31457AA2.tlog\CL.write.1.tlog
?????文件?????????221??2018-04-22?12:18??bin2hex\ConsoleApplication1\Debug\ConsoleA.31457AA2.tlog\ConsoleApplication1.lastbuildstate
?????文件????????2886??2018-04-22?12:18??bin2hex\ConsoleApplication1\Debug\ConsoleA.31457AA2.tlog\li
?????文件????????3250??2018-04-22?12:18??bin2hex\ConsoleApplication1\Debug\ConsoleA.31457AA2.tlog\li
?????文件?????????702??2018-04-22?12:18??bin2hex\ConsoleApplication1\Debug\ConsoleA.31457AA2.tlog\li
?????文件????????2054??2018-04-20?23:37??bin2hex\ConsoleApplication1\Debug\ConsoleApplication1.Build.CppClean.log
?????文件?????????554??2018-04-22?12:18??bin2hex\ConsoleApplication1\Debug\ConsoleApplication1.log
?????文件???????18504??2018-04-22?12:18??bin2hex\ConsoleApplication1\Debug\main.obj
?????文件???????68608??2018-04-22?12:18??bin2hex\ConsoleApplication1\Debug\vc140.idb
?????文件???????77824??2018-04-22?12:18??bin2hex\ConsoleApplication1\Debug\vc140.pdb
?????目錄???????????0??2018-04-22?12:20??bin2hex\Debug\
?????目錄???????????0??2018-04-22?12:20??bin2hex\Debug\batfile\
?????文件???????47156??2018-04-22?12:20??bin2hex\Debug\batfile.zip
?????文件???????39424??2018-04-22?12:18??bin2hex\Debug\batfile\bin2hex.exe
............此處省略10個(gè)文件信息
評(píng)論
共有 條評(píng)論