hex转s19实现:
#include <stdio.h>
#include <string.h>
#include "../../common/common.h"
unsigned char hextos19(const char* dir, char* src)
{
FILE* src_file, * dest_file;
char chrtemp[1024], chrtemp2[256];
unsigned int addr_low = 0;
unsigned int addr_hign = 0;
char buffer_hex[1024];
unsigned char buffer_bin[512];
BIN gBinFor;
unsigned char res;
unsigned short tmp;
S19 gs19;
unsigned long longaddr;
unsigned char datas19[1024];
unsigned long filelen;
unsigned long addressLens, curaddressLens = 0;
gs19.data = buffer_bin;
gBinFor.data = buffer_bin;
strcpy(chrtemp, dir);
strcat(chrtemp, "\\");
strcat(chrtemp, src);
src_file = fopen(chrtemp, "r");
if (!src_file)
return 0;
memset(chrtemp2, 0, 256);
strcpy(chrtemp2, strrchr(src, '.'));
if (stricmp(chrtemp2, ".hex"))
{
fclose(src_file);
return 0;
}
memset(chrtemp, 0, 1024);
strcpy(chrtemp, dir);
strcat(chrtemp, "\\");
strncat(chrtemp, src, strlen(src) - strlen(chrtemp2));
strcat(chrtemp, ".s19");
dest_file = fopen(chrtemp, "w");
if (!dest_file) {
fclose(src_file);
return 0;
}
fseek(src_file, 0, SEEK_SET);
while (!feof(src_file))
{
fscanf(src_file, "%s\r\n", buffer_hex);
res = HexFormat(buffer_hex, &gBinFor);
if (res != 1)
{
fclose(src_file);
fclose(dest_file);
return res;
}
switch (gBinFor.type)
{
case 0:
longaddr = addr_low + addr_hign;
gs19.type = 0;
gs19.len = gBinFor.len + calclen(longaddr, &gs19) + 1;
tmp = binformats19((char*)datas19, &gs19);
fwrite(datas19, 1, tmp, dest_file);
fprintf(dest_file, "\n");
addr_low += gBinFor.len;
break;
case 1:
gs19.type = 0x09;
gs19.len = 3;
tmp = binformats19((char*)datas19, &gs19);
fwrite(datas19, 1, tmp, dest_file);
fprintf(dest_file, "\n");
fclose(src_file);
fclose(dest_file);
printf("%s\n", chrtemp);
return 1;
case 2:
addr_low = 0;
addr_hign = ((unsigned int)gBinFor.addr) << 8;
break;
case 4:
addr_low = 0;
addr_hign = ((unsigned int)gBinFor.addr) << 16;
break;
default:
fclose(src_file);
fclose(dest_file);
printf("%s\n", chrtemp);
return 0;
}
}
fclose(src_file);
fclose(dest_file);
printf("%s\n", chrtemp);
return 1;
}
int main() {
hextos19("C:\\Users\\sunsz\\Desktop", "(PCZ038)D25F1_E18301324_009_PCZ038_M60_20220620_1.hex");
return 0;
}
s19转hex实现
#include <cstdio>
#include<string>
#include "../../common/common.h"
unsigned char s19tohex(const char* dir, char* src)
{
FILE* src_file, * dest_file;
unsigned char p_line[1024];
char chrtemp[1024], chrtemp2[256];
unsigned int type = 0;
unsigned int data_length = 0;
unsigned int addr = 0;
unsigned char p_data[1024];
unsigned long low_addr = 0, hign_addr = 0;
unsigned char data[1024];
unsigned short chrtemplen = 0, num = 0, offset = 0;
unsigned char datahex[1024];
unsigned short tmp;
HEX ghex;
int ret = 0;
int read_flag = 0;
strcpy(chrtemp, dir);
strcat(chrtemp, "\\");
strcat(chrtemp, src);
src_file = fopen(chrtemp, "r");
if (!src_file)
return 0;
memset(chrtemp2, 0, 256);
strcpy(chrtemp2, strrchr(src, '.'));
if (stricmp(chrtemp2, ".s19"))
{
fclose(src_file);
return 0;
}
memset(chrtemp, 0, 1024);
strcpy(chrtemp, dir);
strcat(chrtemp, "\\");
strncat(chrtemp, src, strlen(src) - strlen(chrtemp2));
strcat(chrtemp, ".hex");
dest_file = fopen(chrtemp, "w");
if (!dest_file) {
fclose(src_file);
return 0;
}
fseek(src_file, 0, SEEK_SET);
ghex.data = data;
while (!feof(src_file)) {
if (fgets((char*)p_line, 1024, src_file) == NULL)
continue;
sscanf((char*)p_line, "S%1x%2x", &type, &data_length);
switch (type)
{
case 1:
sscanf((char*)p_line, "S%1x%2x%4x%s", &type, &data_length, &addr, p_data);
break;
case 2:
sscanf((char*)p_line, "S%1x%2x%6x%s", &type, &data_length, &addr, p_data);
break;
case 3:
sscanf((char*)p_line, "S%1x%2x%8x%s", &type, &data_length, &addr, p_data);
break;
case 7:
break;
default:
break;
}
if (type <= 3 && type > 0) chrtemplen = (strlen((char*)p_data) - 1) / 2;
if (type <= 3 && type > 0)
{
offset = 0;
num = 0;
while (num <= chrtemplen)
{
data[num] = hextobin((char*)p_data + offset);
num++;
offset = (num << 1);
}
low_addr = addr & 0x0000ffff;
hign_addr = addr & 0xffff0000;
if (low_addr == 0x0000 && hign_addr)
{
ghex.addr[0] = (unsigned char)((addr & 0xff000000) >> 24);
ghex.addr[1] = (unsigned char)((addr & 0xff0000) >> 16);
ghex.type = 4;
ghex.len = 2;
tmp = binformathex((char*)datahex, &ghex);
fwrite(datahex, 1, tmp, dest_file);
fprintf(dest_file, "\n");
}
ghex.len = num - 1;
ghex.addr[0] = (unsigned char)((addr & 0xff00) >> 8);
ghex.addr[1] = (unsigned char)(addr & 0xff);
ghex.type = 0;
tmp = binformathex((char*)datahex, &ghex);
fwrite(datahex, 1, tmp, dest_file);
fprintf(dest_file, "\n");
type = 0;
chrtemplen = 0;
}
}
ghex.addr[0] = 0;
ghex.addr[1] = 0;
ghex.type = 1;
ghex.len = 0;
tmp = binformathex((char*)datahex, &ghex);
fwrite(datahex, 1, tmp, dest_file);
fprintf(dest_file, "\n"); ;
fclose(src_file);
fclose(dest_file);
printf("%s\n", chrtemp);
return 1;
}
int main(){
s19tohex("C:\\Users\\sunsz\\Desktop", "(PCZ038)D25F1_E18301324_009_PCZ038_M60_20220620_1.s19");
return 0;
}