基于C/C++的hex、s19文件相互转换

 


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;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ya土豆儿~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值