【问题标题】:Read a byte from Intptr从 Intptr 读取一个字节
【发布时间】:2010-03-10 23:09:45
【问题描述】:

我有一个 Intptr 的情况,我有一个自己的结构,它由 4 个字节组成。我想从 Intptr 读取 4 个字节到我的这个结构中。但我想单独填充结构中的 4 个字节。像

mystruct obj = new mystruct().

obj.byte2 = "从 Myintptr 读取第一个字节"
obj.byte1 = "从 MyIntptr 读取下一个字节"

这可能吗?

其中一种方法可能是我首先使用 Marshal.copy() 将整个内容读入字节数组,然后执行复制到 obj 的第二步。 但我很好奇我还有另一种方法

【问题讨论】:

  • 您要从 IntPtr 指向的内存中复制字节,还是从 IntPtr 的值复制字节?
  • 还要注意 IntPtr 在 64 位系统上是 8 个字节。

标签: c#


【解决方案1】:

你在寻找这样的东西吗?

obj.byte1 = System.Runtime.InteropServices.Marshal.ReadByte(ip, 0);
obj.byte2 = System.Runtime.InteropServices.Marshal.ReadByte(ip, 1);

【讨论】:

  • 这会从 IntPtr 指向的内存中复制字节。 OP 是否需要 IntPtr 的这个或实际的“值”字节?
  • 我想读取 IntPtr 指向的值。这看起来像我想要的。我会尝试并再次确认它是否有效(目前卡在其他地方阻碍了进一步的进展:()
【解决方案2】:

如果值在 IntPtr 中,您可以将 ptr 转换为 Int32,然后选择字节。 (请记住,在 64 位系统上,IntPtr 将是 8 个字节而不是 4 个字节)

IntPtr ptr = ...;
int val = (int)ptr;
byte[] bytes = BitConverter.GetBytes(val);

byte b1 = (byte)(val >> 24);
byte b2 = (byte)(val >> 16);
byte b3 = (byte)(val >> 8);
byte b4 = (byte) val;

【讨论】:

  • int val = (int)ptr;将从指针中复制值并将其分配给新的值类型结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多