From: <le...@us...> - 2008-04-06 11:59:39
|
Revision: 142 http://freepv.svn.sourceforge.net/freepv/?rev=142&view=rev Author: leonox Date: 2008-04-06 04:59:43 -0700 (Sun, 06 Apr 2008) Log Message: ----------- Modified Paths: -------------- freepv/branches/branch_leonox/src/libfreepv/Utils/signatures.cpp Modified: freepv/branches/branch_leonox/src/libfreepv/Utils/signatures.cpp =================================================================== --- freepv/branches/branch_leonox/src/libfreepv/Utils/signatures.cpp 2008-03-15 11:02:11 UTC (rev 141) +++ freepv/branches/branch_leonox/src/libfreepv/Utils/signatures.cpp 2008-04-06 11:59:43 UTC (rev 142) @@ -23,6 +23,7 @@ */ #include "signatures.h" +#include <iostream> namespace FPV{ namespace Utils{ @@ -34,8 +35,8 @@ char png_size=4; short png_sig[]={0x5089, 0x474E, 0x0A0D, 0x0A1A}; //MOV Signature - char mov_size=2; - short mov_sig[]={0x6F6D, 0x766F}; + char mov_size=4; + short mov_sig[]={0x0000, 0x0000, 0x6F6D, 0x766F}; //XML Signature char xml_size=3; short xml_sig[]={0x3F3C, 0x6D78, 0x206C}; @@ -67,22 +68,31 @@ do{ fread(&number,2,1,p_file); - //in case of MOV skip the first 4 bytes. - if(type==2&&i<2) - mov_sig[i]=number; - //std::cerr<<"Lectura:"<<std::hex<<signature[type][i]<<std::endl; - equal=signature[type][i++]^number; - //std::cerr.setf( ios_base::hex ); - //std::cerr<<"Comparada con:"<<std::hex<<number<<std::endl<<std::endl; + //In case of MOV skip the first 4 bytes. + //by asigning the first 4 read bytes + //to the MOV signature + if(type==2&&i<2) mov_sig[i]=number; - }while(!equal&&i<sig_sizes[type]); + //The comparation is made by using a bit XOR operator + //we look for the double implication <->, so the result + //of the XOR operation is negated. + equal=!(signature[type][i++]^number); + + //std::cerr<<"Lecture:"<<std::hex<<signature[type][i]<<std::endl; + //std::cerr<<"Compared with:"<<std::hex<<number<<std::endl<<std::endl; + //std::cerr<<"Equal: "<<std::hex<<equal<<std::endl<<std::endl;*/ + + }while(equal&&i<sig_sizes[type]); - if(!equal){ + if(equal){ + //The signature was found, + //There is no need to keep looking for... break; } + //Check next probable signature. type++; - }while(equal&&type<sig_types_num); + }while(type<sig_types_num); fclose(p_file); @@ -96,58 +106,12 @@ return("XML"); if(type==4) return("DCR"); + + //In other case return Unknown return("Unknown"); } - std::string CheckMagicBytes(const char* filename, std::string type){ - FILE * p_file; - p_file=fopen(filename, "rb"); - short number; - short equal=0; - char i, type_num; - - if(p_file==NULL){ - return "Unknown"; - } - - if(type=="JPG"||type=="JPEG") - type_num = 0; - else if(type=="PNG") - type_num = 1; - else if(type=="QTVR") - type_num = 2; - else if(type=="XML") - type_num = 3; - else if(type=="DCR") - type_num = 4; - else - type_num = 5; - - i=0; - do{ - if(type_num>4) break; - fread(&number,2,1,p_file); - - //in case of MOV skip the first 4 bytes. - if(type_num==2&&i<2) - mov_sig[i]=number; - //std::cerr<<"Lecture:"<<std::hex<<signature[type_num][i]<<std::endl; - equal=signature[type_num][i++]^number; - //std::cerr.setf( ios_base::hex ); - //std::cerr<<"Compared with:"<<std::hex<<number<<std::endl<<std::endl; - - }while(!equal&&i<sig_sizes[type_num]); - - fclose(p_file); - - if(!equal) - return type; - else - return type="Unknown"; - - } - }//Utils }//namespace This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |