简易的二进制文件转文本文件

因工作中要对试验数据进行整理,原数据为二进制的DAT文件,需要转成十六进制字符串进行EXCEL处理,自己摸索,查网络,终于是可以用了。 非常简单的功能,甚至说是简陋。但备份一下吧,供自己用,以后再添加个界面。程序是控制台程序,用的C的标准库实现的。


#define		PAGE_SIZE		1024

int Bin2Txt( char *pTxtPath, char *pBinPath );
void gvCF_Hex2Ascii(char *pszRes, unsigned char *pbySrc, unsigned long dwLen);






int _tmain(int argc, _TCHAR* argv[])
{
	char *pBinFile = NULL;
	char *pTxtFile = NULL;
	char aszTxtFile[44] = {'\0'};
	char *p = NULL;
	unsigned short wLen;
	char aszBinFile[25][44] = {
	{"E:\\DatTemp\\ReceivedTofile-COM19-09-29.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-31-24.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-34-25.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-43-43.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-06-59.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-22-48.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-44-45.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-44-52.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-46-34.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-56-01.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-00-11.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-35-49.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-56-00.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-08-41.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-20-26.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-31-09.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-42-27.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-50-50.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-59-39.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-07-54.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM19-19-27.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM20-09-32.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM20-31-27.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM20-34-28.DAT"},
	{"E:\\DatTemp\\ReceivedTofile-COM20-43-46.DAT"}
	};

	for( unsigned int n = 0; n < 25; n++)
	{
		pBinFile = aszBinFile[n];
		wLen = strlen(pBinFile);
		if(p = strstr(pBinFile, "."))
		{
			memset(aszTxtFile, 0, sizeof(aszTxtFile));
			strncpy(aszTxtFile, pBinFile, wLen-4);
			strncpy(&aszTxtFile[p-pBinFile], ".txt", 4); //!< 创建同名文本文件
			pTxtFile = aszTxtFile;
		}
		printf("\r\nBin file: %s\r\nTxt file: %s\r\n", pBinFile, pTxtFile);
		if(0 == Bin2Txt(pTxtFile, pBinFile))
		{
			printf("Finish conversion.\r\n");
		}
		else
		{
			printf("Conversion fail.\r\n");
		}
	}

	
	return 0;
}



int Bin2Txt( char *pTxtPath, char *pBinPath )
{
	FILE *pBinRead = NULL;
	FILE *pTxtWrite = NULL;

	const unsigned int BUFF_SIZE = (PAGE_SIZE << 1) + PAGE_SIZE;
	unsigned long lBinSize = 0;
	unsigned long lPageSize;
	unsigned long lRemainSize;
	unsigned long n;
	char aszHexStr[BUFF_SIZE] = {'\0'};
	unsigned char abHex[PAGE_SIZE];


	if(!pTxtPath) return -1;
	if(!pBinPath) return -1;

	if(access(pBinPath, 0) != 0)
	{
		printf("Bin file not exist.\r\n");
		return -1;
	}

	if(access(pTxtPath, 0) != 0)
	{
		printf("Text file not exist.\r\n");
	}

	pBinRead = fopen(pBinPath, "rb");
	if(NULL == pBinRead)
	{
		return -1;
	}
	pTxtWrite = fopen(pTxtPath, "at+");
	if(NULL == pTxtWrite)
	{
		return -1;
	}

	fseek(pBinRead, 0, SEEK_END);
	lBinSize = ftell(pBinRead);
	rewind(pBinRead);

	if(lBinSize < PAGE_SIZE)
	{
		lPageSize = 0;
		lRemainSize = lBinSize % PAGE_SIZE;
	}
	else
	{
		lPageSize = lBinSize / PAGE_SIZE;
		lRemainSize = lBinSize % PAGE_SIZE;
	}

	if(lPageSize > 0)
	{
		for(n = 0; n < lPageSize; n++)
		{
			memset(abHex, 0, sizeof(abHex));
			if(1 != fread(abHex, PAGE_SIZE, 1, pBinRead)){ break;}
			gvCF_Hex2Ascii(aszHexStr, abHex, PAGE_SIZE);
			if(1 != fwrite(aszHexStr, BUFF_SIZE, 1, pTxtWrite)){ break;}
			if(0 != fseek(pTxtWrite, 0, SEEK_END)){ break;}		
		}

		if( n != lPageSize)
		{
			fclose(pBinRead);
			fclose(pTxtWrite);
			return -1;
		}
	}

	if(lRemainSize > 0)
	{
		memset(abHex, 0, sizeof(abHex));
		if(1 != fread(abHex, lRemainSize, 1, pBinRead)){ printf("%u Read fail.\r\n", __LINE__); }
		gvCF_Hex2Ascii(aszHexStr, abHex, (unsigned short)(0xFFFFU & lRemainSize));
		if(1 != fwrite(aszHexStr, (lRemainSize << 1), 1, pTxtWrite)){ printf("%u Write fail.\r\n", __LINE__); }
	}

	fclose(pBinRead);
	fclose(pTxtWrite);
	printf("Read binary and write text file finish.\r\n");

	return 0;
}


void gvCF_Hex2Ascii(char *pszRes, unsigned char *pbySrc, unsigned long dwLen)
{
	unsigned long i;
	char *pszConvert;
	char  byHi;
	char  byLo;

	if (pbySrc && pszRes)
    {
        pszConvert = pszRes;
        for (i = 0u; i < dwLen; i++)
        {
            byHi = (char)(pbySrc[i] >> 4u);
            byLo = (char)(pbySrc[i] & 0x0Fu);

            if (byHi < 0x0A)
            {
                *pszConvert = byHi + '0';
            }
            else         //(bHi < 0x10)
            {
                *pszConvert = byHi - 0x0A + 'A';
            }
            
            if (byLo < 0x0A)
            {
                *(pszConvert + 1) = byLo + '0';
            }
            else
            {
                *(pszConvert + 1) = byLo - 0x0A + 'A';
            }
            
			*(pszConvert + 2) = ' ';
            pszConvert += 3;
        }
    }
}

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值