?? switch.c
字號:
#include <stdio.h>
#include <string.h>
#define SUCCESS 1
#define ERROR -1
/* 聲明公共變量 */
struct Stru_Source_Record
{
unsigned char Info1[5]; /* 其他信息 */
unsigned char Number[15]; /* 主叫、被叫號碼,被叫開始位置不固定 */
unsigned char Year; /* 年 */
unsigned char Month; /* 月 */
unsigned char Day; /* 日 */
unsigned char Hour; /* 時(shí) */
unsigned char Minute; /* 分 */
unsigned char Second; /* 秒 */
unsigned char TimeLen[4]; /* 時(shí)長 */
unsigned char Info2[8]; /* 其他信息 */
};
struct Stru_Target_Record
{
char Calling_Nbr[15];
char Sep1;
char Called_Nbr[20];
char Sep2;
char Year[4];
char Sep3;
char Month[2];
char Sep4;
char Day[2];
char Sep5;
char Hour[2];
char Sep6;
char Minute[2];
char Sep7;
char Second[2];
char Sep8;
char TimeLen[6];
char Sep9[2];
};
FILE *fp_SourceFile,*fp_CallFile,*fp_TollFile;
/* 函數(shù)聲明 */
int OpenFile(void); /* 打開所有文件 */
void CloseFile(void); /*關(guān)閉所有文件 */
void ShiftData(void); /*二進(jìn)制轉(zhuǎn)文本 */
void InitTargetRecord(struct Stru_Target_Record *Target_Record); /* 初始化目標(biāo)結(jié)構(gòu) */
void AnalyzeData(struct Stru_Source_Record *SourceRecord,
struct Stru_Target_Record *TargetRecord); /* 解析數(shù)據(jù),并寫入目標(biāo)結(jié)構(gòu) */
int AnalyzeNumber(unsigned char *InStr,int SourcePos,
int SourceLen,char *OutStr,int TargetPos); /* 解析主叫、被叫號碼 */
void AnalyzeDateTime(unsigned char InChar,char *OutStr,int Pos); /* 解析日期、時(shí)間 */
void main(void)
{
if (OpenFile() == SUCCESS)
{
ShiftData();
CloseFile();
}
return;
}
int OpenFile(void)
{
/* 本函數(shù)打開所需處理的所有文件 */
int li_RetVal = SUCCESS;
char lc_FileName[50] = "dch.dat";
char lc_CallName[50] = "dch_call.txt";
char lc_TollName[50] = "dch_toll.txt";
/* Open source file */
fp_SourceFile = fopen(lc_FileName,"rb");
if (!fp_SourceFile)
{
printf("%s cannot open!\n");
li_RetVal = ERROR;
}
else
{
/* Open target file*/
fp_CallFile = fopen(lc_CallName,"w");
fp_TollFile = fopen(lc_TollName,"w");
if (!fp_CallFile || !fp_TollFile)
{
printf("Target file can not open!\n");
CloseFile();
li_RetVal = ERROR;
}
}
return (li_RetVal);
}
void CloseFile(void)
{
fclose(fp_SourceFile);
fclose(fp_CallFile);
fclose(fp_TollFile);
return;
}
void ShiftData(void)
{
/* 本函數(shù)進(jìn)行文件的二進(jìn)制轉(zhuǎn)換 */
/* 二進(jìn)制格式說明:一個塊為2048個字節(jié),塊頭為10個字節(jié),塊尾為24個字節(jié),
每個塊內(nèi)共有53條記錄,每條記錄38個字節(jié),有效記錄開始標(biāo)志為0XBB */
int li_TotalRecordCount = 0; /* 文件總記錄數(shù) */
int li_BlockRecordCount = 0; /* 塊內(nèi)記錄數(shù) */
int li_TotalBlockCount = 0; /* 總塊數(shù) */
int li_ValidRecordCount = 0; /* 有效記錄數(shù) */
struct Stru_Source_Record ls_SourceRecord;
struct Stru_Target_Record ls_TargetRecord;
/* 跳過10個字節(jié)的塊頭 */
fseek(fp_SourceFile,10,SEEK_CUR);
while(!feof(fp_SourceFile))
{
/* 顯示處理信息 */
if (li_TotalRecordCount % 500 == 0 && li_TotalRecordCount > 0)
{
printf("處理記錄數(shù):%8d 有效記錄數(shù):%8d 數(shù)據(jù)塊數(shù):%8d\n",
li_TotalRecordCount,li_ValidRecordCount,li_TotalBlockCount);
}
/* 如果到塊尾,則跳過24個字節(jié)塊尾和10字節(jié)塊頭 */
if (li_BlockRecordCount == 53)
{
li_BlockRecordCount = 0; /* 塊內(nèi)記錄統(tǒng)計(jì)變量清0 */
li_TotalBlockCount++; /* 統(tǒng)計(jì)塊數(shù) */
fseek(fp_SourceFile,24+10,SEEK_CUR);
if (feof(fp_SourceFile)) /* 文件結(jié)束 */
{
break;
}
}
/* 從源文件中讀入一條記錄 */
fread(&ls_SourceRecord,sizeof(struct Stru_Source_Record),1,fp_SourceFile);
/* 如果記錄標(biāo)志不為0XBB,則無效 */
if (ls_SourceRecord.Info1[0] != 0xBB)
{
li_TotalRecordCount++;
li_BlockRecordCount++;
continue;
}
/* 目標(biāo)記錄初始化 */
InitTargetRecord(&ls_TargetRecord);
/* 解析數(shù)據(jù),并寫入目標(biāo)結(jié)構(gòu) */
AnalyzeData(&ls_SourceRecord,&ls_TargetRecord);
/* 寫入目標(biāo)文件 */
if (ls_TargetRecord.Called_Nbr[0] == '0'
|| strncmp(ls_TargetRecord.Called_Nbr,"17909",5) == 0)
{
fprintf(fp_TollFile,"%s",ls_TargetRecord.Calling_Nbr);
}
else
{
fprintf(fp_CallFile,"%s",ls_TargetRecord.Calling_Nbr);
}
/* 計(jì)數(shù)變量累加 */
li_TotalRecordCount++;
li_BlockRecordCount++;
li_ValidRecordCount++;
}
printf("處理記錄數(shù):%8d 有效記錄數(shù):%8d 數(shù)據(jù)塊數(shù):%8d\n",
li_TotalRecordCount,li_ValidRecordCount,li_TotalBlockCount);
return;
}
void InitTargetRecord(struct Stru_Target_Record *Target_Record)
{
/* 本函數(shù)對目標(biāo)串進(jìn)行初始化 */
memset(Target_Record->Calling_Nbr,' ',sizeof(struct Stru_Target_Record));
/* 字段間以分號分隔 */
Target_Record->Sep1 = ',';
Target_Record->Sep2 = ',';
Target_Record->Sep5 = ',';
Target_Record->Sep8 = ',';
/* 年月日之間以'-'分隔 */
memcpy(Target_Record->Year,"20",2);
Target_Record->Sep3 = '-';
Target_Record->Sep4 = '-';
/* 時(shí)分秒之間以':'分隔 */
Target_Record->Sep6 = ':';
Target_Record->Sep7 = ':';
/* 結(jié)尾加回車 */
Target_Record->Sep9[0] = '\n';
Target_Record->Sep9[1] = 0x00;
}
void AnalyzeData(struct Stru_Source_Record *SourceRecord,struct Stru_Target_Record *TargetRecord)
{
/* 本函數(shù)解析源二進(jìn)制數(shù)據(jù),并寫入目標(biāo)結(jié)構(gòu) */
int li_SourcePos=0;
int li_TargetPos=0;
char lc_Buffer[20];
long ll_TimeLen;
int li_CallingFlag = 1; /* 主叫號碼標(biāo)志,1表示主叫,0表示被叫 */
int li_NumberOverFlag = 0; /* 解析主被叫號碼是否結(jié)束標(biāo)志,0沒結(jié)束,1結(jié)束 */
int li_Tmp;
li_TargetPos = 0;
/* 解析主叫號碼 */
li_SourcePos = AnalyzeNumber(SourceRecord->Number,li_SourcePos,sizeof(SourceRecord->Number),
TargetRecord->Calling_Nbr,li_TargetPos);
/* 判斷主叫、被叫之間的分隔符 */
for ( ; li_SourcePos < sizeof(SourceRecord->Number); li_SourcePos++)
{
sprintf(lc_Buffer,"%2x",SourceRecord->Number[li_SourcePos]);
if (lc_Buffer[0] == ' ')
{ /* 補(bǔ)上丟失的高位0 */
lc_Buffer[0] = '0';
}
if (lc_Buffer[0] >='0' && lc_Buffer[0] <= '9')
{ /* 如果被叫號碼從高4位開始,則退出 */
break;
}
if (lc_Buffer[1] >= '0' && lc_Buffer[1] <= '9')
{ /* 如果被叫號碼從低4位開始,則先寫入被叫的首位 */
TargetRecord->Called_Nbr[0] = lc_Buffer[1];
li_SourcePos++; /* 源字串位置指向下一個字節(jié) */
li_TargetPos = 1; /* 目標(biāo)下標(biāo)位置指向第二個字節(jié),即1 */
break;
}
}
/* 解析被叫號碼 */
AnalyzeNumber(SourceRecord->Number,li_SourcePos,sizeof(SourceRecord->Number),
TargetRecord->Called_Nbr,li_TargetPos);
/* 解析日期、時(shí)間 */
AnalyzeDateTime(SourceRecord->Year, TargetRecord->Year, 2);
AnalyzeDateTime(SourceRecord->Month, TargetRecord->Month, 0);
AnalyzeDateTime(SourceRecord->Day, TargetRecord->Day, 0);
AnalyzeDateTime(SourceRecord->Hour, TargetRecord->Hour, 0);
AnalyzeDateTime(SourceRecord->Minute,TargetRecord->Minute,0);
AnalyzeDateTime(SourceRecord->Second,TargetRecord->Second,0);
/* 計(jì)算時(shí)長 */
ll_TimeLen = SourceRecord->TimeLen[0] * 16777216
+ SourceRecord->TimeLen[1] * 65535
+ SourceRecord->TimeLen[2] * 256
+ SourceRecord->TimeLen[3];
memset(lc_Buffer,0x00,sizeof(lc_Buffer));
sprintf(lc_Buffer,"%d",ll_TimeLen);
/* 將時(shí)長按右對齊傳入目標(biāo)結(jié)構(gòu)中 */
li_SourcePos = strlen(lc_Buffer) - 1;
li_TargetPos = 5;
while(li_SourcePos>=0)
{
TargetRecord->TimeLen[li_TargetPos] = lc_Buffer[li_SourcePos];
li_SourcePos--;
li_TargetPos--;
}
}
int AnalyzeNumber(unsigned char *InStr,int SourcePos,int SourceLen,char *OutStr,int TargetPos)
{
/* 本函數(shù)解析主叫、被叫號碼,將結(jié)果寫入目標(biāo)串,返回結(jié)束的下標(biāo)位置。
InStr: 二進(jìn)制15位主叫、被叫號碼
SourcePos: InStr的開始位置
OutStr: 輸出結(jié)果字串,為主叫或被叫號碼
TargetPos: OutStr的開始位置 */
int li_NumberOverFlag = 0;
int li_Tmp;
char lc_Buffer[100];
for ( ; SourcePos < SourceLen; SourcePos++ )
{
/* 取出號碼字節(jié)的高4位和低4位,放到lc_Buffer的第0、1字節(jié)中 */
sprintf(lc_Buffer,"%2x",InStr[SourcePos]);
if (lc_Buffer[0] == ' ')
{ /* 補(bǔ)上丟失的高位0 */
lc_Buffer[0] = '0';
}
for (li_Tmp = 0; li_Tmp < 2;li_Tmp++)
{ /* 如果是數(shù)字則寫入到目標(biāo)串 */
if (lc_Buffer[li_Tmp] >= '0' && lc_Buffer[li_Tmp] <= '9')
{
OutStr[TargetPos] = lc_Buffer[li_Tmp];
TargetPos++;
}
else
{ /* 如果不是數(shù)字,則號碼結(jié)束 */
li_NumberOverFlag = 1;
break;
}
}
if (li_NumberOverFlag == 1)
{
break;
}
}
return (SourcePos);
}
void AnalyzeDateTime(unsigned char InChar,char *OutStr,int Pos) /* 解析日期、時(shí)間 */
{
char lc_Buffer[10];
sprintf(lc_Buffer,"%2x",InChar);
if (lc_Buffer[0] == ' ')
{ /* 補(bǔ)上丟失的高位0 */
lc_Buffer[0] = '0';
}
memcpy(OutStr+Pos,lc_Buffer,2);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -