#include "stdio.h" #include "stdlib.h" #include "string.h" #include "stdint.h" int cpp_process_hex_cpp(uint8_t *hex);//声明处理函数 #ifdef __cplusplus extern "C" { #endif // __cplusplus #include "plugin.h" int __cdecl __declspec(dllexport) process_program(const uint8_t *hex) { return 0; } unsigned int __cdecl __declspec(dllexport) get_plugin_type() { return 1; } int __cdecl __declspec(dllexport) process_hex(uint8_t *hex) { return cpp_process_hex_cpp(hex); } #ifdef __cplusplus } #endif // __cplusplus #include "vector" #ifdef WIN32 #include "windows.h" #endif // WIN32 //hex行信息结构体 typedef struct { size_t start_pos; size_t end_pos; } line_info; //字符数组到Hex字符串之间的转换。 /* out数组最好先清零以防止乱码; 成功返回0,失败返回非零 */ static inline int str2Hex(unsigned char in[],size_t in_size,unsigned char out[],size_t out_size) { if(in_size>((out_size)/2)) return 1;//输出字符串空间不够 for(size_t i=0;i>4); L=(in[i]& 0x0f); if(H<=9) { out[2*i]='0'+H; } else { out[2*i]='A'+H-10; } if(L<=9) { out[2*i+1]='0'+L; } else { out[2*i+1]='A'+L-10; } } return 0; } //大小写均支持 /* Hex字符串转字符数组 */ static inline int hex2str(unsigned char in[],size_t in_size,unsigned char out[],size_t out_size) { if((in_size%2) != 0) return 1;//可能不是Hex字符串 for(size_t i=0;i= '0') { H=in[2*i]-'0'; } if(in[2*i] <= 'F' && in[2*i] >= 'A') { H=in[2*i]-'A'+10; } if(in[2*i] <= 'f' && in[2*i] >= 'a') { H=in[2*i]-'a'+10; } if(in[2*i+1] <= '9' && in[2*i+1] >= '0') { L=in[2*i+1]-'0'; } if(in[2*i+1] <= 'F' && in[2*i+1] >= 'A') { L=in[2*i+1]-'A'+10; } if(in[2*i+1] <= 'f' && in[2*i+1] >= 'a') { L=in[2*i+1]-'a'+10; } out[i]=((H<<4)+L); } return 0; } //环境变量中的信息结构体 typedef struct { size_t symbol_start; size_t symbol_length; size_t flash_success; } env_info_t; static env_info_t env_info={0,0,0};//默认全零 static int load_env_var()//加载环境变量 { char *data=NULL; if((data=getenv("symbol_start"))!=NULL)//symbol_start必须存在 { size_t i; sscanf(data,"%X",&i); env_info.symbol_start=i; } else return -1; if((data=getenv("symbol_length"))!=NULL)//symbol_length必须存在 { size_t i; sscanf(data,"%u",&i); env_info.symbol_length=i; } else return -1; if((data=getenv("flash_success"))!=NULL) { size_t i; sscanf(data,"%u",&i); env_info.flash_success=i; } else { env_info.flash_success=0; } return 0; //成功返回0 } #include "thread" static const char *thread_msg=NULL,*thread_title=NULL; static void messagebox_thread() { MessageBoxA(NULL,thread_msg,thread_title,MB_OK); } static void inline messagebox(const char * msg,const char * title="提示",bool Is_noblock=true)//消息框 { if(Is_noblock) { thread_msg=msg; thread_title=title; std::thread *th=new std::thread(messagebox_thread); th->detach(); } else { MessageBoxA(NULL,msg,title,MB_OK); } } static std::vector hex_line_info; static uint8_t*hex_data=NULL; static inline void load_hex_line_info() { hex_line_info.clear(); {//统计行位置 line_info temp; for(size_t i=0;i300) ||(hex_line_info[i].start_pos+2>hex_line_info[i].end_pos)) { messagebox("hex数据异常!","错误"); return -1; } memcpy(buff_hex,data_start,length); if(hex2str(buff_hex,length,buff_str,length/2)) { messagebox("hex转换错误","警告"); return -1; } {//处理校验位 uint16_t sum=256; uint8_t temp=0; for(size_t pos=0;pos