java解析FSN文件doc.docx

上传人:b****2 文档编号:17763009 上传时间:2023-08-03 格式:DOCX 页数:34 大小:30.92KB
下载 相关 举报
java解析FSN文件doc.docx_第1页
第1页 / 共34页
java解析FSN文件doc.docx_第2页
第2页 / 共34页
java解析FSN文件doc.docx_第3页
第3页 / 共34页
java解析FSN文件doc.docx_第4页
第4页 / 共34页
java解析FSN文件doc.docx_第5页
第5页 / 共34页
java解析FSN文件doc.docx_第6页
第6页 / 共34页
java解析FSN文件doc.docx_第7页
第7页 / 共34页
java解析FSN文件doc.docx_第8页
第8页 / 共34页
java解析FSN文件doc.docx_第9页
第9页 / 共34页
java解析FSN文件doc.docx_第10页
第10页 / 共34页
java解析FSN文件doc.docx_第11页
第11页 / 共34页
java解析FSN文件doc.docx_第12页
第12页 / 共34页
java解析FSN文件doc.docx_第13页
第13页 / 共34页
java解析FSN文件doc.docx_第14页
第14页 / 共34页
java解析FSN文件doc.docx_第15页
第15页 / 共34页
java解析FSN文件doc.docx_第16页
第16页 / 共34页
java解析FSN文件doc.docx_第17页
第17页 / 共34页
java解析FSN文件doc.docx_第18页
第18页 / 共34页
java解析FSN文件doc.docx_第19页
第19页 / 共34页
java解析FSN文件doc.docx_第20页
第20页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

java解析FSN文件doc.docx

《java解析FSN文件doc.docx》由会员分享,可在线阅读,更多相关《java解析FSN文件doc.docx(34页珍藏版)》请在冰点文库上搜索。

java解析FSN文件doc.docx

java解析FSN文件doc

packageaction;

importjava.util.ArrayList;

importtools.FsnTools;

importbean.FsnBody;

importbean.FsnModel;

publicclassFsnReaderAction{

publicfinalstaticintintstep=2;//Uint16字节长度

publicfinalstaticintstringstep=4;//Uint32字节长度

publicfinalstaticintfsnHeadLengh=32;//fsn文件头字节长度

publicfinalstaticintfsnPerBodyNoImg=100;//fsn文件体每条记录,不包

括图像信息的字节长度

publicfinalstaticintfsnPerBodyImg=1644;//fsn文件体每条记录,包括

图像信息的字节长度

publicintfilePos=0;//fsn文件字节流当前指针位置

publicFsnModelfm;//本实例解析的FsnMedel对象

publicStringfsnFilePath;//FSN文件的存储完整路径,包括文件名

publicFsnReaderAction(StringfilePath){

this.fsnFilePath=filePath;}

publicFsnModelreadFsnFile()throwsException{

//FsnModelret=null;

try{

this.fm=newFsnModel(this.fsnFilePath);//hzyimport把文件转成字节流数组

byte[]fsnbytes=FsnTools.toByteArray(this.fsnFilePath);

this.fm.setSize(fsnbytes.length);

System.out.println("FileLengh:

"+fsnbytes.length);

//读取头文件

setHead(fsnbytes);

longcounter=this.fm.getCounter();//冠字号信息条数//

System.out.println("this.fm.getHeadString()[2]="+this.fm.getHeadStr

ing()[2]);

intsize=this.fm.getHeadString()[2]!

=0x2D?

fsnPerBodyImg:

fsnPerBodyNoImg;

//System.out.println("this.fm.getHeadString()[2]

="+this.fm.getHeadString()[2]);

//System.out.println("counter="+counter);

//System.out.println("size="+size);

//System.out.println("counter=*size"+counter*size);

//System.out.println("fsnHeadLengh="+fsnHeadLengh);

//如果fsn文件的长度合一致

if(counter*size+fsnHeadLengh==fsnbytes.length){

ArrayListlist=newArrayList();

longValutaSum=0;

for(inti=0;i

FsnBodybody=newFsnBody();

booleannoException=false;//处理过程中没有异常

//每条fsn信息均从i*size+32(头的长度)处起始intthisPosSart=i*size+fsnHeadLengh;

//此处处理非常重要,在读取图片文件前一定要做处理因为图片字节流长度固定,644位,getSnoExpImg方法只读到图片信息中有数据部分对应的字节流,后

面的都是空值,将不再读取

//某条图片数据读完以后,filePos不一定会移至这个图片数据对应的结尾位置,要在读取下一条数据时,强制将filePos指向下一条图片信息对应字节流起

始位置

if(filePos

filePos=thisPosSart;

}

body=getSnoExpImg(fsnbytes);

body.setRecordNum(i+1);//此条fsn记录在fsn文件中的顺序

ValutaSum+=body.getValuta();

if(size!

=fsnPerBodyNoImg){

testSnoImg(fsnbytes);//校验图片数据合法性,如果不合

法,将抛出异

//map.put("ImageSno",imageSno);//图片BufferedImage

对象,不能将此数据放入map,一是数据量大时内存溢出,二是效率大打折

byte[]imgbytes=FsnTools.byteCopy(fsnbytes,thisPosSart+fsnPerBodyNoImg,size-fsnPerBodyNoImg);

body.setImageBytes(imgbytes);//图片字节数组数据

imgbytes=null;//及时释放图片字节数组对象,释放内}else{

//map.put("ImageSno",null);body.setImageBytes(null);

}

noException=true;

if(noException){//当没有异常时记录解析数据

list.add(body);

}else{

if(this.fm.isPermitException()){//当有异常时,如果

fsn配置文件允许记录异常,则记录,否则不记录

list.add(body);}

}}

this.fm.setBodys(list);

}

}catch(Exceptione){

this.fm.setAnalysisExcepted(true);

this.fm.setAnalysisErrorMsg(e.getMessage());

//写日志

}

returnthis.fm;}

/**

*获取Fsn每条记录中的图片对象

*@paramfsnBytesfsn文件的byte字节流对*@return

*/

publicvoidtestSnoImg(byte[]fsnBytes)throwsException{

//冠字号码的个数

intnum=parseInt(fsnBytes);

//每个冠字号码的图像宽

intheight=parseInt(fsnBytes);

intwidth=parseInt(fsnBytes);

intReserve2=parseInt(fsnBytes);

//图片三维不能小于0

if(num<=0||height<=0||width<=0){

thrownewException("图片数据读取失败,长宽和字符数均不能小于等于0");

}

//冠字号码个数不能多于12if(num>12){

thrownewException("图片数据读取失败,冠字号码个数不能多");}

//图片大小不能多于图片缓冲区的总大小,减去108位,包括100位其他字段和8

位图像meta

longmutiall=4*width*num;

if(mutiall>fsnPerBodyImg-108){

thrownewException("图像数据读取失败,图像长度大于图像缓冲器长度");

}

//inti=0;

//while(i

//byte[]pic=parseByte(fsnBytes,4);

//Strings=MessageUtil.toBinaryString(pic);

//i++;

//}

}

publicFsnBodygetSnoExpImg(byte[]fsnBytes){

FsnBodybody=newFsnBody();

//设置日期时间

intdata=parseInt(fsnBytes);

inttime=parseInt(fsnBytes);

//System.out.println("data="+data);

//System.out.println("time="+time);

/*if(time<0){

time=-time;}*/

inty=data>>9;

intm=(data-(y<<9))>>5;

intd=data-(y<<9)-(m<<5);inthh=time>>11;

intmm=(time-(hh<<11))>>5;

intss=(time-(hh<<11)-(mm<<5))<<1;/*

StringDateStr=StrUtil.numAddZero(String.valueOf((y+1980)),4)+

"-"+StrUtil.numAddZero(String.valueOf(m),2)+"-"+

StrUtil.numAddZero(String.valueOf(d),2);

StringTimeStr=hh+":

"+mm+":

"+ss;

body.setDateStr(DateStr);body.setTimeStr(TimeStr);

//*/

//*

StringBufferDateBuf=newStringBuffer();

StringBufferTimeBuf=newStringBuffer();

DateBuf.append(y+1980);DateBuf.append("-");

DateBuf.append(FsnTools.numAddZero(m,2));

DateBuf.append("-");

DateBuf.append(FsnTools.numAddZero(d,2));

TimeBuf.append(FsnTools.numAddZero(hh,2));

TimeBuf.append(":

");

TimeBuf.append(FsnTools.numAddZero(mm,2));

TimeBuf.append(":

");

TimeBuf.append(FsnTools.numAddZero(ss,2));

body.setDateStr(DateBuf.toString());

body.setTimeStr(TimeBuf.toString());

body.setDateStr(DateBuf.toString());

body.setTimeStr(TimeBuf.toString());

body.setDateTime(body.getDateStr()+""+body.getTimeStr());

//设置货币真假残和旧币标志

body.setTfFlag(parseInt(fsnBytes));

//设置货币错误

StringBuffererrorCode=newStringBuffer();

/*for(inti=0;i<3;i++){

intcode=parseInt(fsnBytes);

if(code<13&&code>0){

errorCode+=code+",";

}

}

if("1".equals(map.get("TfFlag")))

errorCode=errorCode.substring(0,

errorCode.lastIndexOf(","));

else

errorCode="0";*/

for(inti=0;i<3;i++){

intcode=parseInt(fsnBytes);

if(i==0){

errorCode.append(code);

}else{

errorCode.append(":

");

errorCode.append(code);}

}

body.setErrorCode(errorCode.toString());//设置币种标志

StringmoneyFlag="";

for(inti=0;i<4;i++){

intflag=parseInt(fsnBytes);

if(flag!

=0){

moneyFlag+=(char)flag;}

}

body.setMoneyFlag(moneyFlag);

//设置年版或版本号标志

intver=parseInt(fsnBytes);

//body.setVer(FsnTool.deMoneyVer(ver));

body.setVer(ver);

//设置币

body.setValuta(parseInt(fsnBytes));

//设置冠字号位

body.setCharNum(parseInt(fsnBytes));//设置冠字

StringBufferno=newStringBuffer();

for(inti=0;i<12;i++){

intNo=parseInt(fsnBytes);

if(No!

=0)

no.append((char)No);

}

body.setSno(no.toString());

//设置机具编号

StringBuffermachineSNo=newStringBuffer();

for(inti=0;i<24;i++){

intMsno=parseInt(fsnBytes);

if(Msno!

=0)

machineSNo.append((char)Msno);}

body.setMachineSno(machineSNo.toString());//设置冠字号保留字

body.setReserve1(parseInt(fsnBytes));

//System.out.println("时间="+body.getDateStr()+""+

body.getTimeStr()+"|真假币标志="+body.getTfFlag()+"|表示最多3组假币特征码

="+body.getErrorCode()+"|"+

//"|币种标志="+body.getMoneyFlag()+"|年版或版本号标志

="+body.getVer()+"|币值="+body.getValuta()+"|冠字号码字符数

="+body.getCharNum()+"|存放识别的冠字号码="+

//body.getSno()+"|机具编号="+body.getMachineSno()+"|保留字1="+body.getRecordNum());

returnbody;}

publicvoidsetHead(byte[]fsnBytes)throwsException{

this.filePos=0;//读取文件头数据的当前指针位置,设置字节位移从0开始if(this.fm==null){

this.fm=newFsnModel(this.fsnFilePath);

}

int[]headStart=newint[4];

for(inti=0;i<4;i++){

headStart[i]=parseInt(fsnBytes);

//System.out.println("headStart["+i+"]="+headStart[i]);

}

fm.setHeadStart(headStart);

int[]headString=newint[6];

for(inti=0;i<6;i++){

headString[i]=parseInt(fsnBytes);

//System.out.println("headString["+i+"]="+headString[i]);

}

fm.setHeadString(headString);

longcounter=parseLong(fsnBytes);

//System.out.println("counter="+counter);

fm.setCounter(counter);

int[]headEnd=newint[4];

for(inti=0;i<4;i++){

headEnd[i]=parseInt(fsnBytes);

//System.out.println("headEnd["+i+"]="+headEnd[i]);

}

fm.setHeadEnd(headEnd);}

publicintparseInt(byte[]fsnBytes){

int

ret=(int)FsnTools.demarshallintLittle(fsnBytes,filePos,intstep);

this.filePos+=intstep;

//System.out.println("this.filePos="+this.filePos+"||ret="+ret);

returnret;}

publiclongparseLong(byte[]fsnBytes){

long

ret=FsnTools.demarshallintLittle(fsnBytes,filePos,stringstep);

this.filePos+=stringstep;

returnret;

}

publicbyte[]parseByte(byte[]fsnBytes,intlength){

byte[]ret=FsnTools.convertByteMarshall(fsnBytes,filePos,length);

this.filePos+=length;

returnret;

}

}

packagebean;

publicclassFsnBody{

privateStringDateStr;//验钞启动日期

privateStringTimeStr;//验钞启动时间

/**日期+时间

*指定年月日的日期数据的产生算法为:

Date=((Year-1980)<<9)+(Month<<5)+Day

其中:

Year为年份,大于等于1980;Month为月份;Day为日;

指定时分秒的时间数据产生算法为:

Time=(Hour<<11)+(Minute<<5)+

(Second>>1)

其中:

0≤Hour<24,0≤Minute<60,0≤Second<60

*/

privateStringDateTime;//验钞启动日期+时间

privateintTfFlag;//真假币标志,0为假币或可疑币,1为真币,2为残币(清分

机适用),3为旧币(清分机适用);

privateStringErrorCode;//表示最多3组假币特征码(特征码有12种,分别为

1,2,3,4,5,6,7,8,9,10,11,12),真币时填0;如果只有一组特征码,把特征码填在

ErrorCode[0],则其余两组填0;如果有两组特征码,把特征码填在ErrorCode[0]和

ErrorCode[1],剩余的一组填0

privateStringMoneyFlag;//币种标志,最多4位大写ASCII英文字母,不足4

位的其余位填0:

CNY:

人民币

privateintVer;//年版或版本号标志;人民币用作年版标志,值填0,1,2,分

别代表1990,1999,2005三个年版,可根据实际情况扩充;其余币种填9999(表示不考虑

年版);

privateintValuta;//币值,最大币值为50000

privateintCharNum;//冠字号码字符数,指明存储在数组SNo的号码个数;

privateStringSno;//存放识别的冠字号码,每个数组元素存放一位号码(ASCII

字符),最多12位,不足12位的其余位填0;

privateStringMachineSno;//机具编号,必须为24位,每个数组元素存放一位

ASCII字符,不足24位的其余位填0;

privateintReserve1;//保留字1

privateintRecordNum;//冠字号信息在Fsn文件中的行号,从1开始

privatebyte[]ImageBytes;//冠字号信息的图片数据字节数组,保存的原始格

式,未转换

privateStringImgStr;//图片压缩后的字符串

privateStringaccNo="";//冠字号信息产生的账号,Atm等自助存取款机才会有此值

publicStringgetDateStr(){

returnDateStr;}

publicvoidsetDateStr(StringdateStr){

DateStr=dateStr;}

publicStringgetTimeStr(){

returnTim

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2