主程序
来源:互联网 发布: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;
}