通常,您甚至没有做任何特定于 C# 的事情,而是做基本的 C 指针算法。
遍历数据块并在数据类型之间执行转换的最简单方法是使用com.sun.jna.Memory
而不是byte[]
. 您可以使用Pointer.share(long offset)
来执行指针运算(结果是原始指针偏移量的请求量)。Pointer.write()
您可以使用各种或Pointer.readXXX()
变体读取和写入本机内存。
您可以使用 a 作为基地址来初始化 Java 端Structure
对象Pointer
,只需记住显式调用Structure.read()
以将本机内存同步到 Java。
一些例子,来自你的馅饼:
Memory data = ...;
// mzH = *(MZHeader*) dPtr;
MZHeader mzH = new MZHeader(data);
mzH.read(); // or put this in the MZHeader(Pointer) ctor
// peH = *(PE_Header*)&dPtr[mzH.offsetToPE];
PE_Header peH = new PE_Header(data.share(mzH.offsetToPE));
peH.read(); // or put this in the PE_Header(Pointer) ctor
// peXH = *(PE_ExtHeader*)&dPtr[mzH.offsetToPE + sizeof(PE_Header)];
PE_ExtHeader peXH = new PE_ExtHeader(data.share(mzH.offsetToPE + peH.size()));
peXH.read(); // or put this in the PE_ExtHeader(Pointer) actor
我想你可以从那里得到这个想法......
编辑
Pointer p = new Memory();
byte[] data = ...;
// Copy into Memory from data
p.write(0, data, 0, data.length);
// Copy out of Memory into data
p.read(0, data, 0, data.length);