主程序

来源:互联网 发布:mac安装windows版本qq 编辑:程序博客网 时间:2024/06/11 21:52
  • // use ansi c,
    // HEC = Human Engineered Computer Company
    //做这个程序的目的是实现java.exe的功能
    //也就是对ClassFile文件(字节码文件进行处理)
    //首先需要
    #include "stdio.h"
    #include "iostream.h"
    #include "stdlib.h"
    #include "jni_md.h"
    #include "jni.h"
    #include "vm.h"
    #include "string.h"
    #include "SemanticCheck.h"
    #include "ByteCodeCheck.h"
    #include "SingleReferenceCheck.h"
    #include "Method_info.h"

  • void main(int argc, char *argv[]){

  • // char bufClassFile[1024];
        printf("hello,java virtual machine/n");
  •  FILE *fp=fopen("c://Test.class","rb");
     if(fp==NULL) //C中是NULL, java中是null(null,true,false是literal)
     {
      printf("can't open file/n");
      exit(0);
     }
  •     int fileSize=-1;
        while(!feof(fp)){
        fgetc(fp);
        ++fileSize;
     }
     rewind(fp);
     printf("The ClassFile is %d Bytes/n",fileSize);
       
     if(fileSize==0){
         printf("Error,ByteCode File has zero size/n");
         exit(0);
     }
       

  •     Byte buf[2048]={0};
     int k=sizeof(fp);
     printf("k=%d/n",k); //指针占4个字节
     printf("sizeof(buf)=%d/n",sizeof(buf));
  • //第一次检验
    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
     flagJavaMagic=getJavaMagic(fp); //0xCAFE BABE (4B)
        if(flagJavaMagic==false){
         printf("ClassFile format is wrong!/n");
      exit(0);
     }
     
     
     flagMinorVersion=getMinorVersion(fp); // 00 03 (2B)
        if(flagMinorVersion==false){      
          printf("ClassFile format is wrong!");
       exit(0);
     }
  •     flagMajorVersion= getMajorVersion(fp); // 00 2D (2B)
        if(flagMajorVersion==false){
          printf("ClassFile format is wrong!");
          exit(0);
     } 

  • //*************************************************************************** 
     //常量池
     printf("Below is about ConstantPool Information/n");
     constantPoolCount=getConstantPoolCount(fp); //constant_pool_count (2B)
        int i=0;
     for( i=0; i<constantPoolCount-1; i++){
           
      printf("/nconstant_pool_index=%d,",i+1);
         constantPoolAnalyze(fp);
     }
       
     printf("/nEnd ConstantPool Information/n");
     
       getAccessFlags(fp);  // access_flags是class/interface的访问权限
       
       getThisClass(fp);    //指乡向constant_pool的有效索引值
      
       getSuperClass(fp);   // 0或者指向constant_pool的有效索引值

  • /*1*************************************************************/
       int interfaceCount=getInterfaceCount(fp);
       if(interfaceCount>0){
         // 处理
       }
       else
        printf("/n the file has no interface. /n");
       // printf("/ninterface_count=%d/n",interfaceCount);
    /*1*************************************************************/  
  •  
  • /*2************************************************************/
      int fields_count=getFieldsCount(fp);
  •   if(fields_count>0){
       //????处理
      }
  •   else
       // printf("/nfields_count=%d/n",fields_count);
       int methods_count=getMethodsCount(fp);
  • /*2**************************************************************/

  • /*3***************************************************************/
      if(methods_count>0){
         Method_info mInfo;
      mInfo.getMethodAccessFlags(fp);
         mInfo.getMethodNameIndex(fp);
      mInfo.getDescriptorIndex(fp);
      mInfo.getAttributesCount(fp);
     
      }
      else
          attributes_count=getAttributesCount(fp);
    /*****************************************************************/
      if(attributes_count>0){
     
      }
      else{
     
     
      }
  • //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  

  •   // 第二次检验
    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    SemanticCheck sCheck;
  •  
  •  

  •  // 第三次检验
    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    ByteCodeCheck bCheck;
  •  
  •  

  • //第四次检验
    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    SingleReferenceCheck rCheck;

  • printf("sizeof(short)=%d/n",sizeof(short));
    printf("sizeof(Byte)=%d/n",sizeof(Byte));
  •     return;
  • } // end main()
  •  
  •  

  • bool getJavaMagic(FILE *fp1){ //0x CA FE BA BE (4B)
        char *temp="CAFEBABE";
     char *str[4];
     int offset=0;
        Byte bufJavaMagic[4];
        fread(bufJavaMagic,sizeof(char),4,fp1);
         for(int i=0; i<4; i++){
         str[i]=ByteToHexidecimal(bufJavaMagic[i]);
     }
      strJavaMagic=str[0];
      for(i=1; i<4;i++)
       strcat(strJavaMagic,str[i]);
  •  printf("/n");
     printf("Java Magic=%s/n/n",str[0]);
       
        int k=strcmp(str[0],temp);
     if(k==0)
             return true;
        else
       return false;
    }

  • bool getMinorVersion(FILE *fp1){ //0x 00 03
     char *temp="0003";
     char *strMinor[2];
        int offset=4;
     Byte bufMinorVersion[2]={0}; // initialization
        fread(bufMinorVersion,sizeof(char),2,fp1);
     for(int i=0; i<2; i++){
         strMinor[i]=ByteToHexidecimal(bufMinorVersion[i]); 
     }
  •  strMinorVersion=strMinor[0];
     strcat(strMinorVersion,strMinor[1]);
     printf("Minor_Version=%s/n/n",strMinor[0]);
     int k=strcmp(strMinor[0],temp);
     if(k==0)
      return true;
     else
      return false;
  • }
  • bool  getMajorVersion(FILE *fp1){ // 0x 00 2D
     char *temp="002D";
        char *strMajor[2];
     Byte bufMajorVersion[2]={0}; // initialization
     int offset=6;
     fread(bufMajorVersion,sizeof(char),2,fp1);
     for(int i=0; i<2;i++){
        strMajor[i]=ByteToHexidecimal(bufMajorVersion[i]);
     }
        strMajorVersion=strMajor[0];
     strcat(strMajorVersion,strMajor[1]);
     printf("MajorVersion=%s/n/n",strMajor[0]);
     int k=strcmp(strMajor[0],temp);
           return true;
     return false;
    }

  • char* ByteToHexidecimal(Byte num){
     char a[2];
     Byte number[2];
     Byte low=num%16;
     number[1]=low;
  •  num/=16;
     Byte high=num%16;
        number[0]=high;
  •  for(int i=0; i<2; i++){
      switch(number[i]){
            case 0:   a[i]= '0'; break;
         case 1:   a[i]= '1'; break;
         case 2:   a[i]= '2'; break;
            case 3:   a[i]= '3'; break;
            case 4:   a[i]= '4'; break;
            case 5:   a[i]= '5'; break;
            case 6:   a[i]= '6'; break;
            case 7:   a[i]= '7'; break;
            case 8:   a[i]= '8'; break;
         case 9:   a[i]= '9'; break;
            case 10:  a[i]= 'A'; break;
         case 11:  a[i]= 'B'; break;
         case 12:  a[i]= 'C'; break;
            case 13:  a[i]= 'D'; break;
         case 14:  a[i]= 'E'; break;
            case 15:  a[i]= 'F'; break;
      default:
        break;
      }
     }
        char *str=(char*)malloc(2*sizeof(char));
        strcpy(str,a);  //not str=a; as a is a local variable
     *(str+2)='/0';
        return  str;
    }
  • int getConstantPoolCount(FILE *fp1){
     // 0x XXXX
        char *strConstantpool[2];
        Byte bufConstantPoolCount[2];
        fread(bufConstantPoolCount,sizeof(char),2,fp1);
    // printf("%d,%d/n",bufConstantPoolCount[0],bufConstantPoolCount[1]);
        for(int i=0;i<2;i++){
            strConstantpool[i]=ByteToHexidecimal(bufConstantPoolCount[i]);
        }
       strConstantPoolCount=strConstantpool[0];
       strcat(strConstantPoolCount,strConstantpool[1]);
     int k=HexidecimalToDecimal(strConstantPoolCount);
      printf("/nconstantPoolCount=%d/n",k);
      return k;
    }
  • int  HexidecimalToDecimal(char *str){
       int constantPoolCount=0; // initialization
       char num[4];
       int a[4]; //sizeof(a)=sizeof(int)*4=16
       int k=strlen(str);
       for(int i=0; i<k; i++){
            num[i]=*(str+i);
       }
       for(i=0; i<4; i++){
        switch(num[i]){
            case '0':  a[i]=0;   break;
         case '1':  a[i]=1;   break;
         case '2':  a[i]=2;   break;
         case '3':  a[i]=3;   break;
         case '4':  a[i]=4;   break;
         case '5':  a[i]=5;   break;
               case '6':  a[i]=6;   break;
         case '7':  a[i]=7;   break;
         case '8':  a[i]=8;   break;
         case '9':  a[i]=9;   break;
         case 'A':  a[i]=10;  break;
         case 'B':  a[i]=11;  break;
         case 'C':  a[i]=12;  break;
         case 'D':  a[i]=13;  break;
         case 'E':  a[i]=14;  break;
         case 'F':  a[i]=15;  break;
         default:
           break;
        }
       }
       constantPoolCount=((a[0]*16+a[1])*16+a[2])*16+a[3];
     
       return constantPoolCount;
    }

  • void constantPoolAnalyze(FILE *fp1){ //tag占1B
      
     int j=0;
     int length=0;
        Byte bufTag[1]; 
     fread(bufTag,sizeof(char),1,fp1);
        printf("  tag=%d/n",bufTag[0]);
        switch(bufTag[0]){
         case 1:
       char *strConstantUtf8Info;
       char *str1[3];
                Byte constantUtf8Info[2];
       fread(constantUtf8Info,sizeof(char),2,fp1);
       for(j=0; j<2; j++){
           str1[j]=ByteToHexidecimal(constantUtf8Info[j]);
       }
       strConstantUtf8Info=str1[0];
       for(j=1; j<2; j++)
        strcat(strConstantUtf8Info,str1[j]);
           printf("ConstantUtf8Info=%s/n",strConstantUtf8Info);
                 length=HexidecimalToDecimal(strConstantUtf8Info);
        char *strx[100];         //bug 1
        char bytesBuf[100];      //bug 2
        fread(bytesBuf,sizeof(char),length,fp1);
        printf("ConstantUtf8Info's Length=%d/n",length);
                 for(j=0;j<length;j++)
         strx[j]=ByteToHexidecimal(bytesBuf[j]);
                
        strConstantUtf8Info=strx[0];
        for(j=1; j<length; j++)
         strcat(strConstantUtf8Info,strx[j]);
                  printf("ConstantUtf8Info=%s/n",strConstantUtf8Info);
       break;
  •      case 3:
                char  *strConstantIntegerInfo;
       char  *str3[4];
                Byte constantIntegerInfo[4];
       fread(constantIntegerInfo,sizeof(char),4,fp1);
       for(j=0; j<4; j++){
           str3[j]=ByteToHexidecimal(constantIntegerInfo[j]);
       }
                strConstantIntegerInfo=str3[0];
       for(j=1; j<4; j++)
        strcat(strConstantIntegerInfo,str3[j]);
       printf("ConstantIntegerInfo=%s/n",strConstantIntegerInfo);
       break;
  •   case 4:
       char *strConstantFloatInfo;
                char *str4[4];
                Byte constantFloatInfo[4];
       fread(constantFloatInfo,sizeof(char),4,fp1);
       for(j=0; j<4; j++){
           str4[j]=ByteToHexidecimal(constantFloatInfo[j]);
       }
                strConstantFloatInfo=str4[0];
       for(j=1; j<4; j++)
        strcat(strConstantFloatInfo,str4[j]);
       printf("ConstantFloatInfo=%s/n",strConstantFloatInfo);
       break;
  •   case 5:
                Byte constLongInfo[8];
       fread(constantFloatInfo,sizeof(char),8,fp1);
       break;
  •   case 6:
                Byte constantDoubleInfo[8];
       fread(constantDoubleInfo,sizeof(char),8,fp1);
       break;
  •   case 7:
       char *strConstantClassInfo;
       char *str7[2];
       Byte  constantClassInfo[2];
                fread(constantClassInfo,sizeof(char),2,fp1);
       for(j=0; j<2; j++){
          str7[j]=ByteToHexidecimal(constantClassInfo[j]);
       }
       strConstantClassInfo=str7[0];
                strcat(strConstantClassInfo,str7[1]);
       printf("ConstantClassInfo=%s/n",strConstantClassInfo);
          break;
  •   case 8:
       char *strConstantStringInfo;
       char *str8[2];
                Byte constantStringInfo[2];
       fread(constantStringInfo,sizeof(char),2,fp1);
       for(j=0; j<2; j++){
           str8[j]=ByteToHexidecimal(constantStringInfo[j]);
       }
       strConstantStringInfo=str8[0];
       strcat(strConstantStringInfo,str8[1]);
       printf("ConstantStringInfo=%s/n",strConstantStringInfo);
       break;
  •   case 9:
       char *strConstantFieldrefInfo;
       char *str9[4];
                Byte constantFieldrefInfo[4];
       fread(constantFieldrefInfo,sizeof(char),4,fp1);
       for(j=0; j<4; j++){
           str9[j]=ByteToHexidecimal(constantFieldrefInfo[j]);
       }
       strConstantFieldrefInfo=str9[0];
       for(j=1; j<4; j++){
           strcat(strConstantFieldrefInfo,str9[j]);
       }
           printf("ConstantFieldrefInfo=%s",strConstantFieldrefInfo); 
       break;
  •   case 10:
       char *strConstantMethodrefInfo;
       char *str10[4];
                Byte constantMethodrefInfo[4];
       fread(constantMethodrefInfo,sizeof(char),4,fp1);
       for(j=0; j<4; j++){
          str10[j]=ByteToHexidecimal(constantMethodrefInfo[j]);
       }
       strConstantMethodrefInfo=str10[0];
       for(j=1; j<4; j++)
        strcat(strConstantMethodrefInfo,str10[j]);
       printf("ConstantMethodrefInfo=%s/n",strConstantMethodrefInfo);
       break;
  •   case 11:
                Byte constantInterfaceMethodrefInfo[4];
       fread(constantInterfaceMethodrefInfo,sizeof(char),4,fp1);
       break;
  •   case 12:
       char *strConstantNameandTypeInfo;
       char *str12[4];
                Byte constantNameandTypeInfo[4];
       fread(constantNameandTypeInfo,sizeof(char),4,fp1);
       for(j=0; j<4; j++){
           str12[j]=ByteToHexidecimal(constantNameandTypeInfo[j]);
       }
       strConstantNameandTypeInfo=str12[0];
       for(j=1; j<4; j++)
        strcat(strConstantNameandTypeInfo,str12[j]);
       printf("ConstantNameandTypeInfo=%s/n",strConstantNameandTypeInfo);
       break;
  •   default:
       printf("ClassFile format is wrong!/n");
       break;
     }
  •     return;
    }
  • int getAccessFlags(FILE *fp1){
       char *strAccessFlags[2];
       char bufAccessFlags[2];
       fread(bufAccessFlags,sizeof(char),2,fp1);
       for(int j=0; j<2; j++){
            strAccessFlags[j]=ByteToHexidecimal(bufAccessFlags[j]);
       }
        access_flags=strAccessFlags[0];
     strcat(access_flags,strAccessFlags[1]);
     printf("/naccess_flags=%s/n",access_flags);
  •    return 1;
    }
  • int getThisClass(FILE *fp1){
       char *strThisClass[2];
       char bufThisClass[2];
       fread(bufThisClass,sizeof(char),2,fp1);
       for(int j=0; j<2; j++){
            strThisClass[j]=ByteToHexidecimal(bufThisClass[j]);
       }
        this_class=strThisClass[0];
     strcat(this_class,strThisClass[1]);
     printf("/nthis_class=%s/n",this_class);
  •    return 1;
    }
  • int getSuperClass(FILE *fp1){
       char *strSuperClass[2];
       char bufSuperClass[2];
       fread(bufSuperClass,sizeof(char),2,fp1);
       for(int j=0; j<2; j++){
            strSuperClass[j]=ByteToHexidecimal(bufSuperClass[j]);
       }
        super_class=strSuperClass[0];
     strcat(super_class,strSuperClass[1]);
     printf("/nsuper_class=%s/n",super_class);
  •    return 1;
    }
  • int getInterfaceCount(FILE *fp1){
       char *strInterfaceCount[2];
       char bufInterfaceCount[2];
       fread(bufInterfaceCount,sizeof(char),2,fp1);
       for(int j=0; j<2; j++){
            strInterfaceCount[j]=ByteToHexidecimal(bufInterfaceCount[j]);
       }
        interface_count=strInterfaceCount[0];
     strcat(interface_count,strInterfaceCount[1]);
       printf("/ninterface_count=%s/n",interface_count);
     //把16进制数转化成10进制数
        int k=HexidecimalToDecimal(interface_count);
       return k;
    }

  • int getFieldsCount(FILE *fp1){
       char *strFieldsCount[2];
       char bufFieldsCount[2];
       fread(bufFieldsCount,sizeof(char),2,fp1);
       for(int j=0; j<2; j++){
            strFieldsCount[j]=ByteToHexidecimal(bufFieldsCount[j]);
       }
        fields_count=strFieldsCount[0];
     strcat(fields_count,strFieldsCount[1]);
     printf("/nfields_count=%s/n",fields_count);
        int k=HexidecimalToDecimal(fields_count);
     printf("k=%d/n",k);
       return k;
    }
  • int getMethodsCount(FILE *fp1){
       char *strMethodsCount[2];
       char bufMethodsCount[2];
       fread(bufMethodsCount,sizeof(char),2,fp1);
       for(int j=0; j<2; j++){
            strMethodsCount[j]=ByteToHexidecimal(bufMethodsCount[j]);
       }
        methods_count=strMethodsCount[0];
     strcat(methods_count,strMethodsCount[1]);
     printf("/nmethods_count=%s/n",methods_count);
        int k=HexidecimalToDecimal(methods_count);
       return k;
    }
  • int getAttributesCount(FILE *fp1){
       int j=0;
       char *strAttributesCount[2];
       char  bufAttributesCount[2];
       fread(bufAttributesCount,sizeof(char),2,fp1);
       for(j=0; j<2;j++){
          strAttributesCount[j]=ByteToHexidecimal(bufAttributesCount[j]);
       }
       attributes_counts=strAttributesCount[0];
       strcat(attributes_counts,strAttributesCount[1]);
       int k=HexidecimalToDecimal(attributes_counts);
       return 1;
    }
原创粉丝点击