2

メモリにアクセスするコードを書いたところです。CheatEngineでアドレス(コード)を確認し、で印刷しましたがSystem.out、違います。長い値であることはわかっていますが、16進数では、値2は00000002(CheatEngineでの結果)であり、Javaで844287491178496を取得します。何故ですか?値をアドレスからに変換するにはどうすればよいintですか?さらに重要なのは、Javaを使用してメモリから読み取ったばかりの長い値は何ですか?これが私のコードです:

import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class Memory2 {
    public static void main(String args[]){
        Unsafe unsafe = getUnsafe();
        long address = 0x002005C;
    unsafe.getAddress(address);
    System.out.println(unsafe.getAddress(address));
}

public static Unsafe getUnsafe() {
try {
        Field f = Unsafe.class.getDeclaredField("theUnsafe");
            f.setAccessible(true);
        return (Unsafe)f.get(null);
    } catch (Exception e) {}
        return null;
}
}
4

2 に答える 2

3

javaのlongは8バイトであり、dwordではありません。CheatEngineからの値は4バイトのようです。違いはそれだけかもしれないと思います。0000000200000000の16進数は8589934592です。CheatEngineでチェックしている4バイトを超えるバイトは、Javaが示している値を説明している可能性があります。

于 2012-12-04T19:34:29.117 に答える
1

sun.misc.Unsafeのソースから

/**
 * Fetches a native pointer from a given memory address.  If the address is
 * zero, or does not point into a block obtained from {@link
 * #allocateMemory}, the results are undefined.
 *
 * <p> If the native pointer is less than 64 bits wide, it is extended as
 * an unsigned number to a Java long.  The pointer may be indexed by any
 * given byte offset, simply by adding that offset (as a simple integer) to
 * the long representing the pointer.  The number of bytes actually read
 * from the target address maybe determined by consulting {@link
 * #addressSize}.
 *
 * @see #allocateMemory
 */
 public native long getAddress(long address);

つまり、32ビットJVMでは32ビット(符号なしの値として)を読み取り、64ビットJVMでは64ビットを読み取ります。

注:ほとんどの64ビットJVMは、一般的なヒープサイズに32ビット参照を使用します。

于 2012-12-05T09:46:26.503 に答える