コード例 #1
0
	//加载字典
	public int init(String modelfile){
		int headersize = sizeof(ModelHeader);
	    int subsize = sizeof(FeatureHeader);
	    int shortsize = sizeof(short);

	    //std::ifstream inputfile;
	    //inputfile.open(modelfile.c_str(), std::ios::binary);
	    File mapFile = new File(modelfile);
	    FileInputStream inputfile = new FileInputStream(mapFile);
	    
	    if(!mapFile.exists())
	    {
	        System.out.println("map file no exits:"+modelfile);
	        return -1;
	    }
	    
	    long filesize = mapFile.length();//filesize byte
	    if(filesize < headersize)
	    {
	        inputfile.close();
	        System.out.println("Invalid model file:"+modelfile);
	        //printf("Invalid model file: %s\n", modelfile.c_str());
	        return -1;
	    }
	    
	    try
	    {
	        ModelHeader header = new ModelHeader();
	        
//读取文件头===========================================================
	        //inputfile.read((char*)&header, headersize);
	        
	        boolean ok = true;
	        char[] sign = header.getSign(); 
	        if(sign[0] != 'S'
	                || sign[1] != 'H'
	                || sign[2] != 'W'
	                || sign[3] != 'R') ok = false;

	        if(ok)
	        {
	            if(header.getWidth() < 10
	                    || header.getHeight() < 10
	                    || header.getPointdist() < 1
	                    || header.getCount() < 0) ok = false;
	        }

	        if(ok)
	        {
	            if(filesize - (header.getCount()) * subsize < 0) ok = false;
	        }

	        if(ok)
	        {
	            char lang_temp[] = new char[8];
	            //memset(lang_temp, 0, 8);
	            //memcpy(lang_temp, &(header.getLang()[0]), 6);

	            lang = new String(lang_temp);
	            ver = header.getVer();
	            type = header.getType();
	            pointdist = header.getPointdist();
	            width = header.getWidth();
	            height = header.getHeight();

	            int count = header.getCount();
	            features = new ArrayList<Feature>();
	            for(int i=0; i<count; i++)
	            {
	                if(filesize - subsize < 0)
	                {
	                    System.out.println("Invalid model file: Sub header is not valid.");
	                	//printf("Invalid model file: Sub header is not valid.\n");
	                    ok = false;
	                    break;
	                }

	                boolean subok = true;
	                FeatureHeader subheader = new FeatureHeader();
	                inputfile.read((char*)&subheader, subsize);

	                if(subheader.count <= 0
	                        || subheader.strokecount <= 0
	                        || subheader.word[0] == '0')
	                {
	                	System.out.println("Invalid model file: Sub header is not valid.");
	                    //printf("Invalid model file: Sub header is not valid.\n");
	                    subok = false;
	                    ok = false;
	                    break;
	                }

	                if(subok)
	                {
	                    filesize = filesize - subsize;
	                    if(filesize - (subheader.count) * shortsize < 0)
	                    {
	                    	System.out.println("Invalid model file: Feature data is not valid.");
	                        //printf("Invalid model file: Feature data is not valid.\n");
	                        subok = false;
	                        ok = false;
	                        break;
	                    }

	                    char newword[] = new char[8];
	                    memset(newword, 0, 8);
	                    memcpy(newword, &(subheader.word[0]), 4);

	                    Feature feature;
	                    feature.strokecount = subheader.strokecount;
	                    feature.word = newword;

	                    for(int j = 0; j < subheader.count; j++)
	                    {
	                        short sv;
	                        inputfile.read((char*)&sv, shortsize);
	                        int fv = sv;
	                        feature.feature.push_back(fv);
	                    }

	                    features.add(feature);
	                    filesize = filesize - (subheader.count) * shortsize;
	                }

	                if(filesize <= 0)
	                {
	                    if(filesize < 0) ok = false;
	                    break;
	                }
	            }
	            if(!ok) features = new ArrayList<Feature>();
	        }
	    }
	    catch(Exception e)