我已经自己写好了。也许称为拆包程序更恰当。发给大家看看有什么要改进的。我修改了一下配置文件,第三列只是注释作用:
[view@localhost pkg]$cat pkg.ini
主帐号/卡号|19|6210986110000011876
交易处理码|6|100210
渠道标识码|2|03
流水号|8|45100011
本地时间|6|123448
本地日期|8|20110428
清算日期|8|20110428
交易标志|8|11110111
服务点进入方式|3|001
服务点条件代码|2|02
手续费1|8|00000500
手续费2|8|00000000
交易系统代码|11|45010100123
发信系统代码|11|45010100121
第二磁道数据|37|6210986110000011876=62109861100000118
第三磁道数据|104|996210986110000011876=6210986110000011876=6210986110000011876=6210986110000011876=62109861100000118760000
系统检索号|12|123456789012
响应码|2|00
终端标识码|8|00000007
交易局代码/受卡方标识码|15|010062100012345
存折印刷号|10|2010122702
个人识别号(PIN)|64|1111111111222222222233333333334444444444555555555566666666661234
安全控制信息|16|0000000000111111
证件信息|22|4501041987092310101111
[view@localhost pkg]$cat pkg.ini
主帐号/卡号|19|6210986110000011876
交易处理码|6|100210
渠道标识码|2|03
流水号|8|45100011
本地时间|6|123448
本地日期|8|20110428
清算日期|8|20110428
交易标志|8|11110111
服务点进入方式|3|001
服务点条件代码|2|02
手续费1|8|00000500
手续费2|8|00000000
交易系统代码|11|45010100123
发信系统代码|11|45010100121
第二磁道数据|37|6210986110000011876=62109861100000118
第三磁道数据|104|996210986110000011876=6210986110000011876=6210986110000011876=6210986110000011876=62109861100000118760000
系统检索号|12|123456789012
响应码|2|00
终端标识码|8|00000007
交易局代码/受卡方标识码|15|010062100012345
存折印刷号|10|2010122702
个人识别号(PIN)|64|1111111111222222222233333333334444444444555555555566666666661234
安全控制信息|16|0000000000111111
证件信息|22|4501041987092310101111
[view@localhost pkg]$cat pkg.c
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[]){
if(argc!=2){
fprintf(stderr,"usage: %s string\n",argv[0]);
exit(1);
}
FILE *f,*f1;
int line;
f=popen("wc -l pkg.ini|awk '{print $1}'","r");
if(f==NULL){
fprintf(stderr,"popen() error!\n");
exit(1);
}
fscanf(f,"%d",&line);
int i;
char *strtmp=(char*)malloc(2048);
char **ptr=(char**)malloc(4*line);
char **fmt=(char**)malloc(5*line);
char **btr=(char**)malloc(1000*line);
for(i=0;i<line;i++){
ptr[i]=(char *)malloc(3);
fmt[i]=(char *)malloc(5);
btr[i]=(char *)malloc(1000);
}
f1=fopen("pkg.ini","r");
if(f1==NULL){
fprintf(stderr,"pkg.ini:file not found!\n");
exit(1);
}
i=0;
while(fscanf(f1,"%*[^|]|%[^|]|",ptr[i])!=EOF){
i++;
}
strcpy(strtmp,argv[1]);
for(i=0;i<line;i++){
sprintf(fmt[i],"%%%ss",ptr[i]);
sscanf(strtmp,fmt[i],btr[i]);
fprintf(stdout,"位元%d:(长度%s):\t%s\n",i,ptr[i],btr[i]);
strtmp+=atoi(ptr[i]);
}
fprintf(stdout,"超长部分:%s\n",strtmp);
exit(0);
}
[view@localhost pkg]$./pkg 6210986110000011876100210034510001112344820110428201104281111011100102000005000000000045010100123450101001216210986110000011876=62109861100000118996210986110000011876=6210986110000011876=6210986110000011876=6210986110000011876=621098611000001187600001234567890120000000070100621000123452010122702111111111122222222223333333333444444444455555555556666666666123400000000001111114501041987092310101111
位元0:(长度19): 6210986110000011876
位元1:(长度6):
100210
位元2:(长度2):
03
位元3:(长度8):
45100011
位元4:(长度6):
123448
位元5:(长度8):
20110428
位元6:(长度8):
20110428
位元7:(长度8):
11110111
位元8:(长度3):
001
位元9:(长度2):
02
位元10:(长度8): 00000500
位元11:(长度8): 00000000
位元12:(长度11):
45010100123
位元13:(长度11):
45010100121
位元14:(长度37):
6210986110000011876=62109861100000118
位元15:(长度104):
996210986110000011876=6210986110000011876=6210986110000011876=6210986110000011876=6210986110000011876000
位元16:(长度12):
012345678901
位元17:(长度2): 20
位元18:(长度8): 00000007
位元19:(长度15):
010062100012345
位元20:(长度10):
2010122702
位元21:(长度64):
1111111111222222222233333333334444444444555555555566666666661234
位元22:(长度16):
0000000000111111
位元23:(长度22):
4501041987092310101111
超长部分:
[
本帖最后由 khaz 于 2011-4-29 09:01 编辑 ]