gpt4 book ai didi

c# - 在 .NET 4.0 之前的 C# 中,是否有一种安全的方法来执行指针运算?

转载 作者:行者123 更新时间:2023-11-30 14:57:29 25 4
gpt4 key购买 nike

我今天晚上发现我写的一些辅助代码是 64 位机器上相当讨厌的 SIGSERV 崩溃的罪魁祸首,原因是将 64 位指针转换为 32 位。

class FastPixelEditor {
Bitmap m_bitmap;
Rectangle m_source;
BitmapData m_bitmapData;
int m_nativePixelPointer;
public FastPixelEditor(Bitmap bitmap, Rectangle source) {
m_bitmap = bitmap;
m_source = source;
m_bitmapData = m_bitmap.LockBits(source,
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
m_nativePixelPointer = m_bitmapData.Scan0.ToInt32();
}
public void SetPixel(int x, int y, Color color) {
int idx = (y - m_source.Top) * m_source.Width +
(x - m_source.Left);
idx *= 4;
Marshal.WriteInt32((IntPtr)(m_nativePixelPointer + idx),
color.ToArgb());
}
public Color GetPixel(int x, int y) {
int idx = (y - m_source.Top) * m_source.Width +
(x - m_source.Left);
idx *= 4;
return Color.FromArgb(Marshal.ReadInt32((IntPtr)(
m_nativePixelPointer + idx)));
}
public void Unlock() { m_bitmap.UnlockBits(m_bitmapData); }
}

崩溃发生在 GetPixel 函数的这一行:

Marshal.ReadInt32((IntPtr)(m_nativePixelPointer + idx))

作为辅助代码,我怀疑强制任何使用此代码的人在他们的项目上设置 /unsafe 编译标志是否明智,但使用 IntPtr.ToInt64() 似乎真的很黑(虽然它可能有效)。

IntPtr.Add似乎正是我所追求的,但这段代码必须以 .NET 2.0 为目标,并且 IntPtr.Add 是在 .NET 4.0 中添加的。

我是被迫在 /unsafe 还是 IntPtr.ToInt64() 之间做出选择,还是有其他选择?

最佳答案

刚刚注意到 Marshall.ReadInt32Marshall.WriteInt32 实际上有允许指定偏移量的重载:

Marshall.ReadInt32(IntPtr ptr, int ofs)

它们在 .NET 2.0 中可用。

关于c# - 在 .NET 4.0 之前的 C# 中,是否有一种安全的方法来执行指针运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20734794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com