簡易バイナリファイルテキストファイル
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;
}
}
}