正在读取.class文件
Reading .class file
我正在学习如何使用C++读取Java类文件。有人能帮我弄清楚为什么AccessFlag打印0吗?它可以打印的最低值是0x00001。所以我认为我把常数池表读错了,但我不确定它出了什么问题。有什么想法吗?我一直在关注:http://www.murrayc.com/learning/java/java_classfileformat.shtml
到目前为止,我得到了:
#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 And 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;
for (int I = 0; I < 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();
}
}
一个错误是
intValue = ReadPointer<double>(Pointer);
你读的是double而不是int,这会把其他的东西都扔掉。
当然,您的代码也有很多其他问题。例如,您完全忽略了对齐和结构填充问题。
相关文章:
- 如何将class.cpp和class.hpp编译为一个.o文件
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- 头文件出现问题; "redefinition of class"
- 对 Class::Class() 和函数在一个文件中的未定义引用? c++
- 试图将两个类放在同一命名空间中的单独文件中,但只有#1个#Class类作品
- "日期":'class'类型重新定义:错误(日历.cpp文件错误)
- 如何在源文件中定义类并将其声明在标题文件中(而不必使用`class :: method'语法定义类方法)
- 分成 .h 和 .cpp 文件时"prototype does not match any class"错误
- 头文件中是否定义了一个很长的Class函数成员
- 保存并加载 QList<Class*> 到文件
- 让一个.cpp文件与一个class.cpp和一个class.h文件通信
- 类标头和在我的类.cpp文件中使用构造函数:"error: class 'Test' does not have any field named 'counter'"
- Clang - 删除某些文件的"conversion function converting <A> to base class <B> will never be used"
- 如何在C ++文件中使用".class"或".jar" Java文件(无需转换)?
- 日食C++。包含带有类的 .h 文件。 "Symbol '[class]' could not be resolved"
- 正在读取.class文件
- 错误:对class::method(主、头文件、源代码)的未定义引用
- 在linux /sys/class/gpio中写入文件的错误
- "error C2653: System is not a class or a namespace name"在窗体头文件、可视C++
- 头文件"class X;"是什么意思?