簡易バイナリファイルテキストファイル

5491 ワード

作業中に試験データを整理するため、元データはバイナリのDATファイルで、16進数文字列に変換して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
Bin file: %s\r
Txt file: %s\r
", pBinFile, pTxtFile); if(0 == Bin2Txt(pTxtFile, pBinFile)) { printf("Finish conversion.\r
"); } else { printf("Conversion fail.\r
"); } } 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
"); return -1; } if(access(pTxtPath, 0) != 0) { printf("Text file not exist.\r
"); } 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
", __LINE__); } gvCF_Hex2Ascii(aszHexStr, abHex, (unsigned short)(0xFFFFU & lRemainSize)); if(1 != fwrite(aszHexStr, (lRemainSize << 1), 1, pTxtWrite)){ printf("%u Write fail.\r
", __LINE__); } } fclose(pBinRead); fclose(pTxtWrite); printf("Read binary and write text file finish.\r
"); 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; } } }