java - Reading .class file -


i'm trying learn how read java class file using c++. can me figure out why accessflag prints 0? lowest value can print 0x00001. think i'm reading constant pool table wrong i'm not sure wrong it. ideas? following: http://www.murrayc.com/learning/java/java_classfileformat.shtml

so far got:

#include <iostream> #include <fstream> #include <vector>  template <typename t> t readpointer(char*& pointer) {     t result = *(reinterpret_cast<t*>(pointer));     pointer += sizeof(t);     return result; }  struct constantpool {     int type;     std::string name;     constantpool*  arg1;     constantpool*  arg2;     short index1, index2;     std::string  strvalue;     int   intvalue;     std::int64_t  longvalue;     float floatvalue;     double  doublevalue;      constantpool() {}     constantpool(char* &pointer) {this->read(pointer);}     void read(char* &pointer); };  void constantpool::read(char* &pointer) {     switch(type = static_cast<int>(readpointer<std::uint8_t>(pointer)))     {         case 1:         {             name = "ascii";             int length = readpointer<short>(pointer);             while (length > 0)             {                 char c = readpointer<char>(pointer);                 strvalue += c;                 length--;             }         }         break;          case 2:         {             name = "unicode";             int length = readpointer<short>(pointer);             while (length > 0)             {                 char c = readpointer<char>(pointer);                 strvalue += c;                 length--;             }         }         break;          case 3:             name = "int";             intvalue = readpointer<double>(pointer);             break;          case 4:             name = "float";             floatvalue = readpointer<float>(pointer);             break;          case 5:             name = "long";             longvalue = readpointer<long>(pointer);             break;          case 6:             name = "double";             doublevalue = readpointer<double>(pointer);             break;          case 7:             name = "class";             index1 = readpointer<short>(pointer);             index2 = -1;             break;          case 8:             name = "string";             index1 = readpointer<short>(pointer);             index2 = -1;             break;          case 9:             name = "field reference";             index1 = readpointer<short>(pointer);             index2 = readpointer<short>(pointer);             break;          case 10:             name = "method reference";             index1 = readpointer<short>(pointer);             index2 = readpointer<short>(pointer);             break;          case 11:             name = "interface reference";             index1 = readpointer<short>(pointer);             index2 = readpointer<short>(pointer);             break;          case 12:             name = "name , type";             index1 = readpointer<short>(pointer);             index2 = readpointer<short>(pointer);             break;     } }  typedef struct {     int magicnumber;     short minorversion;     short majorversion;     short constantpoolcount;  } classfile;  int main() {     std::fstream file("animal.class", std::ios::in | std::ios::binary);     if (file.is_open())     {         file.seekg(0, std::ios::end);         std::vector<std::uint8_t> data(file.tellg());         char* ptr = reinterpret_cast<char*>(&data[0]);         file.seekg(0, std::ios::beg);         file.read(ptr, data.size());          /**check magic number.**/         classfile baseinfo = readpointer<classfile>(ptr);         if (baseinfo.magicnumber == 0xbebafeca)         {             std::cout << "magic number:    " << baseinfo.magicnumber << "\n";             std::cout << "minor number:    " << baseinfo.minorversion << "\n";             std::cout << "major number:    " << baseinfo.majorversion << "\n";             std::cout << "const pool size: " << baseinfo.constantpoolcount << "\n";             std::vector<constantpool> constpool;              (int = 0; < baseinfo.constantpoolcount - 1; ++i)             {                 constpool.push_back(constantpool(ptr));                 if (constpool.back().type == 5 || constpool.back().type == 6)                     ++i;             }              std::cout << "access flags:   " << readpointer<short>(ptr);         }          file.close();     } } 

one mistake

intvalue = readpointer<double>(pointer); 

you're reading double instead of int, throw else off.

of course code has plenty of other issues too. example, you're ignoring alignment , struct padding issues.


Comments

Popular posts from this blog

basic authentication with http post params android -

vb.net - Virtual Keyboard commands -

css - Firefox for ubuntu renders wrong colors -