Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这与Java中的Marshal.ReadIntPtr(IntPtr)(C#)是等价的吗?_C#_Java_Pointers_Marshalling - Fatal编程技术网

什么';这与Java中的Marshal.ReadIntPtr(IntPtr)(C#)是等价的吗?

什么';这与Java中的Marshal.ReadIntPtr(IntPtr)(C#)是等价的吗?,c#,java,pointers,marshalling,C#,Java,Pointers,Marshalling,Java中的Marshal.ReadIntPtr(IntPtr)(C#)与什么等效?看看下面的类 sun.misc.Unsafe 该类中感兴趣的方法有: public native long getAddress(long address); public native void putAddress(long address, long value); public native long allocateMemory(long size); public native long reall

Java中的
Marshal.ReadIntPtr(IntPtr)
(C#)与什么等效?

看看下面的类

sun.misc.Unsafe
该类中感兴趣的方法有:

public native long getAddress(long address);
public native void putAddress(long address, long value);
public native long allocateMemory(long size);
public native long reallocateMemory(long l, long l1);
public native void setMemory(long l, long l1, byte b);
public native void copyMemory(long l, long l1, long l2);
以下是其使用示例:

import java.lang.reflect.Field;
import sun.misc.Unsafe; 
public class Direct {

        public static void main(String... args) {
            Unsafe unsafe = null;

            try {
                Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
                field.setAccessible(true);
                unsafe = (sun.misc.Unsafe) field.get(null);
            } catch (Exception e) {
                throw new AssertionError(e);
            }

            long value = 12345;
            byte size = 1;
            long allocateMemory = unsafe.allocateMemory(size);
            unsafe.putAddress(allocateMemory, value);
            long readValue = unsafe.getAddress(allocateMemory);
            System.out.println("read value : " + readValue);
        }
    }

没有Marshal.IntPtr方法。。。你指的是ReadIntPtr还是WriteIntPtr?非常抱歉,我指的是Marshal.ReadIntPtr(IntPtr)方法为什么在Java中需要这个?我必须将一些代码从c#翻译成Java。我可以翻译这个片段:
stringa=Marshal.PtrToStringAnsi((IntPtr)ptr)。但是这个-不是:
string a=Marshal.PtrToStringAnsi(Marshal.ReadIntPtr((IntPtr)ptr))在Java中,非托管内存究竟从何处获得?这就像在java中询问如何取消对指针的引用一样——没有任何意义。显然,您可以使用nio缓冲区,但是如果我们有一个结构(c++):struct Test{char string1;//“Test”,那么它已经有了常用的readXXX方法(而且我认为Java中没有任何简单的方法来了解本机指针大小(如果VM使用的是压缩的Oops呢?)//4字节int-value1;//23//4字节char*label;//*label==“str”//4字节};如果指向此结构的指针是“p”(com.sun.jna.pointer),则与Marshal.ReadIntPtr(IntPtr)等价的是p.getPointer(8)